ARKit - 在竖屏模式下将物体放置在相机前面

4

当我使用从当前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
}

更新

通过创建一个旋转矩阵来旋转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)
}

你只是想把物体放在相机前面吗? - BlackMirrorz
@JoshRobbins 是的,只是将它放在相机前面一米处,当设备处于横屏时效果很好,但当我拿着设备竖屏放置物体时,物体的方向就不对了。 - P.M.
1个回答

1

如果通过pointOfView获取相机矩阵,则肖像模式和风景模式似乎会自动工作。

    let anchorTransform = pointOfView!.convertTransform(SCNMatrix4MakeTranslation(0, 0, -1),  to: nil)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接