gpt4 book ai didi

c++ - 光线追踪锥。判别式给出 -ve 值,因此没有交叉点

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:33 24 4
gpt4 key购买 nike

我正在用 C++ 实现光线追踪。球体工作正常,圆柱体几乎工作正常。但是光线追踪器无法找到与圆锥体的交点。经过计算,基于链接 here ,我创建了一个交集函数。这是我的锥体类的 findIntersection 函数。可变比例为-1 * radius * radius/(height * height);

virtual double findIntersection(Ray ray){


Vect ray_origin = ray.getRayOrigin();
double ray_origin_x = ray_origin.getVectX();
double ray_origin_y = ray_origin.getVectY();
double ray_origin_z = ray_origin.getVectZ();

Vect ray_direction = ray.getRayDirection();
double ray_direction_x = ray_direction.getVectX();
double ray_direction_y = ray_direction.getVectY();
double ray_direction_z = ray_direction.getVectZ();

Vect cone_center = center;
double cone_center_x = center.getVectX();
double cone_center_y = center.getVectY();
double cone_center_z = center.getVectZ();

Vect diff(cone_center_x - ray_origin_x, cone_center_y - ray_origin_y + height, cone_center_z - ray_origin_z);

//Derive the coefficients of the quadratic equation
double a = pow(ray_direction_x, 2) + pow(ray_direction_y, 2) * ratio + pow(ray_direction_z, 2);
double b = diff.getVectX() * ray_direction_x + diff.getVectY() * ratio * ray_direction_y + diff.getVectZ() * ray_direction_z;

double c = diff.getVectX() * diff.getVectX() + ratio * diff.getVectY() * diff.getVectY() + diff.getVectZ() * diff.getVectZ();

double discriminant = b * b - a * c;
cout << discriminant << "\n";

if (discriminant > 0){
//The ray intersects this cone. Find the lower root
double root_1 = (-1 * b - discriminant)/2 - 0.000001;
if (root_1 > 0) {

// the first root is the smallest positive root
return root_1;
}
else {
// the second root is the smallest positive root
double root_2 = ((sqrt(discriminant) - b)/2) - 0.000001;
return root_2;
}
}
else {
// the ray missed the cone
return -1;

}

}

问题出在变量判别式的计算上。他们出来是消极的,所以没有交集被返回。该程序中的交点函数返回从射线原点到交点的距离。

请有人看一下圆锥计算并告诉我是否做错了什么。

问候,莫伊拉

最佳答案

我无法点击该链接,但您的“判别式”看起来不对。

假设 ratio(不管它是什么)是 1。那么我们有

a = 射线2
b = 差异。射线
c = 差异2

判别式 = b * b - a * c = (diff . ray)2 - diff2 射线2

第一项最多为|diff||ray| (当raydiff平行时),所以判别式最多为零。

关于c++ - 光线追踪锥。判别式给出 -ve 值,因此没有交叉点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13783330/

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