gpt4 book ai didi

java - 线-三角形交点检查返回错误的交点

转载 作者:行者123 更新时间:2023-12-02 12:22:41 32 4
gpt4 key购买 nike

我正在为带有三角对象的 3D 场景编写一个非常基本的光线转换器,一切都工作正常,直到我决定尝试从场景原点 (0/0/0) 以外的点转换光线。

但是,当我将光线原点更改为 (0/1/0) 时,相交测试突然返回其中一个三角形的错误相交点。

我故意将光线“射向”三角形中心的方向,所以显然这应该是交点。我只是不知道到底是什么导致了我的代码中的错误结果。

(我目前没有使用 Möller-Trumbore,因为我想从更简单、更基本的方法开始,但在优化代码时我会切换到 Möller-Trumbore。)

这些是上述三角形的三个顶点的坐标:

-2.0/2.0/0.0 | 0.0/3.0/2.0 | 2.0/2.0/0.0

这是三角形的中心:

0.0/2.3333333333333335/0.6666666666666666

这是我的射线(原点 + t * 方向):

原点:0.0/1.0/0.0

方向(标准化):0.0/0.894427190999916/0.4472135954999579

这是我的程序计算出的明显错误的交点(在检查并发现该点不在三角形上之前:

0.0/5.0/1.9999999999999996

所以,是的,不难看出(即使没有计算器)光线应该在大约 t = 1.5 时击中三角形的中心。然而,我的代码返回 t 的值 4.472135954999579。

这是我的交叉点检查代码:

    public Vector intersectsWithTriangle(Ray ray, Triangle triangle) {
boolean intersects = false;

Vector triangleNormal = triangle.getNormalVector();
double normalDotRayDirection = triangleNormal.dotProduct(ray.getDirection());

if(Math.abs(normalDotRayDirection) == 0) {
// parallel
return null;
}


double d = triangleNormal.dotProduct(triangle.getV1AsVector());
double t = (triangleNormal.dotProduct(ray.getOrigin()) + d) / normalDotRayDirection;

// Check if triangle is behind ray
if (t < 0) return null;

// Get point of intersection between ray and triangle
Vector intersectionPoint = ray.getPosAt(t);

// Check if point is inside the triangle
if(isPointInTriangle(intersectionPoint, triangle, triangleNormal)) {
intersects = true;
return intersectionPoint;
}


return null;
}

你知道计算 t 的行有什么问题吗?

最佳答案

如果光线由 o + t*v 给出,并且三角形平面由法 vector n 和点 p 定义,则我们正在寻找t s.t。 n*(o + t*v) = n*p 给出 t = (n*p - n*o)/(n*v)。所以你似乎有一个符号错误,t 的正确计算应该是:

double t = (d - triangleNormal.dotProduct(ray.getOrigin())) / normalDotRayDirection;

只要光线原点是(0,0,0),错误的符号并不重要。

关于java - 线-三角形交点检查返回错误的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45662439/

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