2012年1月31日火曜日

MAXScript ハイトマップからメッシュの作成(1)

Bmp, Jpeg画像のハイトマップから地形を作成するスクリプト

-- ビットマップ
gBitmap = undefined
-- 平面のサイズ
gPlaneSizeX = 500.0
gPlaneSizeY = 500.0
-- 平面のセグメント数
gNumSegX = 25
gNumSegY = 25
-- 最大の高さ
gHeightMax = 25.0

-- メッシュの作成
fn CreatePlaneMesh len wid segX segY = 
(
 m = mesh length:len width:wid lengthsegs:segY widthsegs:segX
 return m
)

-- セグメントのインデックスからピクセルのインデックスを取得
fn GetPixIdx segIdx segNum pixNum =
(
 segIdxF = segIdx as float
 segNumF = segNum as float
 
 f = segIdxF / segNumF
 pixIdx = f * (pixNum - 1)
 return pixIdx as integer
)

-- メッシュの指定したインデックスの頂点に高さをセット
fn SetHeight m idx height =
(
 v = patch.getVert m idx
 v.z = height
 patch.setVert m idx v
)

-- メッシュにハイトマップの高さをセット
fn Mesh_SetHeightMap m nSegX nSegY bm =
(
 -- 高さをセットするメッシュの頂点のインデックス
 idx = 1
 bmWidth = bm.width
 bmHeight = bm.height

 for y = 0 to nSegY do (
  pixY = GetPixIdx y nSegY bmHeight
  pixY = pixY as integer

  for x = 0 to nSegX do (
   pixX = GetPixIdx x nSegX bmWidth
   pixX = pixX as integer
   
   -- ビッドマップからピクセルの配列を取得
   pixArray = getPixels bm [pixX, pixY] 1
   
   -- 高さ
   h = pixArray[1].r / 255.0
   h = h * gHeightMax
   
   SetHeight m idx h
   idx = idx + 1
  )
 )
)

-- ハイトマップからメッシュを作成
fn CreateMeshFromHeightmap =
(
 -- ハイトマップを開く
 fPath = getOpenFileName caption:"Open Heightmap:" \
  types:"Bmp(*.bmp)|*.bmp|Jpeg(*.jpg)|*.jpg"
 if fPath == undefined then return -1

 gBitmap = openBitMap fPath
 format "w = % h = %\n" gBitmap.width gBitmap.height

 -- メッシュを作成
 m = CreatePlaneMesh gPlaneSizeX gPlaneSizeY gNumSegX gNumSegY
 
 -- パッチに変換
 convertTo m Editable_Patch
 
 -- 高さをセット
 Mesh_SetHeightMap m gNumSegX gNumSegY gBitmap
)
-- テスト
CreateMeshFromHeightmap()

0 件のコメント:

コメントを投稿