- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用 ARFaceTrackingConfiguration session 设置了 SceneView,并在场景 Assets 中制作了一个虚拟 3D 模型。
该模型是在sceneView中导入的,但它会随着相机的移动而相应地移动,我需要的是将模型位置固定在sceneView的中心。
下图展示了我想要实现的目标。
因此 3D 模型不应根据相机移动而移动。
@IBOutlet var sceneView: ARSCNView!
let scene = SCNScene(named: "art.scnassets/TEST.scn")!
var contentNode: SCNNode?
override func viewDidLoad() {
super.viewDidLoad()
// Set the view's delegate
sceneView.delegate = self
// Show statistics such as fps and timing information
sceneView.showsStatistics = true
sceneView.scene = self.scene
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Create a session configuration
let configuration = ARFaceTrackingConfiguration()
configuration.isLightEstimationEnabled = true
// Run the view's session
sceneView.session.run(configuration)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Pause the view's session
sceneView.session.pause()
}
// MARK: - ARSCNViewDelegate
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
guard let faceAnchor = anchor as? ARFaceAnchor else { return nil }
let faceGeometry = ARSCNFaceGeometry(device: sceneView.device!)!
self.contentNode = SCNNode(geometry: faceGeometry)
return self.contentNode
}
最佳答案
所以这是我自己的问题的答案。
首先将一个对象静态放置在sceneView的中间,这意味着您不希望该对象在相机移动时移动,您需要将其位置设置为相机当前面对的位置。
要获取相机的当前位置,我们需要访问 pointOfView值(value)。pointOfView
包含 cameraView 的当前位置和方向
一种用例是我们需要在相机前添加节点。
位置和方向在 pointOfView
内编码转换成变换矩阵 SCNMatrix4
.
来自苹果文档:
Image below shows the matrix configurations for some of the more common transformations you can make. Multiplying any coordinate by the identity transform returns the exact same coordinate. For other transformations, how the coordinate is modified depends entirely on which matrix components you change. For example, to translate along the x-axis only, you would supply a nonzero value for the tx component of the translation matrix and leave the ty and tz values to 0. For rotations, you would provide the appropriate sine and cosine values of the target rotation angle. Matrix configurations for
pointOfView
在您的类(class)正文中,不在
ARSCNViewDelegate
方法,如果您在
renderer(_nodeFor:)
中执行此操作方法然后你的对象将遵循面几何:
guard let pointOfView = self.sceneView.pointOfView else { return }
DispatchQueue.main.async {
pointOfView.addChildNode(yourNode)
}
ARSCNViewDelegate
并调用:
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode?
didUpdate
方法将被调用,然后我们可以更新节点或其他内容
didUpdate
方法,因为只要移动目标节点,就会调用它。
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
guard let faceAnchor = anchor as? ARFaceAnchor else { return }
let faceTransform = faceAnchor.transform
let positionY = faceLocation.columns.2.y
let positionX = faceLocation.columns.2.x
let horizentalLine = Int(positionY * 100)
self.horizentalNode.eulerAngles = SCNVector3(horizentalLine.degreeToRadians, 0, 0)
degreeToRadians
扩展只是转换
eulerAngles
的值旋转矩阵。
关于swift - 如何在使用 ARFaceTrackingConfiguration 时始终将 SceneNode 定位在 SceneView 的中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55906182/
我正在阅读下面的代码。 https://github.com/tukuyo/rakumaruCardMan/blob/master/rakutencard-Man/ViewController.swi
我正在构建一个自定义窗口,我正在尝试重用 Unity 的场景 View ,以便能够直接从此特定窗口进行绘制。 我设法通过扩展 UnityEditor.SceneView 来重现正确的窗口,这就是我所拥
我已经使用 SceneView 加载 3D 模型将近一年了,但我一直不明白是什么导致了这种泄漏。我会实现 LeakCanary,但只有这一次泄漏,因为我不知道如何解决这个问题。 但现在我想弄清问题的根
我想打开一个 3D 模型并使其背景透明,以便我可以看到 SceneView 后面的 UI。我试过这段代码,但sceneView变成白色,不透明。 struct ModelView: View {
我正在加快 ArcGIS JS Api 版本 4.x 的运行速度,并认为这是在 Typescript 和 Widget 架构上实现一个显示 SceneView 的小部件的一个很好的练习。在当前 Map
您对此有什么解决方案吗? 我想得到 SC.SceneView从下到上过渡,而不是从左到右或从右到左。 Doc在这里并没有说太多,但是由于原始转换必须在某个地方,也许我可以为此创建其方法的原型(prot
我试图通过简单地使用一个 fragment 的提要并将另一个屏幕元素设置为相同的内容来在屏幕上显示一个 arFragment 两次,但我无法弄清楚要采用哪个元素。 我知道,我通过调用获取当前的Came
使用scene.isPaused和sceneView.isPlaying有什么区别?这些只是从不同地方处理的相同事情吗?是否将其中一个更改为 true,将其他更改为 false,反之亦然? 最佳答案
我有一个位于 SCNVector3.zero 的地球仪,带有 OrbitTurntable/allowsCameraControl 和一个使用 SCNLookAtConstraint 来观察地球仪的相
我想获取场景 View 中特定特征点处检测到的世界对象的颜色。例如,我在 (x:10, y:10, z:10) 处检测到一个特征点。 如何获取此位置的object/surface的颜色? 最佳答案 目
我不明白为什么我的代码不能运行其他设备,而我的代码在我的旧设备中检查正常。这是通知: Invariant Violation: Invariant Violation: Element type is
我正在学习 ARKit。我在增强现实场景中放置虚拟对象并在这些问题上苦苦挣扎! I am using this demo project from github 1- 如何在 SceneKit 的 S
我在空间中有两个点,并且想要一个第三个 点,它是前两个点的某个乘数的延伸 - 延伸线段。我将如何在 Swift4 中执行此操作 - 我将如何获得下面的 x2、y2、z2? distance
我正在研究 ARKit,这是我的开始。我添加了 3D 模型以显示在我的 ARSCNView 上。我正在学习本教程:https://www.appcoda.com/arkit-3d-object/ 我使
在 Apple 的 ARKitExample 中,如果我在一个场景 View 中添加多个虚拟对象(两把椅子)。如何在 ARKitExample 的 sceneView 中检测我触摸了哪把椅子? sce
有人知道如何更改 SceneView 对象的背景颜色吗?我正在尝试将背景属性放置到 SceneView,但它并没有改变它,仍然具有默认背景。 In this case I wanted to the
如何旋转使用 ARCORE SceneView 渲染的 3d 模型我已经使用了 Sceneview 私有(private) lateinit var 场景:场景 私有(private) lateini
我正在尝试设置一个布局,其中 map 放置在 SceneView 的顶部。当应用程序构建时,设置会闪烁一秒钟,然后 SceneView 占据整个屏幕,完全隐藏其他两个 View 。 在左侧菜单上移动
我正在从事一个项目,该项目将在一个 fragment 中包含一个 3D 模型查看器。为此,我决定使用 sceneform。尝试在我的选项卡 fragment 中显示 SceneView 后,我遇到了问
我想在没有相机和 ArCore 的场景 View 上加载 3D 对象。所以我创建了一个简单的 xml 布局,如下所示: 并像这样加载 3D 对象: private fun rend
我是一名优秀的程序员,十分优秀!