ARKIT-将物体放在肖像模式下的相机前



当我使用从当前arframe的转换将对象放在相机前面时,它似乎将景观用作设备的方向。因此,如果我将设备固定在肖像中并放置一个物体,它将看起来倾斜90度。

我希望将对象的方向相对于设备的肖像放置。有可能改变吗?还是我必须旋转锚?那将如何做?

这是我创建锚的方式:

@IBAction func add(_ sender: Any) {
    guard let currentFrame = self.sceneView.session.currentFrame else  { return }
    var translation = matrix_identity_float4x4
    translation.columns.3.z = -1
    let transform = currentFrame.camera.transform
    let anchorTransform = matrix_multiply(transform, translation)
    var anchor = ARAnchor(transform: anchorTransform)
    self.sceneView.session.add(anchor: anchor)
}

及以下是我如何创建用于渲染的节点。请注意,我希望能够将这两个节点移动为一个。

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    let childOne = SCNNode()
    childOne.geometry = SCNBox(width: 0.5, height: 0.1, length: 0.3, chamferRadius: 0)
    childOne.geometry?.firstMaterial?.diffuse.contents = UIColor.green
    let childTwo = SCNNode()
    childTwo.geometry = SCNBox(width: 0.2, height: 0.5, length: 0.1, chamferRadius: 0)
    childTwo.position = SCNVector3(0, 0.25, 0)
    childTwo.geometry?.firstMaterial?.diffuse.contents = UIColor.red
    let node = SCNNode()
    node.addChildNode(nodeOne)
    node.addChildNode(nodeTwo)
    return node
}

update

通过创建用于旋转Z轴90度的旋转矩阵,然后将其乘以翻译矩阵。

@IBAction func add(_ sender: Any) {
    guard let currentFrame = self.sceneView.session.currentFrame else  { return }
    var translation = matrix_identity_float4x4
    translation.columns.3.z = -1
    let transform = currentFrame.camera.transform
    let rotation = matrix_float4x4(SCNMatrix4MakeRotation(Float.pi/2, 0, 0, 1))
    let anchorTransform = matrix_multiply(transform, matrix_multiply(translation, rotation))
    var anchor = ARAnchor(transform: anchorTransform)
    self.sceneView.session.add(anchor: anchor)
}

如果您通过PointOfView获得相机矩阵

,肖像-VS-vs-landscape似乎会自动工作
    let anchorTransform = pointOfView!.convertTransform(SCNMatrix4MakeTranslation(0, 0, -1),  to: nil)

最新更新