它的作用基本上是检查与三角形阵列的碰撞,并根据它所击中的三角形的颜色绘制图像。我认为我的问题在于碰撞检测。代码在这里:
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,它有一个不同颜色的墙壁和两个形状的房间。我觉得我最接近的就是让五个墙中的四个墙正确,其中一个墙丢失了,另一个是其中一个形状的一部分。
答案 0 :(得分:1)
我不熟悉三角交叉的矩阵公式 - 听起来很贵。
我自己的代码位于下方,我的e1
和e2
等同于您的代码 - 即它们代表从v0
到v1
和{{1}的边缘向量分别:
v2
我怀疑问题出在你的光线矢量计算中,应该将其标准化。