2015-06-23 26 views
-3

好吧,在互聯網上,我已經看到方程式來解決這個問題,但他們需要平面的法線,並且數學數據比我知道的要高很多。基本上,如果我對於我的射線有x,y,z位置(以及x,y,z旋轉),並且對於代表我的平面的三個點我有x,y,z,那麼我將如何解決碰撞點?一條線和一張臉的碰撞

我之前完成過2D碰撞,但我對如何在3D中工作毫無頭緒。另外,我在java中工作,儘管我已經足夠了解C#了。

感謝下面的答案,我能夠找到我臉部的正常。這就讓我通過摸索與http://geomalgorithms.com/a05-_intersect-1.html,想出下面的代碼(手工製作矢量數學除外):

Vertice Vertice1 = faces.get(f).getV1(); 
Vertice Vertice2 = faces.get(f).getV2(); 
Vertice Vertice3 = faces.get(f).getV3(); 

Vector v1 = vt.subtractVertices(Vertice2, Vertice1); 
Vector v2 = vt.subtractVertices(Vertice3, Vertice1); 
Vector normal = vt.dotProduct(v1, v2); 

//formula = -(ax + by + cz + d)/n * u where a,b,c = normal(x,y,z) and where u = the vector of the ray from camX,camY,camZ, 
// with a rotation of localRotX,localRotY,localRotZ 

double Collision = 
       -(normal.x*camX + normal.y*camY + normal.z*camZ)/vt.dotProduct(normal, vt.subtractVertices(camX,camY,camZ, 
       camX + Math.sin(localRotY)*Math.cos(localRotX),camY + Math.cos(localRotY)*Math.cos(localRotX),camZ + Math.sin(localRotX))); 

此代碼,mathimatically應該工作,但我還沒有正確測試代碼。艱難的我會繼續努力,我認爲這個話題完成了。謝謝。

+0

如果人們至少會告訴我爲什麼他們低估了我,那麼至少這會是有益的。 –

+0

他們很可能是downvoting,因爲你沒有顯示你已經在這個問題上已經做出的任何嘗試(代碼,方程等)。我知道你可能會停留在哪裏,所以我試圖提供一些提示。請更新你的問題,因爲我確信你不是唯一一個處理這類問題的人。 –

+0

我必須在這裏做一些更正:'Vector normal = vt.dotProduct ...'行應該使用交叉產品。這是兩個完全不同的東西。點積返回一個標量(即一維值),其中叉積返回一個向量。 接下來,該公式不會產生一個向量,它會產生一個標量。沒有向量的劃分。等式('n * u')的底部項是n和u的點積,它產生一個標量。 –

回答

0

發佈您認爲適用於您的情況的其中一個方程將非常有幫助。如果沒有更多的信息,我只能建議使用基本的線性代數從您擁有的數據中獲取平面的法向量。

在R (也稱爲3d數學)中,兩個向量的cross product將產生垂直於這兩個向量的向量。平面法線矢量是垂直於平面的矢量。

你可以從你提到的三點中得到兩個在你的飛機上的向量。讓我們稱他們爲A,B和C

v1 = B - A 

v2 = C - A 

normal = v1 x v2 

#1沒有Mathjax格式所以這是一個有點難看,但你應該得到的想法:構建從三個點兩個向量在平面上,取將兩個向量交叉,然後得到一個法線向量。然後,您應該更接近於根據您的需求調整公式。