【问题标题】:Rotating a vector around a sphere (simulating sun) in three.js在three.js中围绕球体旋转矢量(模拟太阳)
【发布时间】:2015-09-25 08:57:32
【问题描述】:

我正在尝试调整this 代码(它本身是this 的实现)。我已经完成了一般的可视化和渲染工作,但我现在正在尝试为一些逼真的运动制作动画。

光源的点由归一化向量确定(例如THREE.Vector3(1, 0.75, 0)。光线看起来像是来自右上角)。现在我想做的是让矢量围绕球体旋转,使得球体似乎围绕光源运行。但我无法弄清楚如何做到这一点。我试过更新/改变向量的位置。但我不确定如何计算正确的下一个x,y,z 值。我尝试过应用欧拉角和旋转矩阵,如下所示:

euler = new THREE.Euler(f,g,h, 'XYZ');
matrix = new THREE.Matrix4().makeRotationFromEuler(euler);
light = vector.applyMatrix4(matrix);

但在这里,我不确定如何获得 f,g,h 的正确值,这样光线就不会只是在球体周围摆动。

我是否走在正确的轨道上?

工作示例:http://jsfiddle.net/VsWb9/3890/

【问题讨论】:

  • Few cmets : - 控制台打印 `Cannot read property 'applyMatrix4' of undefined :您必须在第 210 行将 'vector' 替换为 'light'; - 你的动画功能没用; - 您的光矢量未标准化:标准化矢量的长度为 1。您可以在 three.js 中使用 light.normalize()

标签: javascript three.js


【解决方案1】:

您正在以欧拉角线性增加 3 个坐标中的两个,这就是问题所在。

对于绕 x/y/z 轴以外的其他旋转,最好的理解/避免问题/编码/计算成本是信任 四元数

它们非常直观,在 threejs 中也是如此。它们由 4 个坐标组成:3 个用于旋转轴,第四个用于旋转值。

var quat=new THREE.Quaternion();

//we set the axis around which the rotation will occur. It needs to be normalized
var axis=new THREE.Vector3(0,1,0).normalize();
//and the angle value (radians)
var angle=0;

//this is your light vector (=original position of your light)
var light=new THREE.Vector3(1,0,0).normalize();

然后在渲染循环中更改角度值并告诉四元数使用上面的轴和更新角度:

angle+=.001//(or angle -= if your axis points in the +y direction like here)
quat.setFromAxisAngle(axis,angle);

最后应用它:

light.applyQuaternion(quat);

更新小提琴:http://jsfiddle.net/Atrahasis/0v93p2xy/


关于归一化向量的注意事项:

  • 归一化向量的长度为 1 个单位。
  • ( 1 , 0 , 0 ),( 0 , 1 , 0 ),( 0 , 0 , 1 ) 是原生归一化向量(和单位向量)。
  • ( 1 , .75 , 0 ) 不是归一化向量,它的长度是 √(1²+.75²)=1.5625 (pythagoras)
  • 例如 (0.6614..., .75, 0) 是归一化向量

【讨论】:

  • 对不起,我没有早点回复,但现在我已经解决了,我可以说这对我有用!非常感谢!
猜你喜欢
  • 2014-02-02
  • 1970-01-01
  • 2017-02-21
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多