使用scenekit和swift将模型旋转到面向3d的方向 - Boids实现

时间:2015-06-26 07:33:08

标签: swift 3d quaternions scenekit

我正在使用Swift和Scenekit实现boids模拟。实现模拟本身是相当直接的,但是我无法让我的模型面向它们飞行的方向(至少在所有时间和正确)。要查看完整项目,您可以在此处获取(https://github.com/kingreza/Swift-Boids

我正在做的是旋转模型以面向它们的方向:

func rotateShipToFaceForward(ship: Ship, positionToBe: SCNVector3)
  {
    var source = (ship.node.position - ship.velocity).normalized();

    // positionToBe is ship.node.position + ship.velocity which is assigned to ship.position at the end of this call
    var destination = (positionToBe - ship.node.position).normalized();

    var dot = source.dot(destination)

    var rotAngle = GLKMathDegreesToRadians(acos(dot));
    var rotAxis = source.cross(destination);

    rotAxis.normalize();

    var q = GLKQuaternionMakeWithAngleAndAxis(Float(rotAngle), Float(rotAxis.x), Float(rotAxis.y), Float(rotAxis.z))

    ship.node.rotation = SCNVector4(x: CGFloat(q.x), y: CGFloat(q.y), z: CGFloat(q.z), w: CGFloat(q.w))


}

以下是他们现在的表现

https://youtu.be/9k07wxod3yI

1 个答案:

答案 0 :(得分:1)

为帮助原始提问者而晚了三年,原始的YouTube视频已经消失了,但是您可以在项目的GitHub page上看到一个。

原始的Boids代码将方向存储为Boid局部坐标空间的三个基本向量,可以将其视为3x3旋转矩阵的列。每帧都将有行为“转向力”作用于当前速度以产生新的速度。假设“速度对齐”,则新速度平行于新的正向(z)向量。它对旧的up(y)向量和新的正向向量进行叉积运算以产生新的副向量。然后,它越过了新的一面并向前获得了新的上升向量。仅供参考,here is the code for that in OpenSteer

由于看起来您希望将方向作为四元数,因此四元数类可能有一个构造函数,该构造函数将旋转矩阵作为参数。