编译三角形交叉码?

时间:2015-06-02 11:09:50

标签: c++ c collision-detection raytracing

我的Google-fu只显示了一个返回光线和三角形交点的结果: http://geomalgorithms.com/a06-_intersect-2.html

我绝对没有运气编译它。我已经为点/向量做了这个:

typedef struct {
    float x, y, z;
} Vector;
typedef struct {
    float x, y, z;
} Point;
typedef struct {
    Vector P0, P1;
} Ray;
typedef struct {
    Point V0, V1, V2;
} Triangle;

然后它会抛出有关此代码的错误:

u = T.V1 - T.V0;
v = T.V2 - T.V0;
n = u * v;

“不匹配运算符 - (操作数类型是点和点)”

然后我重写了所有代码:

u.x=T.V1.x-T.V0.x;
u.y=T.V1.y-T.V0.y;
u.z=T.V1.z-T.V0.z;
v.x=T.V2.x-T.V0.x;
v.y=T.V2.y-T.V0.y;
v.z=T.V2.z-T.V0.z;
n.x=u.x*v.x;
n.y=u.y*v.y;
n.z=u.z*v.z;

但它仍然说射线{3,1,-3} {3,-1,-3}不在三角形内{-10,0,-10} {10,0,10} {10, 0,-10}。不过,我在Blender中检查了这个,并且光线确实与三角形相交。

任何人都可以请指出我做错了什么,或链接到另一个页面,其功能将返回线段与三角形相交的确切点?我宁愿在C中做这个而不是链接一些矢量库。谢谢!

2 个答案:

答案 0 :(得分:1)

问题在于:

n = u * v;

这必须被解释为矢量积 n = u x v ,而不是分量乘法。

答案 1 :(得分:0)

我相信该页面的作者并不打算在那里发布有效的开箱即用的C ++,正如他用来编写该语言名称的引号所暗示的那样。要将伪代码转换为可编译代码,您需要自己实现一些运算符,例如两个3D向量的交叉乘积(顺便说一下,这很简单)。

  

假设已经为对象提供了类:   ...