【发布时间】:2016-11-21 22:08:26
【问题描述】:
当我将 Object3D 添加到另一个 Object3D(“add”方法)时,子级会根据父级更改其变换。
在将孩子添加到父母后,有没有办法保持孩子的位置/旋转/比例?
小提琴:https://jsfiddle.net/pqfzd8a2/1/
mesh = new THREE.Mesh(geometry, material);
mesh.position.y = 25;
var mesh2 = mesh.clone();
mesh2.position.y = 80;
var mesh3 = mesh2.clone();
mesh.rotation.z = Math.PI*0.25;
scene.add(mesh);
mesh.add(mesh2);
scene.add(mesh3);
做了什么?
- 网格已旋转。
- mesh2 和mesh3 是彼此相同位置的克隆。
- mesh2 已添加到网格中,而 mesh3 已添加到场景中。
mesh2 和mesh3 的区别在于它们被添加(父级)到不同的父级(相应地添加到网格和直接添加到场景中)。在被添加(父母)之前,他们处于相同的位置。关键是将对象保持在添加(父级)之前的位置。
预期结果:mesh2 和mesh3 应该在相同的位置。
实际结果:mesh2添加后改变了位置/旋转/缩放。
如何使对象在成为父对象后保持其全局变换?
【问题讨论】:
-
具体的用例是什么?为什么你真的需要一个子对象,它应该在层次结构中的父级?为什么你不能把孩子移到另一个层次?
-
移动子对象在物理和传感器系统中很重要,这些对象可能会改变它们的放置位置(即使在运行时)。对象(世界)的位置应该始终保持不变。本地矩阵应该反映父关系(这就是为什么它是本地空间)。改变层次结构是没有问题的,事实上世界矩阵正在被修改,因此每次移动它时,你都需要有一个前后行为来维护它。这是一个典型的场景图错误,使管理对象变得极其困难。
-
对 q 的回应:我建议您实现自己的 Push/Pop 堆栈并创建自己的子/父层次结构。否则管理动态实体的大型场景结构将非常困难。如果您想要更“松散”的层次结构,可以使用轻量级位置数据库。我已经为此目的实施了 OpenSteers LQ DB。
标签: three.js transform reparenting