gpt4 book ai didi

ios - 在 SceneKit 中围绕 anchor 旋转

转载 作者:行者123 更新时间:2023-11-28 20:56:32 25 4
gpt4 key购买 nike

目标:我的场景中有一个SCNCylinder对象。我希望能够拖动圆柱体的一端并沿任意方向旋转圆柱体,同时将另一端保持在同一位置。

目前,我正在调用localRotate(by: SCNQuaternion),首先旋转节点,然后计算移动圆柱体所需的位置偏移,以便另一端可以回到其原始位置。

我怎样才能一步实现目标而不是我现在正在做的事情?

最佳答案

pivot 属性就是您要查找的内容。或者,由于现代 SceneKit 通常在您使用 SIMD 类型时工作得更好/使 Swift 更好/与 ARKit 的互操作更容易,simdPivot属性(property)。

注意文档中的这一点:

Changing the pivot transform alters these behaviors in many useful ways. You can:

  • Offset the node’s contents relative to its position. For example, by setting the pivot to a translation transform you can position a node containing a sphere geometry relative to where the sphere would rest on a floor instead of relative to its center.
  • Move the node’s axis of rotation. For example, with a translation transform you can cause a node to revolve around a faraway point instead of rotating around its center, and with a rotation transform you can tilt the axis of rotation.

类似地,对于圆柱体,您可以将其轴点设为变换矩阵,将原点平移其高度的一半,在一端而不是中心为其提供“ anchor ”(用于位置和旋转变化)。像这样的东西(未经测试):

let cylinder = SCNCylinder(radius: /*...*/, height: /*...*/)
let cylinderNode = SCNNode(geometry: cylinder)

cylinderNode.simdPivot = float4x4(translation: cylinder.height / 2)

extension float4x4 {
init(translation vector: float3) {
self.init(float4(1, 0, 0, 0),
float4(0, 1, 0, 0),
float4(0, 0, 1, 0),
float4(vector.x, vector.y, vector.z, 1))
}
}

更一般地说,每当您使用基于场景图/变换层次结构的图形框架时,任何时候您发现自己根据一种变换(旋转、平移等)进行数学运算以影响另一种变换时,检查总是好的对于可以为您进行数学运算的 API — 因为进行这种数学运算就是转换层次结构的全部意义所在。

如果没有一个 API 非常适合您的需求,请记住层次结构本身非常适合进行依赖转换。例如,如果您希望一个节点围绕另一个节点环绕圆形轨道,则无需使用正弦和余弦来设置其位置...只需使其成为另一个节点的子节点,然后旋转该另一个节点即可。

在这种情况下,pivot 是一种等同于使用节点层次结构的便利方法。您也可以创建一个中间节点并在其中移动圆柱体(像这样):

let cylinder = SCNCylinder(radius: /*...*/, height: /*...*/)
let cylinderNode = SCNNode(geometry: cylinder)

let offsetNode = SCNNode()
offsetNode.addChildNode(cylinderNode)
cylinderNode.simdPosition.y = cylinder.height / 2

offsetNode.position = /*...*/ // set world-space position of end of cylinder
offsetNode.eulerAngles.x = /*...*/ // rotate cylinder around its end

关于ios - 在 SceneKit 中围绕 anchor 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51732107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com