【问题标题】:Collision between a line and a face线与面的碰撞
【发布时间】: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


【解决方案1】:

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

在 R3(又名 3d 数学)中,两个向量的 cross product 将产生一个垂直于这两个向量的向量。平面法向量是垂直于平面的向量。

你可以从你提到的三个点得到两个位于你的平面上的向量。我们称它们为 A、B 和 C。

v1 = B - A

v2 = C - A

normal = v1 x v2

Stackoverflow 没有 Mathjax 格式,所以有点难看,但你应该明白:从平面上的三个点构造两个向量,取两个向量的叉积,然后你就有一个法线向量.然后,您应该更接近于使方程式适应您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多