计算矩形是否与c ++ 3D中的光线相交

问题描述 投票:0回答:2

我有以下3D数据:

  • 射线起源(x,y,z)
  • 射线方向(x,y,z)
  • 四个矩形角(x,y,z)

现在我正在寻找一个简单的c ++函数,如果矩形与光线相交,则计算该函数。我不需要交叉点坐标,只需要“是/否”布尔。我搜索了很多但不幸的是我找不到符合我要求的任何简单功能。我希望我可以避免编写自己的函数,因为矢量计算很久以前就已经过了:-(!如果有人有想法,我会很乐意提供任何帮助。

谢谢....

编辑:

谢谢你的帮助。这正是我要搜索的内容,但是我对vxl库有问题。首先,我已下载并编译了源代码。然后,在测试lib时,当我尝试使用三个3D点创建一个平面时,出现以下错误。

“未定义引用`vgl_plane_3d :: vgl_plane_3d(vgl_point_3d const&,vgl_point_3d const&,vgl_point_3d const&)'|”

我的代码:

// -----------------------------------------------
#include <vgl/vgl_point_3d.h>
#include <vgl/vgl_plane_3d.h>
#include <vgl/vgl_intersection.h>

void createTestPlane(void);

using namespace std;

int main()
{
    createTestPlane();
    return 0;
}

void createTestPlane()
{
vgl_point_3d<double> PlaneP0(1.0,0.0,0.0);
vgl_point_3d<double> PlaneP1(1.0,0.0,1.0);
vgl_point_3d<double> PlaneP2(1.0,1.0,0.0);
vgl_plane_3d<double> testConstruction();
vgl_plane_3d<double> Plane(PlaneP0,PlaneP1,PlaneP2);
}

// -----------------------------------------------

我不知道问题出在哪里,因为“”标题中有三个3D点的构造函数。默认构造函数似乎正常工作。

部分头文件:

// -----------------------------------------------

  // Default constructor: horizontal XY-plane (equation 1.z = 0)
  inline vgl_plane_3d () : a_(0), b_(0), c_(1), d_(0) {}

  //: Construct from three non-collinear points
  //  The plane will contain all three points \a p1, \a p2 and \a p3.
  vgl_plane_3d (vgl_point_3d<T> const& p1,
                vgl_point_3d<T> const& p2,
                vgl_point_3d<T> const& p3);

// -----------------------------------------------

有人知道我做错了什么吗?

c++ 3d intersection rectangles raytracing
2个回答
0
投票

您可能想要查看VXL(http://public.kitware.com/vxl/doc/development/core/vgl/html/vgl__intersection_8h_source.html),从00240行开始是您可能想要的函数的声明。它是开源的,所以你可以使用该库或只是下载并检查代码/


0
投票

我不允许发布图表。这是图表描述:

矩形点:V0,V1,V2,V3

射线起源:O

射线方向:Dir

表面法线:N ^

P:矩形平面上的生命点。 (注意:它可能在外面)

I.计算生命值P:

N ^ =((V1-V0)X(V3-V0))。nomralize()。 X是交叉产品; N ^长度为1,表面法线。

Q = O-V0

H = Q * N ^。 *是点积; H是到矩形表面的最短距离

Dproj = Dir *( - N ^); -N ^表示还原N.

比例= H / Dproj。

P = O +(Dir).nomralized()* Scale。 Dir是归一化向量。

II。通过比较矩形区域和四个三角形区域来测试P是否在矩形内部

关于计算三角形/矩形区域的参考:http://en.wikipedia.org/wiki/Cross_product

a0 =((V0-P)X(V1-P))。length()* 0.5

a1 =((V1-P)X(V2-P))。length()* 0.5

a2 =((V2-P)X(V3-P))。length()* 0.5

a3 =((V3-P)X(V0-P))。length()* 0.5

Trec =((V1 - V0)X(V3 - V0))。length()

如果((a0 + a1 + a2 + a3)> Trec),P在外面,否则,它在里面。

希望这个解释对你有用。

© www.soinside.com 2019 - 2024. All rights reserved.