在threejs中对3D物体旋转的思考

今天在写threejs时,忽然想到一个问题:一个3D物体须要旋转时,通常状况下简单的旋转我都是使用欧拉角,稍微复杂一些的状况我会把欧拉角转换成四元数进行旋转(欧拉角复杂旋转可能会产生的死锁问题),可是在threejs中object3D的旋转方法不管是使用setRotation(沿着x、y、z轴旋转)仍是rotateOnAxis(按从原点到任意方向的向量进行旋转)都没法完成沿着一个不通过原点的轴进行旋转(或者是我没有发现),可是实际应用的状况是存在的,好比一个大箱子,再某种状况下咱们须要他沿着y轴旋转,另外一种状况,咱们又须要他沿着它的底边翻转(至关于一个大箱子放在地上,人去推他把它翻了个个)。网站

(灵魂画风,中间那个点就是物体的原点,箭头是物体的旋转轴).net

        在opengles中,这种解决状况十分简单,咱们只须要先保存这时的矩阵状态,而后向下移动世界坐标系,当世界坐标系的z轴和箱子的底边重合时进行旋转,旋转完成以后恢复以前保存矩阵便可。在u3d中也能够轻易地使用方法,设置一个轴的起点和终点让某个物体沿着这个轴旋转。3d

        在threejs中没有这个方法,因而我想到了一种办法,先建立一个object至关于一个大的容器,而后把box执行翻箱子动做的旋转轴放到object的z轴上,而后把box添加为object的子类,当须要box沿y轴旋转时,转动box的y轴box.setRotationY(x);当须要翻箱子时则选中box的父类object的z轴object.setRotationZ(x);因为box是object的子类,当父类移动时,子类也会跟着移动,就像一个小盒子被粘在了一个大盒子内部同样,这样就实现了让box沿不通过原点的任意轴旋转。blog

(大概就是这么个意思~不会用win10的画板-- --)three

        其实这个技巧是巧妙的利用了子类和父类的关系,你们有什么更好的方法,能够告诉我~io

        最后发现这个网站,更加直观地说明了这个问题:https://jsfiddle.net/b4wqxkjn/5/class

相关文章
相关标签/搜索