Three.js子级忽略父级转换

时间:2018-07-31 04:48:12

标签: javascript matrix three.js transform

假设我在一个场景中有一个父对象和该父对象的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;可以让我手动更新子级的转换矩阵,但它仍会应用父级转换矩阵。

对于孩子们,我想完全忽略它,但仍然能够保留其世界变换并提取其旋转,平移和缩放值。

2 个答案:

答案 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 将把本地矩阵和父矩阵相乘。它还调用其子项的更新函数。

在这里,我用一个只复制局部变换矩阵的函数来切换它,这样它的变换就独立于它的父级。