[英]Algorithm to flatten a 3D triangle strip
請記住,您一次只會移動一個點。 由於每個三角形與上一個三角形共享兩個點,因此僅遠點需要移動,並且將圍繞其他兩個點創建的軸移動,直到它位於所需的平面上。 重復此過程,直到完成。
如果僅旋轉每個三角形,則必須旋轉所有接下來的三角形以保持幾何形狀不變-這種緩慢的方法具有二次復雜度。
取而代之的是,您可以存儲三角形頂點的相互位置並將其恢復為平面。
可能的方式(我假設頂點編號是順序的):
對於第N個點, C=P[N]
計算並存儲Len
的投影長度到線AB( A=P[N-2], B=P[N-1]
)
Len = VectorLength(VectorProduct(UnitAB, AC))
投影在那條線上的位置(作為參數t)。
t = DotProduct(AC, AB) / DotProduct(AB, AB)
要在平面上建立C'=P'[N]
,請計算
C' = A' + t * A'B' + Len * VectorProduct(UnitPlaneNormal, UnitA'B')
最快的方法是1)計算第一個三角形定義的平面的方程式2)將所有休息點投影到該平面上
我發現這個問題剛剛在 C++ 中自己實現了一個 3D 三角形帶展平算法,其目的與原始發布者尋找短路的目標無關。 我基本上采取了將第二個三角形繞着第一個三角形的公共邊旋轉並沿着條帶重復的路線。 然而,由於這個過程的累積性,我發現即使有 20 個左右的三角形,頂點位置的錯誤也會很快堆積起來,當頂點順序顛倒時,整體結果會明顯不同。
我相信這是由於在 3D 中工作的數學復雜性,所以為了回答最初的問題 2,我認為更好的方法是取三角形的邊長,然后在 2D 中從頭開始重建條帶,其中數學就簡單多了。 然后應該很容易將整個東西轉換回去以恢復 position 和第一個三角形的方向,但我認為原始海報不需要這個,我也不需要。
我要試試這個,並會在這里報告。
編輯:它沒有幫助。 請參閱下面的評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.