【问题标题】:Three.js child ignore parent transformation三.js子忽略父变换
【发布时间】:2019-01-07 09:24:20
【问题描述】:

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

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

【问题讨论】:

  • 您能否分享您为获得更好答案而创建的网格的代码。
  • 是的,我已经发布了网格创建代码。
  • 这是一个组,而不是一个网格! threejs.org/docs/#api/objects/Group请先去这个链接。
  • 你为什么要这样做?为什么不将曲面创建为独立网格?如果表面打算独立于其他对象(精灵)进行变换,那么它应该独立于它们。
  • 我想提取并有选择地将某些特征从父级应用到子级...我不想应用整个转换矩阵,我想制作一个自定义矩阵,我可以在其中选择和提取父母的特征并将它们应用到孩子身上,这不是 Three.js 为我完成的

标签: javascript matrix three.js transform


【解决方案1】:

从某种意义上说,组中只有一个对象,因此组的行为就像一个单一的实体。而且你不能将几何与组关联,所以我的建议是将平面添加为网格,然后做任何你想做的事情。

所以更新后的代码如下所示:

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);

【讨论】:

  • 这不能回答问题。不管它是否是一个组,我都希望保持父级的变换矩阵不变,但忽略每个子级的父级变换矩阵。
【解决方案2】:

关于 javascript 有什么要说的,用 hack 很高兴!

您可以通过执行以下操作来重载特定子 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 会将本地矩阵和父矩阵相乘。它还对其子级调用更新函数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多