【发布时间】:2013-06-16 07:06:45
【问题描述】:
我正在尝试显示一组嵌套网格,这些网格是我从服务器检索的并且无法更改。到目前为止,网格有点不寻常,旋转和位置都在局部坐标中,但缩放都在全局坐标中。
理想情况下,我更愿意通过将子网格添加到 THREE.Mesh 来维护层次结构,但层次结构被展平的解决方案也是可行的。
我的问题是简单地添加子网格会使子网格的大小爆炸:
this.add(child);
会使child和child的child的体积过大,因为服务器假定缩放信息没有被继承。
我试过一个简单的:
child.scale.divide(this.scale);
this.add(child);
但这不起作用,我认为这是因为 THREE.Object3D 的 matrix 被定义为 [Rotation x Scale x Translation]。
我的线性代数有点生疏了,谁能指点一下如何调整孩子的缩放向量?
【问题讨论】:
-
1.如果所有对象都直接添加到场景中,它们的位置、旋转和缩放在视觉上看起来是否正确? 2.是否要创建父
Object3D,将对象添加为父的子孙,并使其显示为(1)? -
如果我将对象直接添加到场景中,那么它们不会出现在正确的位置(通常在世界坐标中接近 0,0,0)。如果我在将子对象直接添加到场景之前添加父对象的位置,则旋转将关闭。在添加子对象之前,我可以 - 主要 - 通过将位置与父四元数相乘来纠正旋转。 “大部分”是指使用该方法以正确的位置和旋转出现在场景中的所有对象,但只有少数对象。理想情况下,我希望拥有一个带有子孙的 Object3D。
-
1.如果您以正确的层次顺序添加对象,位置和旋转是否正确 - 只有比例错误? 2. 如果是,则将比例设置为 (1, 1, 1),并使用
geometry.applyMatrix( new THREE.Matrix4().makeScale( s, s, s ) )将每个对象的几何图形放大到正确的全局大小。 -
是的,确实做到了 :-),而且几乎没有使用我生锈的线性代数。谢谢。我可以轻松地使用缩放的顶点而不是使用 scale 属性,我更喜欢在进行旋转和平移时没有适当的层次结构来依赖。
-
我把我的 cmets 变成了答案。