簡體   English   中英

SceneKit - 圍繞 X 軸和 Z 軸旋轉對象

[英]SceneKit - Rotate object around X and Z axis

我正在將 ARKit 與 SceneKit 一起使用。 當用戶按下按鈕時,我會創建一個錨點,並在與之對應的 SCNNode 中添加一個 3D 對象(從項目中的 .scn 文件加載)。

3D 對象面向相機放置,與相機的方向相同。 我想讓它看起來像物體放在一個平面上,如果是這樣的話,它不會傾斜。 所以,如果我做對了,我需要應用旋轉變換,使其圍繞 X 軸和 Z 軸的旋轉變為 0。

我對此的嘗試是:取節點的 x 和 z eulerAngles,反轉它們,並圍繞每個軸旋轉該量

let rotationZ = rotationMatrixAroundZ(radians: -node.eulerAngles.z)
let rotationX = rotationMatrixAroundX(radians: -node.eulerAngles.x) 

let rotationTransform = simd_mul(rotationTransformX, rotationTransformZ)
node.transform = SCNMatrix4(simd_mul(simd_float4x4(node.transform), rotationTransform))

這在大多數情況下都可以正常工作,但在某些情況下,對象以完全奇怪的方式旋轉。 我應該將旋轉角度設置為當前歐拉角的倒數嗎? 直接將角度設置為 0 根本不起作用。

我遇到了這個問題,並發現我遇到了萬向節鎖定 解決方案是圍繞一個軸旋轉節點,將其作為另一個SCNNode()的父節點,然后圍繞另一個軸旋轉父節點。 希望有幫助。

您不必在矩陣上進行節點變換,您可以簡單地圍繞特定軸旋轉,這在進行旋轉的邏輯方面可能會更簡單一些。

你可以這樣做:

node.runAction(SCNAction.rotateBy(x: x, y: y, z: z, duration: 0.0))

不確定這是否是您正在尋找的類型,但它比使用 SCNMatrix4 進行旋轉更簡單

好吧,我設法解決了問題,但我對此並不滿意,所以我不會回答這個問題。 基本上我定義了一個 2 度的閾值並繼續應用這些旋轉,直到圍繞 X 和 Z 的歐拉角都低於上述閾值。

func layDownNode(_ node: SCNNode) {
    let maxErrDegrees: Float = 2.0
    let maxErrRadians = GLKMathDegreesToRadians(maxErrDegrees)

    while (abs(node.eulerAngles.x) > maxErrRadians || abs(node.eulerAngles.z) > maxErrRadians) {
        let rotationZ = -node.eulerAngles.z
        let rotationX = -node.eulerAngles.x

        let rotationTransformZ = rotationMatrixAroundZ(radians: rotationZ)
        let rotationTransformX = rotationMatrixAroundX(radians: rotationX)

        let rotationTransform = simd_mul(rotationTransformX, rotationTransformZ)

        node.transform = SCNMatrix4(simd_mul(simd_float4x4(node.transform), rotationTransform))
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM