更新SCNNode方向

时间:2018-11-13 15:23:23

标签: swift rotation orientation scenekit scnnode

问题:

我正在尝试创建一个矩形的SCNNode。方向很重要。

1)在相机Z距离前面初始化(已完成)

2)保持其原始位置并跟随摄像机的位置,但是,该节点始终相对于摄像机面向“上”。因此,无论如何,如果有人看着该节点,则该节点在空间上是垂直的。

我的态度

1)我已经完成了第1部分

func updatePositionAndOrientationOf(_ node: SCNNode, withPosition position: SCNVector3, relativeTo referenceNode: SCNNode) {
    let referenceNodeTransform = matrix_float4x4(referenceNode.transform)

    // Setup a translation matrix with the desired position
    var translationMatrix = matrix_identity_float4x4
    translationMatrix.columns.3.x = position.x
    translationMatrix.columns.3.y = position.y
    translationMatrix.columns.3.z = position.z

    // Combine the configured translation matrix with the referenceNode's transform to get the desired position AND orientation
    let updatedTransform = matrix_multiply(referenceNodeTransform, translationMatrix)
    node.transform = SCNMatrix4(updatedTransform)
}

来自Position a SceneKit object in front of SCNCamera's current orientation

2)我尝试了多种方法:

-将节点的旋转设置为摄像机

  • 其结果跟随相机的旋转,而不跟随位置。我不希望节点随着摄像机旋转而旋转,我需要它不断观察摄像机。

-设置节点相对于摄像机的方向

  • 与上述类似的结果。旋转会移动节点;我应该能够沿Z轴旋转手机(从人像到风景),并且节点应该一直保持直立。

-使用SCNLookAtConstraint / BillBoardConstraint

  • BillBoardConstraint允许我编辑特定的轴,因此,我可以告诉它关闭.Z轴。但是,当我将节点向左移动90度时,

                        _
    
         This Side    | * |     * = node; _ = positions around node
    
                        _
    

它实际上将节点旋转到横向模式。 (长底短边)。我需要它以保持直立。

  • LookAtConstraint允许使用GimbalLocked,但旋转类似,并具有与上述类似的问题。

关于如何保持矩形SCNNode(最初为纵向)保持纵向的任何指南,无论我如何看待它,以及如何随身携带相机?

0 个答案:

没有答案