unity 網格切割演算法講解

2021-07-14 08:46:54 字數 1720 閱讀 5113

演算法主要的方法為    public static list> getendcuttingpolygonverticles(listoriginpoints, vector3 startpos, vector3 endpos),

list陣列存的是網格的頂點,第二個引數和第三個引數表示切割線段的起始節點和線段的末節點,首先我們會判斷線段兩頭的點是否在多邊形內,下面我就不講原理了,直接給**吧, 有興趣的同學可以上wiki上搜搜相關的**。

private static bool pointinpolygon(vector3 pointtocheck, listpolygon)

else

var p1 = pointtocheck - minpoint;

var p2 = maxpoint - minpoint;

bool b = (curpoint.x < pointtocheck.x) == (pointtocheck.x <= lastpoint.x);

if (b && (p1.x * p2.y - p1.y * p2.x > 0))

lastpoint = curpoint;}}

return flag;

}

如果我們切割線段的2個頂點都不在該多邊形網格圖形內的話,表示可以切割,反之則表示無法切割。如果可以切割的話,先取出線段與多邊形的交點陣列。方法如下:

public static listgetcuttingpoints(listoriginpoints, vector3 startpos, vector3 endpos)

else if (list[0].veindex == 1)

else

tempvertexpoints.add(new vertexpoint(list[0].pos, pre, next));

}else if (list.count == 2)//2條線段相交如果存在2個交點的話。那麼就只有一種情況了,就是他們不但平行,而且網格中相鄰的2個點組成的線段在切割線段中間(大家考慮是不是這樣)}}

tempvertexpoints = getdistinctpoints(tempvertexpoints);

return tempvertexpoints;

}

求完了切割線段和網格的所有交點後。接下來就是通過交點來分割整個網格了,那麼接下來寫通過交點來分割網格,同時他也是對外的重要方法:

public static list> getendcuttingpolygonverticles(listoriginpoints, vector3 startpos, vector3 endpos)}}

}var lasttri = new list();

for (int i = 0; i < originpoints.count; i++)

for (int j = 0; j < temppoints.count; j++)}}

endvalues.add(lasttri);

return endvalues;

}

這裡貼出所有工具類,個人覺得對於網格的操作是非常重要的,同時也較基本的遊戲-三消,塔防,卡牌類遊戲製作較為麻煩,同時任何乙個遊戲引擎都會用到,這些都是關於渲染的問題,可能比一些遊戲邏輯理解起來費勁,但是個人還是建議大家可以好好學學,這樣才可能走的更遠,接觸到低層渲染問題。最後貼出網格生成和網格切割演算法吧

Unity網格介紹

本片文章是對處理人臉識別時對已有網格資訊重建時學習總結的一點對網格的認識,比較基礎,o o哈哈哈 網格 meshes 包括頂點和多個三角形陣列。三角形陣列僅僅是頂點的索引陣列,每個三角形包含三個索引。每個頂點可以有一條法線,兩個紋理座標,及顏色和切線。雖然這些是可選的,但是也可以去掉。所有的頂點資訊...

unity 網格細分

簡單描述 獲取資料 得到mesh的頂點資料,得到mesh切線資料,根據切線計算出三角面的個數。切線數 3。三角面計算 遍歷三角面個數次 有多少個三角面遍歷多少次 計算出乙個三角面的三個頂點。通過三條邊的中心點切割,將乙個三角面分割成6個頂點三個面 從頂點重新計算網格的邊界體積。mesh.recalc...

Unity換裝之合併網格

為了提高遊戲效能,需要對人物進行換裝後,講人物各個部分再進行組合,形成乙個整體的網格,所以需要合併網格,骨骼,材質等。下面是從resources中載入人物各個部分,然後再組裝。首先載入的骨骼,再載入其他部分。void loadresource void addpart string partname...