在 p5js 中使用速度和位置向量的 3D 定向粒子
3D orienting particles using velocity and position vectors in p5js
我目前正在 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 网站上获得:https://editor.p5js.org/itsKaspar/sketches/JvypSPGGh
有一个默认的轨道控件,因此您可以缩放和拖动鼠标来检查粒子的方向。
太感谢了,卡了半天了
在您的演示中,z 分量被翻转了,您可以通过一次只尝试一个旋转来测试它。其次,以这种方式在 3D 中链接旋转通常不会执行您想要的操作,因为旋转会更改附加到某个对象的坐标系的“向上”或“向右”向量。例如,围绕向上(p5 为 -y)矢量或偏航角旋转,将旋转右矢量。然后第二次旋转需要关于旋转的右向量(现在是俯仰),所以你不能只使用 rotateX/Y/Z 因为它们仍然在世界 space 而不是对象 space 中。请注意,我在这个解决方案中完全忽略了滚动,但如果你从前角和顶角看 boids,它应该与速度对齐
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));
我目前正在 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 网站上获得:https://editor.p5js.org/itsKaspar/sketches/JvypSPGGh 有一个默认的轨道控件,因此您可以缩放和拖动鼠标来检查粒子的方向。
太感谢了,卡了半天了
在您的演示中,z 分量被翻转了,您可以通过一次只尝试一个旋转来测试它。其次,以这种方式在 3D 中链接旋转通常不会执行您想要的操作,因为旋转会更改附加到某个对象的坐标系的“向上”或“向右”向量。例如,围绕向上(p5 为 -y)矢量或偏航角旋转,将旋转右矢量。然后第二次旋转需要关于旋转的右向量(现在是俯仰),所以你不能只使用 rotateX/Y/Z 因为它们仍然在世界 space 而不是对象 space 中。请注意,我在这个解决方案中完全忽略了滚动,但如果你从前角和顶角看 boids,它应该与速度对齐
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));