好吧,在互联网上,我已经看到方程式来解决这个问题,但他们需要平面的法线,并且数学数据比我知道的要高很多。基本上,如果我对于我的射线有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应该工作,但我还没有正确测试代码。艰难的我会继续努力,我认为这个话题完成了。谢谢。
如果人们至少会告诉我为什么他们低估了我,那么至少这会是有益的。 –
他们很可能是downvoting,因为你没有显示你已经在这个问题上已经做出的任何尝试(代码,方程等)。我知道你可能会停留在哪里,所以我试图提供一些提示。请更新你的问题,因为我确信你不是唯一一个处理这类问题的人。 –
我必须在这里做一些更正:'Vector normal = vt.dotProduct ...'行应该使用交叉产品。这是两个完全不同的东西。点积返回一个标量(即一维值),其中叉积返回一个向量。 接下来,该公式不会产生一个向量,它会产生一个标量。没有向量的划分。等式('n * u')的底部项是n和u的点积,它产生一个标量。 –