我想为我的光线追踪器编写一个球形贴图来为球体生成UV坐标。应用该映射的纹理应如下所示:
我的球体位于[0.0f,0.0f,0.0f]
,radius
为20.0f
。
对于球体表面上的给定xyz
点(光线跟踪器射线击中球体的位置),我使用this formula计算uv
坐标:
float u = 0.5f + atan2(point.getX(), point.getZ()) / (2 * PI);
float v = 0.5f - asin(point.getY() / radius) / PI;
我决定输出u
和v
值来测试映射。
至于v
它看起来很不错(从一个极点到另一个极点的值,从0.0f
到1.0f
):
但u
看起来并不那么好:
难道它不是一个颜色取决于XZ的球体(同一经度上的所有点都相同,从一个经度逐渐变为另一个经度)?
我对point
,公式或其他内容的解释是错误的吗?
答案 0 :(得分:0)
中心线的不连续性是因为atan2()
返回介于-π和π之间的经度。你将它除以2π以将其缩放到-0.5和0.5之间,然后加0.5以在0和1之间缩放它。结果是一个从0到1不连续跳跃的值,类似于当地时间突然跳回24的值跨越国际日期行的小时数,出于同样的原因。要获得连续阴影的球体,请将u的值映射到缩放为偶数函数的亮度,或者更好地将其映射为色轮上的色调。