我是光线追踪的新手,并且在显示圆柱体时遇到问题。我已经实现了代码来查找球体,并一直按照我在这里找到的教程进行操作:http://woo4.me/wootracer/cylinder-intersection/添加一个简单的圆柱体(无限开始)。我编写了以下代码,但无论我给圆柱体什么坐标,都会在图像上获得一个坚实的平面。谁能给我一个提示,说明我哪里出了问题?我已经在谷歌上搜索了三天,并通过Stack Overflow进行了搜索,并尝试了论坛和教程中建议的多种方法,但无济于事,所以希望这里有人能看到我哪里出了问题??提前感谢!!
virtual double findIntersection(Ray ray){
Vect rayOrigin = ray.getRayOrigin();
double rayOriginX = rayOrigin.getVectX();
double rayOriginY = rayOrigin.getVectY();
double rayOriginZ = rayOrigin.getVectZ();
Vect rayDirection = ray.getRayDirection();
double rayDirectionX = rayDirection.getVectX();
double rayDirectionY = rayDirection.getVectY();
double rayDirectionZ = rayDirection.getVectZ();
//a=d x2 + d y2 b = ex d x + e y d y c = ex2 + e y2−1
double a = rayDirectionX * rayDirectionX + rayDirectionY * rayDirectionY;
double b = 2* rayOriginX * rayDirectionX + 2* rayOriginY * rayDirectionY;
double c = rayOriginX * rayOriginX + rayOriginY * rayOriginY - 1;
double discriminant = b*b - 4 * a*c;
if (discriminant > 0){
//ray intersects
double root1 = ((-1 * b - sqrt(discriminant)) / 2*a - 0.0001);
if (root1 > 0){
return root1; //first root is the smallest positive value
}
else{
double root2 = ((sqrt(discriminant) - b) / 2*a - 0.0001);
return root2; //the second root is the smallest positive value
}
}
else{
//ray misses the Cylinder
return -1;
}
}
![enter image description here][1]};
- 在我的基元的光线相交方法中,我通常返回一个结构,其中包括交点、表面法线和被击中的形状等。你为什么要归还根?
- 在您的代码中,您说第一个根是最小的正值。我认为这是不正确的。我会浏览一些具有不同值 a、b 和 c 的测试用例,以说服自己一种或另一种方式。
- 此外,如果判别式为 0,则存在双根,并且射线确实击中圆柱体。