假設我們對如下block中的紅色線段做了標註,那麼這個標註的兩個錨點(anchor point)分別為紅色線段的2個端點
當我們旋轉這個block後,我們自然希望這個標註也跟著物體旋轉的,調整到如下合理的位置,
現在的問題是如何為這個標註求得變換矩陣。
一開始我以為只要根據紅色初始位置,跟終止位置,求得它的變換矩陣,再作用到標註上就可以了。 但是結果下來,發現自己想簡單了。在上面第二張圖中,使用者可以繼續繞著紅色線段,旋轉block,比如得到下面的形狀:
我們發現實際上第二張圖跟第三張圖中紅色線段對應的向量是一樣的,那麼計算出來的變換矩陣肯定跟第二張圖一樣,得到的一定是下面這個錯誤的結果:
正確的結果應該如下:
這個問題的本質原因在於:一條直線不能決定平面。那麼2點不能決定平面,三點總歸可以了吧。關鍵問題就是第三個點怎麼選取。這個第三個點必須相對紅色線段是穩定的,那麼當block旋轉後,我們依然能夠找回來。於是想到了求這個block的中心點,而後構建乙個平面,根據這個平面前後位置,求得變化矩陣,問題就得以解決了。
原始矩陣:
vector3d vecx = (p2 - p1).normal();
vector3d refvec = (centerpoint - p1).mormal();
vector3d vecz = vecx.crossproduct(refvec);
vector3d vecy = vecx.crossproduct(vecz);
matrix3d m0 = new matrix3d();
m0.setcoordinatesystem(p1, vecx, vecy, vecz); // orignal transform
新的矩陣:
vector3d vecx' = (p2' - p1').normal();
vector3d refvec' = (centerpoint' - p1').mormal();
vector3d vecz' = vecx'.crossproduct(refvec');
vector3d vecy' = vecx'.crossproduct(vecz');
matrix3d m1 = new matrix3d();
m1.setcoordinatesystem(p1', vecx', vecy', vecz'); // new transform
變換矩陣:
matrix3d transform = m1 * (m0.invert());