线与面的碰撞
Collision between a line and a face
好的,所以在互联网上,我看到了解决这个问题的方程式,但是它们需要平面的法线,而且数学比我知道的要高得多。
基本上,如果我的光线有一个 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)));
这段代码在数学上应该可以工作,但我还没有正确测试代码。虽然我会继续努力,但我认为这个话题已经结束了。谢谢。
post 您认为适用于您的情况的方程式之一将非常有帮助。没有更多信息,我只能建议使用基本线性代数从您拥有的数据中获取平面的法向量。
在 R3 (a.k.a. 3d 数学) 中,两个向量的 cross product 将产生一个垂直于这两个向量的向量。平面法向量是垂直于平面的向量。
你可以从你提到的三个点得到两个向量在你的平面上。我们称它们为 A、B 和 C。
v1 = B - A
v2 = C - A
normal = v1 x v2
Whosebug 没有 Mathjax 格式,所以这有点难看,但你应该明白这个想法:从平面上的三个点构造两个向量,取两个向量的叉积,然后你有一个法向量。然后您应该更接近于根据您的需要调整方程式。
好的,所以在互联网上,我看到了解决这个问题的方程式,但是它们需要平面的法线,而且数学比我知道的要高得多。
基本上,如果我的光线有一个 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)));
这段代码在数学上应该可以工作,但我还没有正确测试代码。虽然我会继续努力,但我认为这个话题已经结束了。谢谢。
post 您认为适用于您的情况的方程式之一将非常有帮助。没有更多信息,我只能建议使用基本线性代数从您拥有的数据中获取平面的法向量。
在 R3 (a.k.a. 3d 数学) 中,两个向量的 cross product 将产生一个垂直于这两个向量的向量。平面法向量是垂直于平面的向量。
你可以从你提到的三个点得到两个向量在你的平面上。我们称它们为 A、B 和 C。
v1 = B - A
v2 = C - A
normal = v1 x v2
Whosebug 没有 Mathjax 格式,所以这有点难看,但你应该明白这个想法:从平面上的三个点构造两个向量,取两个向量的叉积,然后你有一个法向量。然后您应该更接近于根据您的需要调整方程式。