今天在寫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