Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 光线跟踪器球面映射_C++_Raytracing - Fatal编程技术网

C++ 光线跟踪器球面映射

C++ 光线跟踪器球面映射,c++,raytracing,C++,Raytracing,我使用“从地面开始的光线跟踪器”这本书作为教程,但我在同一代码中没有相同的结果,我认为是相同的(我已经检查了几次) 我的问题是球面映射纹理到球面 代码(d_type::Bfloat是双精度的): 其中,t是闭合交点取决于坐标空间的利手性,我在自己的光线跟踪器中有以下几乎相同的代码: double u = 0.5 - atan2(n.z, n.x) * math::one_over_2pi; double v = 0.5 - asin(n.y) * math::one_over_pi; 注意0.

我使用“从地面开始的光线跟踪器”这本书作为教程,但我在同一代码中没有相同的结果,我认为是相同的(我已经检查了几次)

我的问题是球面映射纹理到球面

代码(d_type::Bfloat是双精度的):


其中,t是闭合交点

取决于坐标空间的利手性,我在自己的光线跟踪器中有以下几乎相同的代码:

double u = 0.5 - atan2(n.z, n.x) * math::one_over_2pi;
double v = 0.5 - asin(n.y) * math::one_over_pi;

注意0.5的用法,在我的例子中,坐标都在0..1范围内运行

这一切都很奇怪。。。但球体的辐射度必须是1。。一切正常;)

问题出在本地生命点。这不是地方性的,而是全球性的,所以所有的问题都被解释了。工作球体映射的代码:

void getTexelCoord(const Vector3Bf &localHitPoint, const d_type::Bint m_width, const d_type::Bint m_height, d_type::Bint& row, d_type::Bint& column) const
    {

        Vector3Bf normal=localHitPoint - m_sphere->getCenter();
        Vector3Bf::normalize(normal);
        d_type::Bfloat u=0.5+atan2(normal.z,normal.x)*INV_TWO_PI;
        d_type::Bfloat v = 0.5-asin(normal.y)*INV_PI;
        column =(int)(m_width*u);
        row =(int)(m_height)*v;
    }

其中,m_sphere是具有此贴图的材质(纹理)的球体。

相同。。。。它只改变了纹理的旋转,但是白色的带子是一样的。所以要么你的纹理只填充了它图像的一半,要么你的高度值超出了2倍,当我将读取值从文件更改为红色时,所有球体都是红色的。。。所以纹理有点问题。球形贴图文件的宽度通常是其高度的两倍,但您的代码应该已经考虑到了这一点。Re:更改为全红色-这表明您正在为球体上的每个生命点调用纹理函数。从文件加载很好。我只在光线击中球体时调用纹理函数。啊,那么你确实使用了我的方程(尽管可能仍然存在“利手”问题,可能是因为你在计算
u
时使用了
+
而不是
-
)。我没有发现原点问题的原因是,光线在“对象”空间而不是“世界”空间的实现中更常见。
double u = 0.5 - atan2(n.z, n.x) * math::one_over_2pi;
double v = 0.5 - asin(n.y) * math::one_over_pi;
void getTexelCoord(const Vector3Bf &localHitPoint, const d_type::Bint m_width, const d_type::Bint m_height, d_type::Bint& row, d_type::Bint& column) const
    {

        Vector3Bf normal=localHitPoint - m_sphere->getCenter();
        Vector3Bf::normalize(normal);
        d_type::Bfloat u=0.5+atan2(normal.z,normal.x)*INV_TWO_PI;
        d_type::Bfloat v = 0.5-asin(normal.y)*INV_PI;
        column =(int)(m_width*u);
        row =(int)(m_height)*v;
    }