将相机朝它指向的方向移动,同时考虑到旋转

move a camera toward it pointing direction taking rotation into consideration

假设我们有一个场景,其中的对象位于不同的 xyz 位置和旋转角度。 其中一个节点是一个相机,我想向后或向前移动到一个假想点,例如屏幕中心(512、384)。屏幕中心我的意思是相机方向的中心,所以它是用户可以看到的。我目前面临的问题是:

  1. 虚点 (512, 384) 是 2D 以及如何将其转换为 3D
  2. 如何移动相机forward/backward旋转进入 考虑

例如,相机的当前位置 (x,y,z)(140, 199, 20) 并绕其轴 (x,y,z)(25°, 187°, 301°) 旋转.那么如何将相机朝它的指向方向移动。 我正在学习场景工具包(包括 3D 新手),非常感谢任何 example/pseudo 代码。

到目前为止,我的努力只是将相机移向根节点。

    [_cameraNode runAction:[SCNAction moveTo:SCNVector3Make(_cameraNode.presentationNode.position.x, _cameraNode.presentationNode.position.y, _cameraNode.presentationNode.position.z - 5) duration:1]];

根据@mnuages 的评论,我可以取出必要的代码并实现我的要求。谢谢!

-(SCNVector3)position:(SCNVector3)position multipliedByRotation:(SCNVector4)rotation
{
   if (rotation.w == 0)
   {
       return position;
   }
   GLKVector3 gPosition = SCNVector3ToGLKVector3(position);
   GLKMatrix4 gRotation = GLKMatrix4MakeRotation(rotation.w, rotation.x, rotation.y, rotation.z);
   GLKVector3 r = GLKMatrix4MultiplyVector3(gRotation, gPosition);
   return SCNVector3FromGLKVector3(r);
 }

-(SCNMatrix4)moveCamera
{
   CGFloat step = 2.0
   CGFloat x = 0.0;
   CGFloat y = 0.0;
   CGFloat z = _touchCount == 2 ? -step : _touchCount == 1 ? step : 0.0;

   SCNMatrix4 cameraTransform = _cameraNode.transform;

   SCNVector3 rotatedPosition = [self position:SCNVector3Make(x, y, z) multipliedByRotation: _cameraNode.rotation];
   cameraTransform = SCNMatrix4Translate(cameraTransform, rotatedPosition.x, rotatedPosition.y, rotatedPosition.z);

    return cameraTransform;
}