请参见所附的Xcode/Metal示例代码和我遇到的问题的视频。
我想让一个移动的物体看向一个点,这在一半的时间里是有效的,但另一半的时间里,物体看的是别的东西。
我用四元数来做旋转。
所以我的问题是,为什么会发生这种情况,我该如何解决?
代码示例非常赞赏。
mutating func calculateGizmo()
{
time += 0.03
let position: float3 = [0,
0 + cos(time * 0.7) * 4,
0 + sin(time * 0.9) * 4]
gizmo.position = position
let lookAtMat4x4 = float4x4(eye: position, center: [0, 0, 0], up: [0, 1, 0])
gizmo.transform.quaternion = simd_quatf(lookAtMat4x4)
}
1条答案
按热度按时间hof1towb1#
从我所看到的来看,它似乎做了正确的事情。您要求lookat函数忽略x轴的存在,因此您将其约束为仅在YZ平面内工作。然后,结果与预期一致。
换句话说,当位置在点(0,0,0)的正下方时,你要求它将Z轴指向(0,1,0)的方向,同时要求它忽略这个方向,将Y轴聚焦到(0,1,0)的上轴。所以,是的,它只是试图保持你给它的约束。
听起来,如果您尝试将旋转约束在YZ平面中,您可能希望将上轴保持为(1,0,0)或(-1,0,0)。