将相机朝它指向的方向移动,同时考虑到旋转
move a camera toward it pointing direction taking rotation into consideration
假设我们有一个场景,其中的对象位于不同的 xyz 位置和旋转角度。
其中一个节点是一个相机,我想向后或向前移动到一个假想点,例如屏幕中心(512、384)。屏幕中心我的意思是相机方向的中心,所以它是用户可以看到的。我目前面临的问题是:
- 虚点 (512, 384) 是 2D 以及如何将其转换为 3D
- 如何移动相机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;
}
假设我们有一个场景,其中的对象位于不同的 xyz 位置和旋转角度。 其中一个节点是一个相机,我想向后或向前移动到一个假想点,例如屏幕中心(512、384)。屏幕中心我的意思是相机方向的中心,所以它是用户可以看到的。我目前面临的问题是:
- 虚点 (512, 384) 是 2D 以及如何将其转换为 3D
- 如何移动相机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;
}