【问题标题】:scenekit node rotation and movement in 3D Space3D 空间中的场景工具包节点旋转和移动
【发布时间】:2015-02-03 09:19:39
【问题描述】:

假设我们有一个SCNNode,我们想要旋转、改变飞行方向并在没有重力的情况下在太空中移动。该节点当前只是一个摄像头。实际上它应该对陀螺仪加速度计数据做出反应。我认为可以在- (void)renderer:(id <SCNSceneRenderer>)aRenderer didSimulatePhysicsAtTime:(NSTimeInterval)time 中完成场景更新。

我面临的问题是如何利用陀螺仪和加速度计数据来计算飞行方向,以及如何计算旋转方向和运动。我刷新了关于每个轴(x,y,z)的 3D 旋转矩阵的记忆,但仍然缺少上述部分来解决这个问题。可能思路很复杂,解决起来很简单。

- (void)viewDidLoad
{

SCNView *scnView = (SCNView *) self.view;
SCNScene *scene = [SCNScene scene];
scnView.scene = scene;

_cameraNode = [[SCNNode alloc] init];
_cameraNode.camera = [SCNCamera camera];
_cameraNode.camera.zFar = 500;
_cameraNode.position = SCNVector3Make(0, 60, 50);
_cameraNode.rotation  = SCNVector4Make(1, 0, 0, -M_PI_4*0.75);
[scene.rootNode addChildNode:_cameraNode];

scnView.pointOfView = _cameraNode;
[self setupAccelerometer];
}

- (void)setupAccelerometer
{
_motionManager = [[CMMotionManager alloc] init];
GameViewController * __weak weakSelf = self;

if ([[GCController controllers] count] == 0 && [_motionManager isAccelerometerAvailable] == YES) {
    [_motionManager setAccelerometerUpdateInterval:1/60.0];
    [_motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        [weakSelf accelerometerDidChange:accelerometerData.acceleration];
    }];
}
}

- (void)accelerometerDidChange:(CMAcceleration)acceleration
{
 //acceleration.x
 //acceleration.y
 //acceleration.z
 // now we have the data and saved somewhere

}

【问题讨论】:

    标签: ios 3d scenekit


    【解决方案1】:

    如果您想结合陀螺仪和加速度计数据来获得方向,那么让 CoreMotion 为您做这件事可能会更好。文档中Managing Device Motion Updates 下列出的方法为您提供CMDeviceMotion 对象;从其中一个您可以获得代表方向的CMAttitude,然后您可以获得旋转矩阵或四元数,您可以将其应用于场景中的节点。 (可能在进一步转换它以使中性方向以您想要的方式适合您的场景之后。)

    按照您想要的方式定位节点后,从中获取飞行方向应该非常简单:

    1. 根据节点的局部坐标空间选择一个飞行方向,并制作一个指向该方向的向量;例如摄像机沿其节点的 -z 方向查看,因此如果您希望摄像机节点沿其飞行路径查看,您将使用类似 {0, 0, -1} 的向量。

    2. 使用convertPosition:toNode: 和场景的rootNode 将该向量转换为场景空间。这会根据场景为您提供飞行方向,并考虑节点的方向。

    3. 使用转换后的矢量来移动节点,或者将其指定为节点物理体的速度,或者使用它来确定新位置并通过动作或动画将节点移动到那里。

    【讨论】:

    • 感谢您的清晰解释。当然我需要阅读进一步尝试。
    • 只是想让你知道我已经使用四元数旋转相机。它需要一些稳定,然后我会尝试解决飞行方向和距离的部分。
    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2020-08-14
    • 2015-09-14
    • 1970-01-01
    • 2011-02-23
    相关资源
    最近更新 更多