在c ++中使用简单的光线跟踪器的问题

时间:2015-04-15 10:53:39

标签: c++ graphics linear-algebra raytracing glm-math

它的作用基本上是检查与三角形阵列的碰撞,并根据它所击中的三角形的颜色绘制图像。我认为我的问题在于碰撞检测。代码在这里:

for (int i = 0; i < triangles.size(); i++){
    vec3 v0 = triangles[i].v0;
    vec3 v1 = triangles[i].v1;
    vec3 v2 = triangles[i].v2;
    vec3 e1 = v1 - v0;
    vec3 e2 = v2 - v0;
    vec3 b = start - v0;
    mat3 A(-dir, e1, e2);
    vec3 x = glm::inverse(A) * b;

    if (x.x > 0 && x.y > 0 && (x.x + x.y < 1) && (x.z - start.z>= 0)){
        return true;
    }
}

...其中&#34; dir &#34;是来自相机的光线的方向,计算为&#34; x - SCREEN_WIDTH / 2,y - SCREEN_HEIGHT / 2,focalLength &#34;。 SCREEN_WIDTH SCREEN_HEIGHT focalLength 是常量。 开始是相机的位置,设置为0,0,0。

我不确定的是x真的是什​​么以及在返回true之前我应该​​检查什么。 &#34; x.x&gt; 0&amp;&amp; x.y&gt; 0&amp;&amp; (x.x + x.y&lt; 1)&#34;应该检查光线是否不仅在同一平面上,而且实际上在三角形内部,以及最后一部分(&#34; xz - start.z&gt; = 0 &#34;,如果碰撞发生在镜头前,那么我最不确定。

我得到了图像,但无论我尝试了多少图像都是对的。它应该是一个经典的TestModel,它有一个不同颜色的墙壁和两个形状的房间。我觉得我最接近的就是让五个墙中的四个墙正确,其中一个墙丢失了,另一个是其中一个形状的一部分。

1 个答案:

答案 0 :(得分:1)

我不熟悉三角交叉的矩阵公式 - 听起来很贵。

我自己的代码位于下方,我的e1e2等同于您的代码 - 即它们代表从v0v1和{{1}的边缘向量分别:

v2

我怀疑问题出在你的光线矢量计算中,应该将其标准化。