Javascript 在p5js中使用速度和位置向量对粒子进行三维定向

Javascript 在p5js中使用速度和位置向量对粒子进行三维定向,javascript,3d,processing,p5.js,Javascript,3d,Processing,P5.js,我目前正在P5.js中编写boids算法的3D实现,但我无法根据boids的方向(速度)确定方向。旋转仅限于RotateX()、RotateY()和RotateZ()。我认为最简单的解决方案应该是: push(); translate(this.pos); rotateZ(createVector(this.vel.x, this.vel.y).heading()); rotateY(createVector(this.vel.x, this.vel.z).heading()); begi

我目前正在P5.js中编写boids算法的3D实现,但我无法根据boids的方向(速度)确定方向。旋转仅限于RotateX()、RotateY()和RotateZ()。我认为最简单的解决方案应该是:

push();

translate(this.pos); 
rotateZ(createVector(this.vel.x, this.vel.y).heading());
rotateY(createVector(this.vel.x, this.vel.z).heading());

beginShape();
// Draw Boid Vertices..
endShape();

pop();
但事实并非如此

我已经编写了一个小得多的程序版本,它只包含随机生成的粒子的方向,这些粒子沿着一个方向运动。可直接在p5js网站上获取: 有一个默认的动态观察控件,因此可以缩放和拖动鼠标来检查粒子的方向


非常感谢,我已经坚持了半天了,从你的演示开始,z组件被翻转了,你可以通过一次只尝试一个旋转来测试这一点。其次,以这种方式链接三维旋转通常不会达到您想要的效果,因为旋转会更改附着到特定对象的坐标系的“向上”或“向右”向量。例如,围绕向上(-y表示p5)矢量或偏航角旋转将旋转右矢量。然后,第二次旋转需要围绕旋转的右向量(现在是俯仰),因此不能只使用rotateX/Y/Z,因为它们仍然在世界空间而不是对象空间中。注意,在这个解决方案中,我完全忽略了滚动,但是如果你从正面和顶角看Boid,它应该与速度对齐

var right = p5.Vector(this.vel.x, 0, this.vel.z);
rotate(atan(this.vel.y/ this.vel.x), right);
rotateY(atan2(-this.vel.z, this.vel.x));