2011-11-14 79 views
0

我需要爲球形紋理映射找到theta和phi。許多實際的紋理OpenGL已經完成(附帶入門代碼)。起始代碼提供下面的功能和註釋。該代碼是我迄今所做的(除了初始化x和z,它被賦予):尋找球形紋理映射的θ和phi

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

請注意維基百科有關[球面笛卡爾轉換](http://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates)文章中的公式,特別是它們使用arctan和關於[atan2]的註釋(http: //en.wikipedia.org/wiki/Atan2)。 – outis

回答

1

由於proj不歸,你會得到一個錯誤的結果爲theta

順便說一句,你的theta和披的命名是非常規(它讓我感到困惑,在第一)。通常來說,z的角度稱爲theta,x-y平面中的角度稱爲phi。

+0

我明白了,謝謝。對命名感到抱歉,這就是它給我的。 –