我正在使用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))
}
以下是他们现在的表现
答案 0 :(得分:1)
为帮助原始提问者而晚了三年,原始的YouTube视频已经消失了,但是您可以在项目的GitHub page上看到一个。
原始的Boids代码将方向存储为Boid局部坐标空间的三个基本向量,可以将其视为3x3旋转矩阵的列。每帧都将有行为“转向力”作用于当前速度以产生新的速度。假设“速度对齐”,则新速度平行于新的正向(z)向量。它对旧的up(y)向量和新的正向向量进行叉积运算以产生新的副向量。然后,它越过了新的一面并向前获得了新的上升向量。仅供参考,here is the code for that in OpenSteer
由于看起来您希望将方向作为四元数,因此四元数类可能有一个构造函数,该构造函数将旋转矩阵作为参数。