Three.js 默认对象。旋转';s旋转轴(三个.js)

Three.js 默认对象。旋转';s旋转轴(三个.js),three.js,Three.js,更改对象旋转特性的值是否会使对象围绕世界轴或对象的轴旋转?例如 object.rotation.x += 2 这将围绕世界X轴或对象的X轴旋转对象吗? 我尝试了以下示例: var materials = []; materials.push( [ new THREE.MeshBasicMaterial( { color: 0xff0000 } ) ] ); materials.push( [ new THREE.MeshBasicMaterial( { color: 0xff0000 } )

更改对象旋转特性的值是否会使对象围绕世界轴或对象的轴旋转?例如

object.rotation.x += 2
这将围绕世界X轴或对象的X轴旋转对象吗? 我尝试了以下示例:

var materials = []; 
materials.push( [ new THREE.MeshBasicMaterial( { color: 0xff0000 } ) ] );
materials.push( [ new THREE.MeshBasicMaterial( { color: 0xff0000 } ) ] );
materials.push( [ new THREE.MeshBasicMaterial( { color: 0x00ff00 } ) ] );
materials.push( [ new THREE.MeshBasicMaterial( { color: 0x00ff00 } ) ] );
materials.push( [ new THREE.MeshBasicMaterial( { color: 0x0000ff } ) ] );
materials.push( [ new THREE.MeshBasicMaterial( { color: 0x0000ff } ) ] );

object = new THREE.Mesh( new THREE.CubeGeometry( 20, 20, 20, 1, 1, 1, materials ), new THREE.MeshFaceMaterial() );

object.position.x = 0;
object.position.y = 0;
object.position.z = 0;

object.rotation.x = 0;
object.rotation.y = 0;
object.rotation.z = 0;

object.scale.x = 1;
object.scale.y = 1;
object.scale.z = 1;

scene.add( object );

After i have added the object to the scene i tried the following - 
object.rotation.x += Math.PI/4;
object.rotation.y += Math.PI/4;
object.rotation.z += Math.PI/4;
到目前为止,对象相对于其自身的X、Y和Z轴旋转。 但是做:

object.rotation.x += Math.Pi/4;

现在,将对象绕世界X轴而不是对象的X轴旋转45度。

旋转在局部空间中。但是,它们是按照您可以自行设置的特定顺序进行评估的。
object.rotation
属性是一个属性,您可以在-property的描述中看到:

应用旋转的顺序。默认值为“XYZ”,这意味着 对象将首先绕其X轴旋转,然后再绕其Y轴旋转 最后是它的Z轴。其他可能性为:“YZX”、“ZXY”, “XZY”、“YXZ”和“ZYX”。这些必须是大写的。 Three.js使用固有的Tait Bryan角度。这意味着旋转 相对于局部坐标系执行。就是, 对于“XYZ”顺序,旋转首先围绕局部X轴(其中 与世界X轴相同),然后围绕局部Y轴(现在可能是 与世界Y轴不同),然后是局部Z轴(可能是 与世界Z轴不同)

(重点由我补充)

考虑以下示例,每个立方体都使用相同的y轴旋转进行更新。在任何情况下,旋转都是围绕局部空间中的y轴进行的,但是:

  • 第一个立方体没有在任何其他轴上旋转,因此 局部空间轴与世界空间轴相同
  • 第二个立方体已绕其x轴旋转,这意味着 y轴也会旋转
  • 第三个立方体也已旋转,但旋转顺序为 更改后,y轴旋转首先发生,而它仍然与世界y轴相同,然后围绕x轴旋转
const canvas=document.getElementById(“canvas”);
const scene=new THREE.scene();
常量摄影机=新的三个透视摄影机(10,2,20,40);
const renderer=new THREE.WebGLRenderer({canvas});
常量灯=新的三点灯();
灯。位置。设置(0,5,10)
场景。添加(灯光);
摄像机位置设置(0,0,25);
const material=新的三个.MeshLambertMaterial();
const geometry=新的三个.BoxBufferGeometry(1,1,1);
const cube1=新的三个网格(几何体、材质);
const cube2=新的三个网格(几何体、材质);
const cube3=新的三个网格(几何体、材质);
立方1.位置集(-2,0,0);
cube2.position.set(0,0,0);
立方位置集(2,0,0);
场景。添加(立方体1);
场景。添加(立方体2);
场景。添加(立方体3);
//第一个立方体不旋转
立方1.旋转.设置(0,0,0);
//第二个立方体绕X旋转pi/4 rad
cube2.rotation.set(Math.PI/4,0,0);
//第三个立方体绕X旋转pi/4 rad
//旋转顺序设置为YXZ,以使y旋转首先发生
立方体3.旋转.set(Math.PI/4,0,0);
cube3.rotation.order=“YXZ”;
设t0=performance.now();
函数更新(){
常数t1=性能。现在();
常数旋转=0.001*(t1-t0);
立方1.旋转。y+=旋转;
立方2.旋转。y+=旋转;
立方3.旋转。y+=旋转;
渲染器。渲染(场景、摄影机);
t0=t1;
requestAnimationFrame(更新);
}
更新()


rotation对象看起来像
object.rotation=Euler{ux:0,uy:0,uz:0,u顺序:“XYZ”,onChangeCallback:ƒ}
。即使我做了
object.rotation.set(0,0,Math.PI/2)
I.e
object.rotation=Euler{{ux:0,uy:0,uz:1.57079663267948966,_order:“XYZ”,onChangeCallback:ƒ}
对象在世界z轴上旋转,如果你做了
object.rotation.set(0,0,z)
你正在将x和y值重置为0。通过
object.rotation.z+=Math.Pi/4,可以像在问题中一样进行旋转
,请注意它们是按照
order
设置的特定顺序进行计算的。我尝试了所有可能的顺序'YZX'、'ZXY'、'XZY'、'YXZ'和'ZYX',
a.rotation.order=“order”
,然后我做了
object.rotation.z+=Math.PI/4
,该对象仅在世界Z轴上旋转。@sarthaksaxena我添加了一个示例,希望能澄清一些问题。非常感谢,了解我的代码的问题所在。