fn alignUVGizmo theObj theFace =
(
-- まず、面の法線ベクトルを取得します。
-- イメージでは青で示されます。
faceNormal = in coordsys theObj (getFaceNormal theObj theFace)
-- これはワールド スペース内で使用したい上向きベクトルです。
-- イメージでは黄色で示されます。
worldUpVector = [0,0,1]
-- 次に、面法線と上向きベクトルの乗積を取得します。
-- これにより、面法線と上向きベクトルで定義された平面に
-- 垂直なベクトルが得られます。これを平均化して、右方向を示す
-- 法線ベクトルを取得します。
-- イメージでは赤で示されます。
rightVector = normalize (cross worldUpVector faceNormal)
-- 次に、面法線と新しいベクトルを使って
-- この 2 つで定義される平面に垂直なベクトルを取得します。
-- これは、「ローカルの上向きベクトル」で、
-- 選択した面のワールド上向きベクトルの投影です。これは、
-- 面法線と右向きベクトルの両方に垂直であり、これで
-- UVW ギズモの新しい直交座標システムのうち
-- X、Y、および Z を定義する 3 つの法線が得られました。
-- 上のイメージでは、この新しいベクトルがオブジェクトの面における、
-- ワールド上向きベクトルの影として表示されています。
-- 下のイメージでは、緑で表示されています。
upVector = normalize ( cross rightVector faceNormal )
-- 3 つのベクトルを使って、matrix 3 値を定義します。
-- matrix 3 値は、ギズモの座標システムを表します。面法線は Z 軸、
-- 右向きベクトルは X 軸、ローカルの上向きベクトルは Y 軸です。
theMatrix =matrix3 rightVector upVector faceNormal [0,0,0]
theMap = Uvwmap()
modPanel.addModToSelection theMap ui: on
theMap.gizmo.transform = theMatrix
)
|