- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们想旋转一个 SCNNode
以便与北方向匹配。
Arkit 允许将其 z 轴与北方对齐,但这需要用户许可才能进行位置跟踪,而我们不想要求这样做。见gravityandheading
因此,我们尝试使用 CMDeviceMotion 的磁场属性。但我们不知道该怎么做。大概有一些矩阵计算,我们暂时不掌握。见magneticfield
任何帮助将不胜感激!谢谢!
最佳答案
以下是有关如何为AR 应用 和NON-AR 应用 正确设置它的一些提示:
在 iOS 11 及更高版本中,您需要执行以下操作才能使位置正常工作:
info.plist
并向要求其启动的位置管理器请求授权。 info.plist 中有两个 Property List Keys
用于位置授权。 需要其中一个或两个键。在非 AR 应用程序中,如果两个键都不存在,您可以调用 startUpdatingLocation
方法,但位置管理器实际上不会启动。它也不会向委托(delegate)发送失败消息(因为它从未启动,所以它不会失败)。 如果您添加一个或两个 key 但忘记明确请求授权,它也会失败。Use these two
Property List Keys
ininfo.plist
file. They are used since iOS 11 was released:
<key>NSLocationWhenInUseUsageDescription</key>
<string>App needs an access to your location (in foreground)</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>App needs an access to your location (in background)</string>
And these two
Property List Keys
were deprecated earlier (DON'T USE THESE KEYS):
<key>NSLocationUsageDescription</key>
<string>App needs an access to your location (in background)</string>
<key>NSLocationAlwaysUsageDescription</key>
<true/>
AR 应用的代码应如下所示:
let configuration = ARWorldTrackingConfiguration()
func session(_ session: ARSession, didFailWithError error: Error) {
switch error.code {
case 101:
configuration.worldAlignment = .gravity
restartSession()
default:
configuration.worldAlignment = .gravityAndHeading
restartSession()
}
}
func restartSession() {
self.sceneView.session.pause()
self.sceneView.session.run(configuration,
options: [.resetTracking, .removeExistingAnchors])
}
对于非 AR 应用,使用这两个实例方法:requestAlwaysAuthorization()
(请求在应用运行时使用定位服务的权限)和requestWhenInUseAuthorization()
(请求允许在应用程序处于前台时使用定位服务。
非 AR 应用的代码应如下所示:
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager = CLLocationManager()
func updateMyLocation() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
if locationManager.respondsToSelector(#selector(CLLocationManager.requestWhenInUseAuthorization)) {
locationManager.requestWhenInUseAuthorization()
} else {
locationManager.startUpdatingLocation()
}
}
}
此外,您可以请求始终授权
:
let locationManager = CLLocationManager()
func enableLocationServices() {
locationManager.delegate = self
switch CLLocationManager.authorizationStatus() {
case .notDetermined:
// Request when-in-use authorization initially
locationManager.requestWhenInUseAuthorization()
break
case .restricted, .denied:
// Disable location features
disableMyLocationBasedFeatures()
break
case .authorizedWhenInUse:
// Enable basic location features
enableMyWhenInUseFeatures()
break
case .authorizedAlways:
// Enable any of your app's location features
enableMyAlwaysFeatures()
break
}
}
希望这对您有所帮助。
关于ios - 未经许可将 SCNNode 旋转到北以进行位置跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55872126/
我的场景中有一系列(平面)节点,我需要它们始终面向相机。 如何调整变换/旋转以使其正常工作? 另外,我在哪里进行计算? 目前我正在尝试在 SCNSceneRendererDelegate render
我正在构建一个应用程序,它使用 Scenekit 根据从数据库返回的信息显示场景。我创建了一个带有类 func 的自定义类,它创建了一个包含所有需要绘制的 SCNNode 并将其返回到我的 SCNVi
我想从动画 SCNNode 获取当前节点位置我知道 presentationNode 并且我尝试从那里提取位置形式,但没有运气 这是我的代码 SCNNode * pelvis = [_unit chi
我正在使用 Swift 和 ARKit。我可以使用 ARSCNFaceGeometry、ARFaceTrackingConfiguration 等成功显示和更新面部网格。头部没有移动(它看起来向用户)
我有一个适用于 iOS 的 sceneKit 应用程序。我有一个连接到 SCNNode 的 SCNPhysicsBody。我将 .physicsBody 设置为 nil,对 SCNNode 进行一些更
我有一个 SCNNode 的子类“ExSCNNode”,用于向 SCNNode 添加更多属性和行为。 class ExSCNNode : SCNNode { ... } 我用 ExSCNNode 构建
我正在尝试将 SCNLight 添加到 SceneKit 中的 SCNSphere (SCNNode)。它的效果令人惊叹,唯一的问题是 SCNLight 所连接的源球体是完全黑色的,因为作为源,它根本
因此,我能够在 anchor 位置放置一个框节点。现在,如何旋转场景中的 SCNNode? 我正在尝试修改节点的变换和 eulerAngles,但它们没有任何效果: func renderer(_ r
有人知道如何将 SCNMaterial 转换为表面而不改变 SCNMaterial 包含图像的方向吗? 我想创建包含图像的 ARKit SCNNode,然后将其转换为表面,因为我想在所选位置的表面区域
我正在研究 ARKit 和图像检测。现在我有一个应用程序可以检测图像并将平面放置在屏幕上检测到的对象所在的位置。 我怎样才能在飞机上添加一个像按钮一样的可点击元素。我想在每个检测到的对象上都有一个点击
我正在通过编写一个游戏来学习 SceneKit,在这个游戏中你飞过小行星场躲避物体。最初,我通过移动/旋转相机来做到这一点,但我意识到在某些时候我会用完坐标空间,最好将所有对象移向相机(并在我完成后处
我正在处理枢轴和位置已更改的子节点。我发现了很多SCNNode转换主题,但似乎没有一个能代表我的情况。 我有六个球:(不能发布超过 2 个链接,图片位于 i.stack.imgur.com/v3Lc4
我正在使用 Apple 的 SceneKit 并拥有自定义 .dae 资源。我已将资源转换为 .scn 文件。我正在从 .scn 文件中按名称获取 SCNNode。将 SCNNode 作为子节点放置在
我有以下情况。一个 SCNView,其中显示了一座桥的 .scn。在屏幕的左侧,您可以看到桥梁的视觉表示。 我想做以下事情。 在“模型浏览器”左侧选择一项 缩放到所选项目并聚焦 在提供的屏幕截图上。你
我在 SwiftUI 框架内的“SCNView”中有一个“SCNCylinder”。我的目标是围绕不同的轴并以不同的角度旋转圆柱体。我有两个(某种意义上的)按钮,它们接受用户的 180° 或 90°
我试图通过将其枢轴点设置为任何角来旋转 block ,但似乎设置枢轴点实际上重新定位了节点,使该点保持在原来的位置...... 例如 SCNBox *box = [SCNBox boxWithWidt
假设我有 2 个 SCNNodes node1 和 node2。 我希望 node1 的位置为 node1.position = SCNVector3(0, 0, 0) 我希望 node2 的位置为
我正在使用下面的代码创建一个盒子放置在我的 AR 场景中: let box = SCNBox(width: side, height: side, length: side, chamferRadiu
问题: 我试图让一个节点看着手机,无论手机的方向如何,节点的顶部始终指向手机的北极。假设节点位于中心,手机从 (0, 0, 10) 开始,并假设节点具有类似于手机的矩形几何形状。我希望该矩形的顶部始终
我有一个 scnnode,我使用 UIPanGestureRecognizer 围绕它的 Y 轴旋转。这很好,但我想对化身应用惯性,以便在用户抬起手指后它会一直旋转(并减速),有点像 ScrollVi
我是一名优秀的程序员,十分优秀!