1

我正在尝试对地球上的 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 次纬度迭代,它看起来会有所不同。

这是一些图片:

全地球:

全地球

同一个地球,只有三个纬度:

同一个地球,只有三个纬度

有谁知道我做错了什么?

4

0 回答 0