线和面之间的碰撞

时间:2015-06-23 20:11:11

标签: java 3d line collision plane

好的,所以在互联网上,我已经看到解决这个问题的等式,但它们需要平面的法线,并且比我知道的要高得多。

基本上,如果我的光线有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)));

这个代码,数学上应该可以工作,但我还没有正确测试代码。我会继续努力,我认为这个主题已经完成了。谢谢。

1 个答案:

答案 0 :(得分:0)

发布您认为适用于您的情况的其中一个方程式会非常有帮助。如果没有更多信息,我只能建议使用基本线性代数从您拥有的数据中获取平面的法向量。

在R 3 (a.k.a。3d数学)中,两个向量的cross product将产生垂直于两个向量的向量。平面法线向量是垂直于平面的向量。

你可以从你提到的三个点获得两个位于飞机上的矢量。我们称他们为A,B和C.

v1 = B - A

v2 = C - A

normal = v1 x v2

Stackoverflow没有Mathjax格式,所以有点难看,但你应该明白:从平面中的三个点构造两个向量,取两个向量的叉积,然后你有一个正常的向量。然后你应该更接近根据你的需要调整方程式。