3d 检查点是否位于平面段内

3d 检查点是否位于平面段内,3d,point,plane,3d,Point,Plane,我想知道平面线段中的一个点,以及它相对于线段在[0,1][0,1]中的坐标。e、 g 0,0左下角,1,1右上角,0.5,0.5中心 这些是我已经知道的事情: -点与平面线段位于同一平面上。 -平面段的4个点的坐标。但它们不是按时间顺序排列的,也不是我所知道的任何顺序。 -平面的法线及其到原点的距离。例如,;ax+by+cz+d。x、 y,z,d是已知的 这是我画的草图: A、 B、C点与平面段在同一平面上。P1、P2、P3、P4坐标已知,但没有以任何有意义的方式进行排序 多谢各位 编辑: 我的

我想知道平面线段中的一个点,以及它相对于线段在[0,1][0,1]中的坐标。e、 g 0,0左下角,1,1右上角,0.5,0.5中心

这些是我已经知道的事情:

-点与平面线段位于同一平面上。 -平面段的4个点的坐标。但它们不是按时间顺序排列的,也不是我所知道的任何顺序。 -平面的法线及其到原点的距离。例如,;ax+by+cz+d。x、 y,z,d是已知的

这是我画的草图: A、 B、C点与平面段在同一平面上。P1、P2、P3、P4坐标已知,但没有以任何有意义的方式进行排序

多谢各位

编辑:

我的一个想法是

  • 排序点

  • 在每个点之间创建向量

  • 从2个点创建向量

  • 点积

  • 如果度数在0到90之间,则在内部

这样行吗?我需要好的实时性能,难道dot产品的CPU速度不是很慢吗?
如何找到点的相对坐标?

我认为最好的检查方法是将整个平面和点变换到坐标系的原点:平移每个点,使左底点位于坐标系的中心,旋转所有物体,使法向量与其中一个轴平行。这意味着对每个点进行矩阵乘法,但在此之后,您可以轻松检查矩形中的点。这是一个XNA C#实现,但逻辑在任何地方都是一样的:(我试着使用您的草图作为输入)

这适用于任何四点


这不是最快的解决方案,但如果你知道矩阵变换,我相信这是最干净最简单的。如果您找到任何更快但简单的解决方案,我也很感兴趣,但可能不会有性能问题。在我的英特尔2.4ghz处理器上,这种计算在1秒内进行了100多万次,没有任何问题。希望这有帮助,祝你好运

在我看来,检查这一点的最佳方法是将整个平面和点变换到坐标系的原点:平移每个点,使左底点位于坐标系的中心,旋转所有点,使法向量与其中一个轴平行。这意味着对每个点进行矩阵乘法,但在此之后,您可以轻松检查矩形中的点。这是一个XNA C#实现,但逻辑在任何地方都是一样的:(我试着使用您的草图作为输入)

这适用于任何四点


这不是最快的解决方案,但如果你知道矩阵变换,我相信这是最干净最简单的。如果您找到任何更快但简单的解决方案,我也很感兴趣,但可能不会有性能问题。在我的英特尔2.4ghz处理器上,这种计算在1秒内进行了100多万次,没有任何问题。希望这有帮助,祝你好运

我找到了找到我想要的东西的方法。这是:(代码是C++/Ogre)


这只计算了我们想要的2个归一化函数和2个点积。

我找到了一种方法来找到我想要的。这是:(代码是C++/Ogre)


这只计算了我们想要的2个归一化函数和2个点积。

Vector3.Transform做什么?我只有矩阵*向量函数,我猜这不是我的问题,我的问题是,平面段的点不是有序的。所以我不能说这是左上角左右。我有4个点是平面角。在一个侧面节点上,我还有平面的法线及其到原点的距离。例如,;ax+by+cz+d。x、 y,z,d是已知的。如果这有帮助的话。Vector3变换只是将矩阵与向量相乘,因此它们是相同的。无论如何,该方法仍然可以在不指定左下角的情况下工作。我可以选择不同的向量来创建右向量和前向量,其余的都是一样的,你可以得到XY平面上的每个向量。重要的一点是,右向量和前向量必须是垂直的。相机看到左上角时,左上角不必是左上角。左上应该紧挨着左下和右上。我不能保证我现在有顶点。这里是C++/OGR3D实现。我没有得到与你的样本点相同的结果。向量3.变换做什么?我只有矩阵*向量函数,我猜这不是我的问题,我的问题是,平面段的点不是有序的。所以我不能说这是左上角左右。我有4个点是平面角。在一个侧面节点上,我还有平面的法线及其到原点的距离。例如,;ax+by+cz+d。x、 y,z,d是已知的。如果这有帮助的话。Vector3变换只是将矩阵与向量相乘,因此它们是相同的。无论如何,该方法仍然可以在不指定左下角的情况下工作。我可以选择不同的向量来创建右向量和前向量,其余的都是一样的,你可以得到XY平面上的每个向量。重要的一点是,右向量和前向量必须是垂直的。相机看到左上角时,左上角不必是左上角。左上应该紧挨着左下和右上。我不能保证我现在有顶点。这里是C++/OGR3D实现。我没有得到与你的样本点相同的结果。是的,但是你说你也需要相对坐标。。。在我看来,问一个更复杂的问题而不标出正确的答案是不公平的,因为你为一个更容易的问题找到了解决方案……你的答案比较慢,但很完整。不管怎样,我决定选择physx raycasting。它速度更快,适用于每个网格。至少我学了一些数学:)是的,但是你说你也需要相对坐标。。。在我看来,问一个更复杂的问题却不标出正确的答案是不公平的,因为你为一个更简单的问题找到了解决方案……你知道吗
// Inputs - Right handed coordinate system
Vector3 p1 = new Vector3(-1.0f, 1.0f, 1.0f);  // left top
Vector3 p2 = new Vector3(1.0f, -1.0f, 0.0f);  // right bottom
Vector3 p3 = new Vector3(1.0f, 1.0f, 1.0f);   // right top, redundant if this is a rectangle
Vector3 p4 = new Vector3(-1.0f, -1.0f, 0.0f); // left bottom

Vector3 a = new Vector3(-0.5f, 0.0f, 0.5f);

// Calculating transformation matrix
Vector3 right = Vector3.Normalize(p2 - p4);
Vector3 forward = Vector3.Normalize(p1 - p4);
Vector3 up = Vector3.Cross(right, forward);

Matrix transform = new Matrix();
transform.M11 = right.X;
transform.M12 = right.Y;
transform.M13 = right.Z;
transform.M14 = 0.0f;
transform.M21 = forward.X;
transform.M22 = forward.Y;
transform.M23 = forward.Z;
transform.M24 = 0.0f;
transform.M31 = up.X;
transform.M32 = up.Y;
transform.M33 = up.Z;
transform.M34 = 0.0f;
transform.M41 = p4.X;
transform.M42 = p4.Y;
transform.M43 = p4.Z;
transform.M44 = 1.0f;

transform = Matrix.Invert(transform);

// Transforming
Vector3 tp1 = Vector3.Transform(p1, transform);
Vector3 tp2 = Vector3.Transform(p2, transform);
Vector3 tp3 = Vector3.Transform(p3, transform);
Vector3 tp4 = Vector3.Transform(p4, transform);
Vector3 ta = Vector3.Transform(a, transform);

ta.X /= tp2.X; // divide with rectangle width
ta.Y /= tp1.Y; // divide with rectangle height

// Now everything is on the XY plane
// P1: {X:0    Y:2.236068 Z:0}
// P2: {X:2    Y:0        Z:0}
// P3: {X:2    Y:2.236068 Z:0}
// P4: {X:0    Y:0        Z:0}
// A:  {X:0.25 Y:0.5      Z:0}
    // top or bottom vector of rectangle
Ogre::Vector3 right = Ogre::Vector3(vertices[3] - vertices[2]); 
right.normalise();
    // vector opposite of the top vector
Ogre::Vector3 left = Ogre::Vector3(vertices[0] - vertices[1]); 
left.normalise();


    // you may store above values if rectangle doesnt move much. this would reduce amount of operations


    // vector from top vertex to position we are checking
Ogre::Vector3 p2ToPos = Ogre::Vector3(pos - vertices[2]);
p2ToPos.normalise();

    // vector from bot vertex to position we are checking
Ogre::Vector3 p1ToPos = Ogre::Vector3(pos - vertices[1]);
p1ToPos.normalise();

    // angle between our vectors
Ogre::Real dot1 = p2ToPos.dotProduct(right);
Ogre::Real dot2 = p1ToPos.dotProduct(left);

    // is both dot products (which gives cos) are positive point is between our rectangle
if(dot1 > 0 && dot2 > 0)
    return true;