寻找球面纹理映射的theta和phi

时间:2011-11-14 22:31:01

标签: c++ textures texture-mapping

对于学校项目我需要找到球形纹理贴图的theta和phi。很多用于纹理化的实际OpenGL已经完成(附带入门代码)。入门代码提供下面的功能和注释。代码是我到目前为止所做的(除了给出的x和z的初始化):

Vec3f sphere::getTextureCoords(Vec3f eye, Vec3f dir)
{
    // find the normal (getNormal)
    Vec3f n = this->getNormal(eye, dir);

    // use these to find spherical coordinates
    Vec3f x(1, 0, 0);
    Vec3f z(0, 0, 1);

    // phi is the angle down from z
    // theta is the angle from x curving toward y

    // find phi using the normal and z
    float phi = acos(n.Dot3(z));

    // find the x-y projection of the normal
    Vec3f proj(n.x(), n.y(), 0);

    // find theta using the x-y projection and x
    float theta = acos(proj.Dot3(x));

    // if x-y projection is in quadrant 3 or 4, then theta = 2PI - theta
    if (proj.y() < 0)
        theta = TWOPI - theta;

    Vec3f coords;
    coords.set(theta / TWOPI, phi / PI, 0);
    return coords;
}

根据评论中的“说明”,这就是我想出的。纹理贴图虽然不起作用(没有错误,坐标只是错误的)。 getNormal函数可能无法正常工作,但我认为问题在于我对球坐标缺乏了解。请让我知道你认为是什么问题,谢谢!

1 个答案:

答案 0 :(得分:1)

由于proj未正常化,因此theta的结果错误。

顺便说一句,你对theta和phi的命名是非常规的(一开始我很困惑)。通常,z的角度称为θ,x-y平面的角度称为phi。