ARKit平面检测和可视化无法正常工作

如何解决ARKit平面检测和可视化无法正常工作

我有一个应用程序,我想结合使用React Native,WebView和ARKit。因此,使用此代码,我在彼此之上堆叠了三个视图:

#import "AppDelegate.h"

#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <SDImageCodersManager.h>
#import <SDWebImageWebPCoder/SDImageWebPCoder.h>
#import <WebKit/WebKit.h>
#import "realnote_app-Swift.h"
#import <ARKit/ARKit.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
  [theConfiguration.preferences setValue:@"TRUE" forKey:@"allowFileAccessFromFileURLs"];
  [theConfiguration setValue:@"TRUE" forKey:@"allowUniversalAccessFromFileURLs"];
  UrlHandler *urlHandler = [[UrlHandler alloc] init];
  [theConfiguration setURLSchemeHandler:urlHandler  forURLScheme:@"localhost"];
  WKWebView *webView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds configuration:theConfiguration];
  webView.opaque = false;
  webView.scrollView.backgroundColor = UIColor.clearColor;
  webView.backgroundColor = UIColor.clearColor;
  

  NSURL *urlpath = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html" subdirectory:@"html"];
  urlpath = [urlHandler changeURLSchemeWithNewScheme:@"localhost" forURL:urlpath];
  
  NSURLRequest *nsrequest=[NSURLRequest requestWithURL:urlpath];
  [webView loadRequest:nsrequest];
  
  //ARSCNView *arView = [[ARSCNView alloc] initWithFrame:[UIScreen mainScreen].bounds];
  SceneViewRenderer *sceneViewRenderer = [[SceneViewRenderer alloc] init];
  
  
  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                   moduleName:@"realnote_app"
                                            initialProperties:nil];
  rootView.contentView.backgroundColor = UIColor.clearColor;
  

  rootView.backgroundColor = UIColor.clearColor;

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  
  UIView *holderView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
  holderView.backgroundColor = UIColor.clearColor;
  
  rootView.frame = [UIScreen mainScreen].bounds;
  [holderView insertSubview:sceneViewRenderer.view belowSubview:rootView];
  [holderView insertSubview:webView belowSubview:rootView];
  
  [holderView addSubview:rootView];
  
  
  rootViewController.view = holderView;
  self.window.rootViewController = rootViewController;
  
  [self.window makeKeyAndVisible];
  [SDImageCodersManager.sharedManager addCoder:SDImageWebPCoder.sharedCoder];
  
  return YES;
}

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}

@end

我的SceneViewRenderer类看起来像这样:

import Foundation
import UIKit
import ARKit

@objc
class SceneViewRenderer: UIViewController,ARSCNViewDelegate {
  
  public var sceneView: ARSCNView!
  
  override func loadView() {
    self.view = ARSCNView(frame: UIScreen.main.bounds)
    sceneView = (self.view as! ARSCNView)
  }
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    configureLighting()
    addTapGestureToSceneView()
    
    
    // Container to hold all of the 3D geometry
    let scene = SCNScene()
    // The 3D cube geometry we want to draw
    let boxGeometry = SCNBox(
        width: 0.1,height: 0.1,length: 0.1,chamferRadius: 0.0)
    // The node that wraps the geometry so we can add it to the scene
    let boxNode = SCNNode(geometry: boxGeometry)
    // Position the box just in front of the camera
    boxNode.position = SCNVector3Make(0,-0.5)
    // rootNode is a special node,it is the starting point of all
    // the items in the 3D scene
    scene.rootNode.addChildNode(boxNode)
    // Set the scene to the view
    sceneView.scene = scene
  }
  
  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setUpSceneView()
  }
  
  override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    sceneView.session.pause()
  }
  
  func setUpSceneView() {
    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = [.horizontal,.vertical]
    
    sceneView.session.run(configuration)
    
    sceneView.delegate = self
    sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
  }
  
  func configureLighting() {
    sceneView.autoenablesDefaultLighting = true
    sceneView.automaticallyUpdatesLighting = true
  }
  
  func addTapGestureToSceneView() {
    let tapGestureRecognizer = UITapGestureRecognizer(target: self,action: #selector(SceneViewRenderer.tapDelegate(withGestureRecognizer:)))
      sceneView.addGestureRecognizer(tapGestureRecognizer)
  }
  
  @objc func tapDelegate(withGestureRecognizer recognizer: UIGestureRecognizer) {
    print("tapped")
  }
  
  @objc func renderer(_ renderer: SCNSceneRenderer,didAdd node: SCNNode,for anchor: ARAnchor) {
    print("Renderer Function")
    // 1
    guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
    
    // 2
    let width = CGFloat(planeAnchor.extent.x)
    let height = CGFloat(planeAnchor.extent.z)
    let plane = SCNPlane(width: width,height: height)
    
    // 3
    plane.materials.first?.diffuse.contents = UIColor.transparentLightBlue
    
    // 4
    let planeNode = SCNNode(geometry: plane)
    
    // 5
    let x = CGFloat(planeAnchor.center.x)
    let y = CGFloat(planeAnchor.center.y)
    let z = CGFloat(planeAnchor.center.z)
    planeNode.position = SCNVector3(x,y,z)
    planeNode.eulerAngles.x = -.pi / 2
    
    // 6
    node.addChildNode(planeNode)
    sceneView.scene.rootNode.addChildNode(planeNode)
  }
  
  
  @objc func renderer(_ renderer: SCNSceneRenderer,didUpdate node: SCNNode,for anchor: ARAnchor) {
    print("Renderer Function")
    // 1
    guard let planeAnchor = anchor as?  ARPlaneAnchor,let planeNode = node.childNodes.first,let plane = planeNode.geometry as? SCNPlane
      else { return }
    
    // 2
    let width = CGFloat(planeAnchor.extent.x)
    let height = CGFloat(planeAnchor.extent.z)
    plane.width = width
    plane.height = height
    
    // 3
    let x = CGFloat(planeAnchor.center.x)
    let y = CGFloat(planeAnchor.center.y)
    let z = CGFloat(planeAnchor.center.z)
    planeNode.position = SCNVector3(x,z)
  }
}

extension float4x4 {
  var translation: float3 {
    let translation = self.columns.3
    return float3(translation.x,translation.y,translation.z)
  }
}

extension UIColor {
  open class var transparentLightBlue: UIColor {
    return UIColor(red: 90/255,green: 200/255,blue: 250/255,alpha: 0.50)
  }
}

我可以看到我的react按钮(它们仅在角落,其余部分是透明的),我还可以看到WebView的内容(一个元素,其余部分也是透明的),并且可以看到立方体我使用ARKit以及ARKit的特征点进行渲染。无效的是可视化飞机。即使我在实现的两个函数中设置了断点,也不会调用这些断点。我犯了什么错误?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-