【问题标题】:Compiling triangle intersection code?编译三角形交点代码?
【发布时间】:2019-04-12 04:49:01
【问题描述】:

我的 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;

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

然后我把所有的代码都改写成这样:

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 中这样做,也不愿链接一些向量库。谢谢!

【问题讨论】:

  • Operator overloading的可能重复
  • 您需要定义算术运算符,例如operator+operator- 等。
  • @SouravGhosh: T 显然是Triangle
  • @TonyK 我不明白它对你来说是如何明显的。我已经看到了由这种明显信念引起的成千上万的错误。是的,我评论中的“呵呵”部分错字,应该是here
  • 只是为了好奇:不是有2个交叉点吗?

标签: c++ c collision-detection raytracing


【解决方案1】:

问题来了:

n = u * v;

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

【讨论】:

    【解决方案2】:

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

    假设已经为对象指定了类: ...

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多