我正在尝试对地球上的 2D 纹理进行 UV 处理。这是一段代码:
double
delta = 0.0, // angle of latitude
theta = 0.0, // angle of longitude
theta_interval = (2.0 * M_PI) / latitude, // angle of latitude
delta_interval = M_PI / longitude, // angle of longitude
u_lats = 0.0,
v_longs = 0.0,
u_lats_interval = 1.0 / latitude,
v_longs_interval = 1.0 / longitude;
for (int i = 0; i < longitude; ++i) {
for (int j = 0; j < latitude; ++j) {
double
x0 = calc_x0(radius, x, theta, delta),
y0 = calc_y0(radius, y, theta, delta),
z0 = calc_z0(radius, z, theta, delta),
u0 = u_lats,
v0 = v_longs + v_longs_interval,
x1 = calc_x1(radius, x, theta, delta, delta_interval),
y1 = calc_y1(radius, y, theta, delta, delta_interval),
z1 = calc_z1(radius, z, theta, delta, delta_interval),
u1 = u_lats + u_lats_interval,
v1 = v_longs + v_longs_interval,
x2 = calc_x2(radius, x, theta, theta_interval, delta, delta_interval),
y2 = calc_y2(radius, y, theta, delta, delta_interval),
z2 = calc_z2(radius, z, theta, theta_interval, delta, delta_interval),
u2 = u_lats + u_lats_interval,
v2 = v_longs,
x3 = calc_x3(radius, x, theta, theta_interval, delta),
y3 = calc_y3(radius, y, theta, theta_interval, delta),
z3 = calc_z3(radius, z, theta, theta_interval, delta),
u3 = u_lats,
v3 = v_longs;
theta += theta_interval;
u_lats += u_lats_interval;
}
v_longs += v_longs_interval;
theta = 0.0;
delta += delta_interval;
所以我想做的方式是通过纹理上的第一个“带子”,然后移动到下一个,但它看起来不太好。我开始认为这可能与纹理有关,因为如果我渲染较少的球体,例如只有 3 次纬度迭代,它看起来会有所不同。
这是一些图片:
全地球:
同一个地球,只有三个纬度:
有谁知道我做错了什么?