我正在使用两个虚拟操纵杆将我的相机移动到场景中。左摇杆控制位置,右摇杆控制旋转。
使用右杆时,相机会旋转,但相机似乎会围绕模型的中心点旋转。
这是我的代码:
fileprivate func rotateCamera(_ x: Float, _ y: Float)
{
if let cameraNode = self.cameraNode
{
let moveX = x / 50.0
let rotated = SCNMatrix4Rotate(cameraNode.transform, moveX, 0, 1, 0)
cameraNode.transform = rotated
}
}
我也试过这段代码:
fileprivate func rotateCamera(_ x: Float, _ y: Float)
{
if let cameraNode = self.cameraNode
{
let moveX = x / 50.0
cameraNode.rotate(by: SCNQuaternion(moveX, 0, 1, 0), aroundTarget: cameraNode.transform)
}
}
但相机只是跳了起来。我的错误是什么?
答案 0 :(得分:1)
有许多方法可以处理旋转,有些方法非常适合给编码器带来麻烦。
听起来模型位于0,0,0,意味着它位于世界的中心,并且相机被转换到某个位置。在使用矩阵的第一个示例中,您基本上可以旋转该转换。所以你首先变换,然后旋转,这将导致它围绕原点(0,0,0)旋转。
相反,要在本地空间旋转相机,首先要在本地空间旋转相机,然后将其转换为世界空间中的位置。
平移x旋转矩阵导致在世界空间中旋转
旋转x平移矩阵导致在局部空间中旋转
因此,解决方案是首先从相机中移除平移(将其移回0,0,0),然后应用旋转矩阵,然后重新应用平移。这与从单位矩阵开始的结果相同。例如:
let rotated = SCNMatrix4Rotate(SCNMatrixIdentity, moveX, 0, 1, 0)
cameraNode.transform = SCNMatrix4Multiply(rotated, cameraNode.transform)