2015-06-23 27 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格式所以这是一个有点难看,但你应该得到的想法:构建从三个点两个向量在平面上,取将两个向量交叉,然后得到一个法线向量。然后,您应该更接近于根据您的需求调整公式。