2010-12-06 74 views
0

我正在爲3D平臺遊戲玩家編寫碰撞檢測系統。所有的基礎都運作良好。但是當角色出現在陡坡多邊形上時,我需要他們滑下多邊形的斜坡。我可以完成大部分工作,但我無法找到如何計算與它們碰撞的給定多邊形的斜率相匹配的向下向量。我搜索了很多論壇,包括這個論壇,但找不到答案。如何計算3D多邊形的向下傾斜矢量?

每個多邊形由世界空間中的3個頂點(x,y,z)組成。

我也有每個多邊形的表面法線,並熟悉點和交叉產品。

我也可以通過獲取面法線和世界向量的點乘積的arccos來計算多邊形的簡單角度值,它給出多邊形的坡度與地平面的角度,如60度。如果角度超過60度,我決定角色應該滑下斜坡。但是我需要與多邊形的斜率相匹配的向下矢量,所以我可以隨着時間的推移將它們的位置應用於它,從而滑落。

我相信斜率矢量應該垂直於曲面法線,但我不知道如何計算它給出的信息。

感謝您的幫助......

回答

0

如果你想矢量獨立播放器的速度的只是找到你的三角形的中心,並從一個矢量到最低的頂點。省略的退化情況測試中,它看起來是這樣的:

Vertex center = Sum(vertex[0], vertex[1], vertex[2])/3; 
Vertex lowest = Min(vertex[0], vertex[1], vertex[2]); // min of your up/down coordinate 
Vector slopeVector = Normalize(lowest - center); 

編輯: 其中所希望的「低」點不在頂點的方向。這不會爲等邊三角形或那些工作。更一般的解決方案可能是將法線圍繞由三角形中心定義的軸和在最高點和最低點之間的半徑三角形側的點旋轉90度。

理想情況下,您不需要獨立計算此值,而是計算與許多三角形內插的整體斜率梯度,就像計算內插頂點法線一樣。

0

我現在手邊沒有數學,但是如果通過按正常平面(通過去除向上的矢量)找到二維方向,留下二維方向/大小怎麼辦?您甚至可以通過使用具有標準化法線的1-UpVector(1-平坦地形法線= 0,1-純粹垂直懸崖= 1)來騙取和獲得坡度。

您可以使用Y分量來決定何時斜率足夠大以應用2D分量。

我不知道它是否會非常準確,但它至少會給你一個快速的近似值。

3

您還需要指定「向下」向量。

那麼我相信你所要求的是下降矢量到三角形法線所定義的平面中的歸一化投影。

nonUnitAnswer = down - dot(down, triangleNormal) * triangleNormal; // could be 0 
answer = normalize_safe(nonUnitAnswer); 

(你會注意到,該點爲正意味着你有一個向下的多,這對於你的滑動情況下,你可能要處理不同)

(進一步,點的大小可能對應於你想要滑動多少,和/或如果你想滑動的話,可以選擇一些截止點)

+0

+1我以前是這樣做的。如果您將向下矢量的大小設置爲等於您的引力,那麼非標準化的nonUnitAnswer矢量將成爲在下坡方向上作用的引力的組成部分 - 這是一個有用的值。 – 2010-12-08 03:07:37