2012年2月29日水曜日

MAXScript メッシュの作成(2)

ポリラインの作成

--  制御点の配列からポリラインを作成
fn CreatePolyLineFromPosArray posArray lineWidth = (

    ss = SplineShape pos:posArray[1]    -- posArray[1]にSplineShapeを作成
    idx = addNewSpline ss                   -- スプライン曲線を追加
    format "NewSpline idx = %\n" idx
    
    for i = 1 to posArray.Count do (
        addKnot ss idx #corner #line posArray[ i ]  
    )
    -- シェイプの更新
    updateShape ss  

    -- [ビューポートを有効]チェックボックスをオン
    ss.render_displayRenderMesh = true
    -- 矩形断面モードにする
--  ss.render_viewport_rectangular = true
    ss.render_rectangular = true

    -- 矩形断面の設定値
--  ss.render_length  = 5.0
    ss.render_width = lineWidth

--  ss.render_viewport_length = 1.0
--  ss.render_viewport_width = lineWidth
    
    -- メッシュに変換
    convertToMesh ss
    format "ss.numfaces %\n" ss.numfaces
    
    -- アップベクトル
    vUp = [0, 0, 1]
    -- 削除する面のインデックスの配列
    faceIdxArray = #()
    
    for f = 1 to ss.numfaces do (
        -- 面の法線を取得
        n = getFaceNormal ss f
        -- アップベクトルと面の法線の内積
        d = dot vUp n
    
--      if d <= 0.0 do (        -- 削除されない面がある
        if d <= 0.01 do (       
            -- 削除する面のインデックスを追加
            append faceIdxArray f
        )
    )
    
    -- 道路以外のメッシュを削除
    meshop.deleteFaces ss faceIdxArray delIsoVerts:false
    
    -- UVWMapモディファイアの追加
    -- maptype 0 - 6
    addModifier ss (UVWMap maptype:5) -- maptype 0:Planar 4:Box 5: Face
    ss
)
-- CreatePolyLineFromPosArrayのテスト
-- 制御点の配列
gPosArray1 = #()
gPosArray2 = #()
-- 制御点を追加
append gPosArray1 [0, 0, 0] 
append gPosArray1 [200, 0, 0]
append gPosArray1 [200, 50, 0]
append gPosArray1 [250, 250, 0]
append gPosArray1 [300, 450, 0]
append gPosArray1 [50, 500, 0]

append gPosArray2 [0,  -50, 0]  
append gPosArray2 [0, 100, 0]

-- 線の幅
lineWidth = 25.0

-- メッシュを作成
newSpline1 = CreatePolyLineFromPosArray gPosArray1 lineWidth
classof newSpline1
newSpline2 = CreatePolyLineFromPosArray gPosArray2 lineWidth

-- メッシュの加算
newSpline1 = newSpline1 + newSpline2
-- 追加したメッシュを削除
delete newSpline2

0 件のコメント: