我正在学习如何使用SceneKit,我对涉及SCNVector4
的方法/属性非常困惑,例如SCNPhysicsBody.applyTorque
和SCNNode.rotation
。显然,您可以使用4个值表示3D对象的旋转。我不明白为什么会这样。
我在网上搜索"用4d矢量表示3d旋转"并发现很多关于4D空间旋转的东西,这不是我想要的。我也看到很多关于罪和cos的网页,但我不明白他们的意思。我对sin和cos的了解仅限于找到直角三角形的角度/边长。
在我看来,3D对象的旋转需要用7个值表示,即7D向量:
我认为我很了解SpriteKit中的2D旋转:每个节点都有一个锚点,因此rotation属性就是关于锚点的弧度。但是,我无法在SCNNode
中找到这样的定位点。当我查找"锚点scnnode"我得到关于ARSCNNode
的东西,这不是我想要的。
我还看了this,其中说:
x,y和z分量确定旋转轴,而w分量确定旋转角度,即扭矩的大小。
只有x,y,z组件如何指定旋转轴?
你能解释一下我如何能够解决这种疯狂问题吗?
答案 0 :(得分:3)
我猜现在问题变成“节点上的哪个地方是'起源'”
由(减去)SCNNode.position
(source)给出。这是相对于其父节点应用于它的转换。
......以及“你如何用3个标量表达2个角度”......
根据Euler's Displacement Theorem, 3D中的任何旋转都可以用轴和旋转角度表示。这些可以反过来存储为:
@OliverCharlesworth
)指定轴的2个球面极角和另一个旋转角SceneKit仅使用4D向量来避免必须以笛卡尔坐标((1)所需)重新计算轴或检索角度(对于(2))。
在我看来,3D对象的旋转需要用7来表示 值,即7D向量:
- 旋转轴一端位置的3个值
- 旋转轴另一端位置的3个值
- 您按
旋转的角度的1个值
问题在于:您对“轴”这个词的两个定义感到困惑,可能是:
按照惯例,第二个用于指定旋转。此旋转的中心是节点的中心位置(通常是其AABB的中点)。
答案 1 :(得分:0)
我意识到我可以编写一些“SceneKit控制台”来测试向量中的四个值的作用。
我将文本字段,按钮和SCNView
放入视图控制器的视图中。在场景中,我添加了一个带有运动物理体的地面节点和一个带有动态物理体的盒子节点。然后我做了这个,以便当点击按钮时,在文本字段中输入的命令将运行。这就是我解析命令的方法:
func executeCommand(_ command: String) {
let parts = command.components(separatedBy: " ")
let node: SCNNode
guard let nodeString = parts.first else { return }
switch nodeString {
case "box": node = box
case "ground": node = ground
default: return
}
guard let selector = parts.dropFirst().first else { return }
switch selector {
case "applyTorque":
if parts.count == 6 {
let x = Double(parts[2])!
let y = Double(parts[3])!
let z = Double(parts[4])!
let w = Double(parts[5])!
let direction = SCNVector4(x, y, z, w)
node.physicsBody?.applyTorque(direction, asImpulse: true)
}
// I decided to add other commands as well, but they're irrelevant so I left them out
default: break
}
}
现在,我尝试输入box applyTorque 1 0 0 1
之类的命令,看看发生了什么。以下是我的发现:
以下是截图: