X3D嵌套Transform变换执行顺序与预期不符问题咨询
核心误解纠正
你对X3D嵌套变换的顶点计算顺序的认知没有错,问题出在对旋转变换的参考系的理解偏差:所有Transform节点定义的旋转变换,默认的旋转中心都是该节点自身所在父坐标系的原点,不会受嵌套在它内部的子节点变换影响。
你的代码效果拆解
我们逐步骤看你当前代码的顶点变换过程:
- 原生Cylinder顶点的局部坐标:默认Cylinder的几何中心在自身局部坐标系的
(0,0,0)点,高度为4时顶点y坐标范围是[-2, 2]。 - 应用内层平移变换
translation="0 2 0":所有顶点y坐标加2,此时圆柱整体上移,几何中心变为(0,2,0),顶点y坐标范围变为[0, 4]。 - 应用外层旋转变换
rotation="0 0 1 -0.785":这个旋转是绕外层Transform所在的全局坐标系原点(0,0,0)生效的,上一步得到的所有顶点(包括圆柱中心点(0,2,0))都会绕原点旋转-45度,最终呈现出来的效果自然就是旋转中心为原点。
实现预期效果的正确写法
如果你想要实现「圆柱先平移到(0,2,0),再绕自己的中心旋转」的效果,需要交换两层Transform的嵌套顺序:
<Transform translation="0 2 0"> <Transform rotation="0 0 1 -0.785"> <Shape> <Cylinder height="4" radius="0.1" /> <Appearance><Material diffuseColor="1 0 0" /></Appearance> </Shape> </Transform> </Transform>
此时变换计算顺序为:先让圆柱绕自身局部中心(内层Transform的原点(0,0,0))旋转,再把旋转完成的整个圆柱平移到(0,2,0),和你的预期完全一致。
内容的提问来源于stack exchange,提问作者korppu73
相关产品推荐
相关产品推荐

