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

标签 ios vector 3d camera scenekit

<分区>

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

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

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

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

    [_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;
}

关于ios - 将相机朝它指向的方向移动,同时考虑到旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27766471/

相关文章:

iphone - 发现 iOS 二进制文件的 iOS 版本

vector - VHDL如何使用std_logic_vector作为数组的索引

c++ - 为双 vector 创建自己的迭代器

javascript - 如何计算哪个顶点最接近 3D 点?

c++ - 3d 实时软件渲染器开源

java - 选择哪个 : 2D or 3D for a java game

ios - SciCharts-ISCIAxisCore可见的最小和最大索引

ios - Objective c 如何从布局内的相机检测对象?

c++ - 给另一个 vector 内存的 std::vector 所有权?

ios - iOS SDK 中的通知中心与委派