球体上给出的点的球面映射计算(UV) - 奇怪的U值

时间:2015-11-17 01:56:23

标签: c++ textures texture-mapping uv-mapping

我想为我的光线追踪器编写一个球形贴图来为球体生成UV坐标。应用该映射的纹理应如下所示: enter image description here

我的球体位于[0.0f,0.0f,0.0f]radius20.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;

我决定输出uv值来测试映射。

至于v它看起来很不错(从一个极点到另一个极点的值,从0.0f1.0f): enter image description here

u看起来并不那么好: enter image description here 难道它不是一个颜色取决于XZ的球体(同一经度上的所有点都相同,从一个经度逐渐变为另一个经度)?

我对point,公式或其他内容的解释是错误的吗?

1 个答案:

答案 0 :(得分:0)

中心线的不连续性是因为atan2()返回介于-π和π之间的经度。你将它除以2π以将其缩放到-0.5和0.5之间,然后加0.5以在0和1之间缩放它。结果是一个从0到1不连续跳跃的值,类似于当地时间突然跳回24的值跨越国际日期行的小时数,出于同样的原因。要获得连续阴影的球体,请将u的值映射到缩放为偶数函数的亮度,或者更好地将其映射为色轮上的色调。