2012-12-23 71 views
1

我使用drawSphere方法創建了一個類來替換glutDrawSolidSphere。見下面的代碼。如何在球體上包裹紋理?

但我想知道,如何在沒有平鋪的情況下在其周圍包裹紋理?例如,如果我想在它上面畫一個嘴巴,眼睛和鼻子,那麼我希望它只有一個嘴巴,兩個眼睛和一個鼻子,而不是在整個球體上鋪滿100個。

我在一些庫中使用Jogl。

class Shape { 

    public void drawSphere(double radius, int slices, int stacks) { 
     gl.glEnable(GL_TEXTURE_2D); 
     head.bind(gl); //This method is a shorthand equivalent of gl.glBindTexture(texture.getTarget(), texture.getTextureObject()); 
     gl.glBegin(GL_QUADS); 
     double stack = (2*PI)/stacks; 
     double slice = (2*PI)/slices; 
     for (double theta = 0; theta < 2 * PI; theta += stack) { 
      for (double phi = 0; phi < 2 * PI; phi += slice) { 
       Vector p1 = getPoints(phi, theta, radius); 
       Vector p2 = getPoints(phi + slice, theta, radius); 
       Vector p3 = getPoints(phi + slice, theta + stack, radius); 
       Vector p4 = getPoints(phi, theta + stack, radius); 
       gl.glTexCoord2d(0, 0); 
       gl.glVertex3d(p1.x(), p1.y(), p1.z()); 
       gl.glTexCoord2d(1, 0); 
       gl.glVertex3d(p2.x(), p2.y(), p2.z()); 
       gl.glTexCoord2d(1, 1); 
       gl.glVertex3d(p3.x(), p3.y(), p3.z()); 
       gl.glTexCoord2d(0, 1); 
       gl.glVertex3d(p4.x(), p4.y(), p4.z()); 
      } 
     } 
     gl.glEnd(); 
     gl.glDisable(GL_TEXTURE_2D); 
    } 

    Vector getPoints(double phi, double theta, double radius) { 
     double x = radius * cos(theta) * sin(phi); 
     double y = radius * sin(theta) * sin(phi); 
     double z = radius * cos(phi); 
     return new Vector(x, y, z); 
    } 
} 

回答

3

您可以將緯度和經度直接映射到紋理座標。

for (double theta = 0; theta < 2 * PI; theta += stack) { 
    for (double phi = 0; phi < 2 * PI; phi += slice) { 

只是規模thetaphi爲0和1之間

double s0 = theta/(2 * PI); 
double s1 = (theta + stack)/(2 * PI); 
double t0 = phi/(2 * PI); 
double t1 = (phi + slice)/(2 * PI); 

而代替0和1的texCoord使用s0s1t0t1()調用。

+0

謝謝!這真的很有用:) – Yatoom