gpt4 book ai didi

c++ - c++中简单光线追踪器的问题

转载 作者:行者123 更新时间:2023-11-30 05:44:43 25 4
gpt4 key购买 nike

它所做的基本上是检查与一组三角形的碰撞,并根据碰撞到的三角形的颜色绘制图像。我认为我的问题在于碰撞检测。代码在这里:

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;
}
}

...其中“dir”是来自相机的光线方向,计算为“x - SCREEN_WIDTH/2, y - SCREEN_HEIGHT/2, focalLength”。 SCREEN_WIDTHSCREEN_HEIGHTfocalLength 是常量。 Start是相机的位置,设置为0,0,0。

我不确定 x 到底是什么以及在返回 true 之前我应该​​检查什么。 "x.x > 0 && x.y > 0 && (x.x + x.y < 1)"应该检查光线是否不仅在同一平面上而且实际上在三角形内部,以及最后一部分 ("x.z - start.z>= 0”,这是我最不确定的),如果碰撞发生在摄像头前。

我得到了图片,但无论我怎么尝试,它总是不对。它应该是具有不同颜色墙壁和其中两种形状的房间的经典 TestModel。我认为我最接近的是五面墙中有四面是正确的,远处的那面墙不见了,其中一个形状的一部分在它的另一边。

最佳答案

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

下面是我自己的代码,其中我的 e1e2 与您的相同 - 即它们代表从 v0v1v2 分别为:

// NB: triangles are assumed to be in world space
vector3 pvec = vector3::cross(ray.direction(), e2);
double det = e1.dot(pvec);
if (::fabs(det) < math::epsilon) return 0;

double invDet = 1.0 / det;
vector3 tvec(p0, ray.origin());

double u = tvec.dot(pvec) * invDet;
if (u < 0 || u > 1) return 0;

vector3 qvec = vector3::cross(tvec, e1);
double v = ray.direction().dot(qvec) * invDet;
if (v < 0 || u + v > 1) return 0;

double t = e2.dot(qvec) * invDet;
if (t > math::epsilon) { // avoid self intersection
// hit found at distance "t"
}

我怀疑问题出在你对射线 vector 的计算上,它应该被归一化。

关于c++ - c++中简单光线追踪器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29648321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com