首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用scenekit和swift - Boids实现将模型旋转到正在3d中移动的方向

使用scenekit和swift - Boids实现将模型旋转到正在3d中移动的方向
EN

Stack Overflow用户
提问于 2015-06-26 15:33:08
回答 1查看 615关注 0票数 1

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

以下是我正在做的旋转模型以使其朝向它们的方向:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2018-09-19 06:26:08

三年来帮助最初的提问者已经太晚了,原始的YouTube视频已经不见了,但是你可以在项目的GitHub page上看到一个。

原始Boids代码将方向存储为boid局部坐标空间的三个基向量,可以将其视为3x3旋转矩阵的列。每一帧都会有一个行为上的“转向力”作用于当前的速度,从而产生一个新的速度。假设“速度对齐”,这个新速度与新的正向(z)向量平行。它对旧的up (y)向量和新的正向向量进行叉积,生成一个新的侧向量。然后它穿过新边并向前,得到一个新的向上向量。供参考,here is the code for that in OpenSteer

因为看起来你想要一个四元数的方向,所以你的四元数类可能有一个构造函数,它接受一个旋转矩阵作为参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31067546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档