【发布时间】:2015-09-09 19:55:20
【问题描述】:
好的,所以在互联网上,我已经看到了解决这个问题的方程,但它们需要平面的法线,并且比我知道的要高得多。
基本上,如果我的射线有 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)));
这段代码在数学上应该可以工作,但我还没有正确测试代码。艰难的我会继续努力,我认为这个话题已经结束了。谢谢。
【问题讨论】:
-
如果人们至少能告诉我为什么他们对我投了反对票,那么至少这是有益的。
-
他们很可能投反对票,因为您没有展示您已经在问题上所做的任何尝试(代码、方程式等)。我知道您可能不知道该去哪里,所以我试图提供一些进展的提示。请在您了解更多信息时更新您的问题,因为我确信您不是唯一一个解决此类问题的人。
-
我必须在这里做一些更正:
Vector normal = vt.dotProduct ...行应该使用叉积。这是两个非常不同的事情。点积返回一个标量(即一维值),其中叉积返回一个向量。接下来,该公式不会产生向量,而是产生单个标量。没有向量的划分。方程的底部项 (n * u) 是 n 和 u 的点积,它产生一个标量。
标签: java 3d line collision plane