C++ 光线跟踪器球面映射
我使用“从地面开始的光线跟踪器”这本书作为教程,但我在同一代码中没有相同的结果,我认为是相同的(我已经检查了几次) 我的问题是球面映射纹理到球面 代码(d_type::Bfloat是双精度的):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.
其中,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;
}