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

时间:2018-04-10 11:13:38

标签: swift scenekit 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)
}

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

enter image description here

如何正确放置物体?

1 个答案:

答案 0 :(得分:4)

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

看到它是scn file,您应该可以通过调整模型的SceneKit EditorXcode Euler Angles内执行此操作。

有关您的信息,请参阅以下内容:

  

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

     

偏航(y分量)是绕节点y轴的旋转。

     

Roll(z分量)是绕节点z轴的旋转。

enter image description here

以下是一个示例,说明了在X Eular Angle中更改SceneKit Editor的效果:

enter image description here

enter image description here

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

(a)通过修改模型的Eular角度,例如

shipNode.eulerAngles.x = 90
shipNode.eulerAngles.y = 45
shipNode.eulerAngles.z = 90

(b)使用SCNVector4

  

指定方向的四分量旋转矢量   旋转轴在前三个分量和旋转角度   (以弧度表示)第四节。

这样使用它的例子如下:

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

为了让生活更轻松,您还可以使用以下扩展名,以便您可以以度为单位编写所需的旋转,然后转换为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}

}

希望它有所帮助...