如何使用 ARKit 在 ARSCNView 中正确放置 3D 对象?

Cal*_*leb 2 scenekit swift arkit

我很长时间试图将 3D 对象放置在 SceneView 中的正确位置,该对象正确添加到 SceneView 中,但其位置向右或向左转,

func addObject(x: Float = 0, y: Float = 0, z: Float = -0.5) {

    guard let shipScene = SCNScene(named: "art.scnassets/house.scn"),
        let shipNode = shipScene.rootNode.childNode(withName: "house", recursively: false)
    else {
        return
    }
    shipNode.scale = SCNVector3(0.01, 0.01, 0.01)
    shipNode.position = SCNVector3(x,y,z)
    sceneView.scene.rootNode.addChildNode(shipNode)
}
Run Code Online (Sandbox Code Playgroud)

这是我添加的代码,这个问题是否与相机位置有关,我也改变了,它似乎不起作用。例如,请参考附件图片。

在此处输入图片说明

如何正确放置对象?

Bla*_*orz 5

根据您的问题,您似乎需要调整模型的旋转以使其正确定位。

既然是这样,scn file你应该能够通过调整模型的SceneKit Editor内部来做到这一点。XcodeEuler Angles

参考以下内容,供您参考:

俯仰(x 分量)是围绕节点 x 轴的旋转。

Yaw(y 分量)是围绕节点 y 轴的旋转。

滚动(z 分量)是围绕节点 z 轴的旋转。

在此处输入图片说明

下面是一个例子,示出了改变的影响X Eular Angle内的SceneKit Editor

在此处输入图片说明

在此处输入图片说明

如果您想以编程方式执行此操作,您可以通过多种方式执行此操作:

(a)通过修改模型的欧拉角,例如

shipNode.eulerAngles.x = 90
shipNode.eulerAngles.y = 45
shipNode.eulerAngles.z = 90
Run Code Online (Sandbox Code Playgroud)

(b)使用 AnSCNVector4是 a

四分量旋转矢量在前三个分量中指定旋转轴的方向,在第四个分量中指定旋转角度(以弧度为单位)。

因此,使用它的示例如下:

///Rotate The Ship 45 Degrees Around It's Y Axis
shipNode.rotation = SCNVector4Make(0, 1, 0, .pi / 4)
Run Code Online (Sandbox Code Playgroud)

为了让生活更轻松,您还可以使用以下扩展名,以便您可以以度为单位编写所需的旋转,然后转换为 SCNVector4 所需的弧度,例如:

shipNode.rotation = SCNVector4(0, 1, 0, Float(Int(45).degreesToRadians)))

extension  CGFloat{

  /// Converts Degrees To Radians
  var degreesToRadians:CGFloat { return CGFloat(self) * .pi/180}

}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你...