回答你的第一个问题,要想让节点粘在一个特定的地方,你只需要保留一个想要的位置,然后添加节点,除非你删除它,否则它应该不会消失。当你改变手机方向和位置时,它可能会上下移动一下,但不会太大。
node.position = SCNVector3(x, y, z)
如果你使用润色来定义位置,我建议你考虑一下 sceneView.hitTest()
和 触摸开始() 职能
至于旋转,你可以简单地在你感兴趣的节点上沿着任何轴线,在任何需要的方向上使用欧拉角。
node.eulerAngles.x = -.pi / 2
另外,我强烈推荐你 "用Swift开发应用程序" 由苹果教育,2019年。在这本书中,有整整一章的内容是关于ARKit的,除了解答你的疑问外,还有许多有用的技术和想法。
喏 你可以从《App开发与Swift》一书中找到章末引导项目的实现,但自己做会更有用。
如上所述 此处您可以使用以下两个选项之一进行旋转
let boxAnchor = try! Experience.loadBox()
boxAnchor.steelBox?.orientation = simd_quatf(angle: .pi/4, axis: [0, 0, 1])
对于角度属性,你可以插入你想让对象旋转多少弧度,对于轴属性,你可以选择你想旋转的轴。
另一个选择是使用变换
boxAnchor.steelBox?.transform = Transform(pitch: 0, yaw: 0, roll: .pi/4)
滚动、俯仰和偏航表示沿某一特定轴线的旋转,更多的写法是 此处.
要改变位置,你可以再次使用transform的transform转换。
steelBox.transform.translation = [0, 0, -0.5]
这将根据给定的参数翻译你的对象。这个函数主要依赖于 仿射变换.
SceneKit中的节点和RealityKit中的实体都会相对于父节点或实体进行转换和旋转。
所以,在你的案例中,你有一个大模型,你打算在其中放置较小的对象,你有两个选择,一是在大模型(房子)上使用触摸检测,二是在实体上使用触摸检测。
你有两个选择,要么在大模型(房子)上使用触摸检测,然后他们手动计算对象应该放在哪里,这可能相当麻烦。
另一种选择是在预定义的位置添加小的透明平面,然后在它们上添加触碰检测。这样你就可以省去计算较小的物体应该放在哪里了。
运气好