光线跟踪锥。判别式给出-ve值,因此没有交点 我在C++中实现光线跟踪。球体工作正常,圆柱体几乎工作正常。但光线跟踪器无法找到与圆锥体的交点。经过计算,基于链接,我创建了一个交集函数。这是我的cone类的findIntersection函数。可变比率为-1*半径*半径/(高度*高度) virtualdouble findIntersection(光线){ 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(); 双射线方向x=射线方向。getVectX(); 双光线方向=光线方向。getVectY(); 双射线方向=射线方向。getVectZ(); 向量锥_中心=中心; 双圆锥体_center_x=center.getVectX(); 双圆锥体_center_y=center.getVectY(); 双锥面_中心_z=中心.getVectZ(); 矢量差(圆锥体中心x射线原点x、圆锥体中心y射线原点y+高度、圆锥体中心z射线原点z); //导出二次方程的系数 双a=功率(射线方向x,2)+功率(射线方向y,2)*比值+功率(射线方向z,2); double b=diff.getVectX()*光线方向x+diff.getVectY()*比率*光线方向y+diff.getVectZ()*光线方向z; 双c=diff.getVectX()*diff.getVectX()+比率*diff.getVectY()*diff.getVectY()+diff.getVectZ()*diff.getVectZ(); 双判别式=b*b-a*c; cout(0){ //第一个根是最小的正根 返回根_1; } 否则{ //第二个根是最小的正根 双根_2=((sqrt(判别式)-b)/2)-0.000001; 返回根_2; } } 否则{ //射线没有击中圆锥体 返回-1; } }

光线跟踪锥。判别式给出-ve值,因此没有交点 我在C++中实现光线跟踪。球体工作正常,圆柱体几乎工作正常。但光线跟踪器无法找到与圆锥体的交点。经过计算,基于链接,我创建了一个交集函数。这是我的cone类的findIntersection函数。可变比率为-1*半径*半径/(高度*高度) virtualdouble findIntersection(光线){ 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(); 双射线方向x=射线方向。getVectX(); 双光线方向=光线方向。getVectY(); 双射线方向=射线方向。getVectZ(); 向量锥_中心=中心; 双圆锥体_center_x=center.getVectX(); 双圆锥体_center_y=center.getVectY(); 双锥面_中心_z=中心.getVectZ(); 矢量差(圆锥体中心x射线原点x、圆锥体中心y射线原点y+高度、圆锥体中心z射线原点z); //导出二次方程的系数 双a=功率(射线方向x,2)+功率(射线方向y,2)*比值+功率(射线方向z,2); double b=diff.getVectX()*光线方向x+diff.getVectY()*比率*光线方向y+diff.getVectZ()*光线方向z; 双c=diff.getVectX()*diff.getVectX()+比率*diff.getVectY()*diff.getVectY()+diff.getVectZ()*diff.getVectZ(); 双判别式=b*b-a*c; cout(0){ //第一个根是最小的正根 返回根_1; } 否则{ //第二个根是最小的正根 双根_2=((sqrt(判别式)-b)/2)-0.000001; 返回根_2; } } 否则{ //射线没有击中圆锥体 返回-1; } },c++,raytracing,C++,Raytracing,问题在于变量判别式的计算。结果显示为负值,因此不会返回交叉点。此程序中的“交点”函数返回从光线原点到交点的距离 请有人看一下圆锥计算,告诉我是否做错了什么 问候,, 莫伊拉我看不懂那个链接,但你的“判别式”看起来错了 假设比率为1。那么我们有 a=ray2 b=差异。射线 c=diff2 鉴别器=b*b-a*c=(差分射线)2-diff2ray2 第一项最多为| diff | | ray |(当光线和diff平行时),因此判别式最多为零。在判别式D=b*b-4*a*c中4发生了什么?另外,在计算

问题在于变量判别式的计算。结果显示为负值,因此不会返回交叉点。此程序中的“交点”函数返回从光线原点到交点的距离

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

问候,,
莫伊拉

我看不懂那个链接,但你的“判别式”看起来错了

假设比率为1。那么我们有

a=ray2
b=差异。射线
c=diff2

鉴别器=b*b-a*c=(差分射线)2-diff2ray2


第一项最多为| diff | | ray |(当光线和diff平行时),因此判别式最多为零。

在判别式
D=b*b-4*a*c
4
发生了什么?另外,在计算第一个根时,为什么不从discriminant中获取
sqrt
?在计算根时,为什么不除以
2*a
?谢谢你的回复Andrey。我在计算判别式时去掉了4,因为我在计算b时去掉了2的乘法。这是为了减少额外的乘法。我修复了sqrt问题,根计算现在被“a”除,而不是2(由于上述原因,不是被2a除)。行列式值仍然是负数,所以代码不会去计算根,因为它们无论如何都是虚值。啊!我发现了问题。这是在另一个函数中,计算比率。我在函数中再次声明了ratio,因此类成员变量
ratio
没有被更新。至少在某些时候,歧视是积极的。(如果不是在我想要的时候)。我会调查的。谢谢你的帮助。
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;

        }

    }