在threejs中對3D物體旋轉的思考

        今天在寫threejs時,突然想到一個問題:一個3D物體需要旋轉時,一般情況下簡單的旋轉我都是使用歐拉角,稍微複雜一些的情況我會把歐拉角轉換成四元數進行旋轉(歐拉角複雜旋轉可能會產生的死鎖問題),但是在threejs中object3D的旋轉方法無論是使用setRotation(沿着x、y、z軸旋轉)還是rotateOnAxis(按從原點到任意方向的向量進行旋轉)都無法完成沿着一個不經過原點的軸進行旋轉(或者是我沒有發現),但是實際應用的情況是存在的,比如一個大箱子,再某種情況下我們需要他沿着y軸旋轉,另一種情況,我們又需要他沿着它的底邊翻轉(相當於一個大箱子放在地上,人去推他把它翻了個個)。

(靈魂畫風,中間那個點就是物體的原點,箭頭是物體的旋轉軸)

        在opengles中,這種解決情況十分簡單,我們只需要先保存這時的矩陣狀態,然後向下移動世界座標系,當世界座標系的z軸和箱子的底邊重合時進行旋轉,旋轉完成之後恢復之前保存矩陣即可。在u3d中也可以輕易地使用方法,設置一個軸的起點和終點讓某個物體沿着這個軸旋轉。

        在threejs中沒有這個方法,於是我想到了一種辦法,先創建一個object相當於一個大的容器,然後把box執行翻箱子動作的旋轉軸放到object的z軸上,然後把box添加爲object的子類,當需要box沿y軸旋轉時,轉動box的y軸box.setRotationY(x);當需要翻箱子時則選中box的父類object的z軸object.setRotationZ(x);由於box是object的子類,當父類移動時,子類也會跟着移動,就像一個小盒子被粘在了一個大盒子內部一樣,這樣就實現了讓box沿不經過原點的任意軸旋轉。

(大概就是這麼個意思~不會用win10的畫板-- --)

        其實這個技巧是巧妙的利用了子類和父類的關係,大家有什麼更好的方法,可以告訴我~

        最後發現這個網站,更加直觀地說明了這個問題:https://jsfiddle.net/b4wqxkjn/5/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章