-- オブジェクトに平面マッピングを適用する関数。
-- マッピングが垂直になる軸を指定するこの方向パラメータは、
-- 値 #x、#y、#z を持ちます。
--
fn ApplyPlanarMap obj direction =
(local oldcoordsys, normalize_pos
-- この場合、テクスチャ頂点の数は
-- メッシュ頂点の数に等しくなります。
obj.numtverts=obj.numverts
-- テクスチャ頂点の面を作成します。
buildTVFaces obj
-- オブジェクト座標スペースで操作します。オリジナルの座標系を保存し、
-- 後で使用します。
oldcoordsys=set coordsys local
-- メッシュ内の各頂点に対してその位置を取得し、
-- [0,0,0]から[1,1,1]の範囲に正規化します。これは、平面 UVW スペースです。
for v = 1 to obj.numverts do
( normalize_pos=((getvert obj v)-obj.min)/(obj.max-obj.min)
-- 平面マッピングが垂直である方向を基に、
-- 位置コンポーネント値をフリップします。
case direction of
(#x:( tmp=normalize_pos.x
normalize_pos.x=normalize_pos.y
normalize_pos.y=normalize_pos.z
normalize_pos.z=tmp
)
#y:( tmp=normalize_pos.y
normalize_pos.y=normalize_pos.z
normalize_pos.z=tmp
)
)
-- 一致するテクスチャ頂点の「位置」を設定
settvert obj v normalize_pos
)
-- テクスチャ頂点の「位置合わせ」が終了。テクスチャ面を作成します。
-- この場合、メッシュとテクスチャ頂点は 1 対 1 に対応するため、
-- メッシュの面に対する頂点インデックスは、
-- テクスチャ面に対するテクスチャ頂点インデックスでもあります。
for f = 1 to obj.numfaces do
setTVFace obj f (getface obj f)
-- 完了。座標系をリセットします。
set coordsys oldcoordsys
-- メッシュを更新して 3ds Max に変更を適用します。
update obj
)
--
-- テスト ベッド --球を作成し、マテリアルを適用して拡散反射光マップを
-- タイルされた 2x3 チェック マップに設定します。チェック テクスチャ マップの
-- ビューポート表示をオンにし、ApplyPlanarMap 関数を呼び出します。
--
g=geosphere()
convertToMesh g
g.material=standard()
g.material.maps[2]=checker()
g.material.maps[2].coordinates.u_tiling=2
g.material.maps[2].coordinates.v_tiling=3
showTextureMap g.material g.material.maps[2] true
ApplyPlanarMap g #x
|