假设我在一个场景中有一个父对象和该父对象的n个子对象。
编辑:添加了用于创建网格的代码(假设我已经设置了基本的场景和摄影机)
父组创建:
var geometry = new THREE.PlaneGeometry( 0, 0 );
var surface = new THREE.Group();
surface.geometry = geometry;
子网格:
surface.add(new Sprite());
scene.add(surface);
有没有一种方法可以只忽略孩子的父母的转换矩阵(但保持其转换作为父母完整)?
我知道matrixAutoUpdate = false;
可以让我手动更新子级的转换矩阵,但它仍会应用父级转换矩阵。
对于孩子们,我想完全忽略它,但仍然能够保留其世界变换并提取其旋转,平移和缩放值。
答案 0 :(得分:0)
从某种意义上说,组中只有一个对象,因此该组的行为类似于单个实体。而且您无法将几何与组关联,因此我的建议是将平面添加为网格,然后执行您想要的任何操作。
因此更新后的代码应如下所示:
var geometry = new THREE.PlaneGeometry( 0, 0 );
var material = new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} );
var plane = new THREE.Mesh( geometry, material );
var surface = new THREE.Group();
surface.add(plane);
surface.add(new Sprite());
scene.add(surface);
答案 1 :(得分:0)
无论对 javascript 有什么看法,都能愉快地使用它!
您可以通过执行以下操作来重载特定子 Object3D 实例的 #updateMatrix 函数:
myChildObject3D.updateMatrixWorld = function( force ) {
if ( this.matrixAutoUpdate ) this.updateMatrix();
if ( this.matrixWorldNeedsUpdate || force ) {
this.matrixWorld.copy( this.matrix );
this.matrixWorldNeedsUpdate = false;
force = true;
}
}
原始的 Object3D#updateMatrixWorld 将把本地矩阵和父矩阵相乘。它还调用其子项的更新函数。
在这里,我用一个只复制局部变换矩阵的函数来切换它,这样它的变换就独立于它的父级。