2016-02-16 101 views
1

我一直在寻找几个小时来找到一个在JOGL中绘制纹理球体的好方法。我需要的只是朝正确的方向发展,或者某些代码适用于某人。到目前为止,我所能找到的是helloTexture(虽然它有效,但显然不是球体),是否有办法将其转换为球体,或者我应该在其他地方尝试运气?在JOGL中渲染纹理球体

+1

你可以建立。只需添加更多的顶点以形成一个球体并在这些顶点之间绘制三角形。如果你不知道如何建议你先找一个关于绘制三角形的教程,并试着理解它是如何工作的。从这里走向球体或任何其他形状只是绘制更多三角形的问题。 – Thomas

+0

看看这个答案。应该是同样的原则。只是编码在C + +:http://stackoverflow.com/questions/7687148/drawing-sphere-in-opengl-without-using-glusphere – flakes

+1

更好不@flkes,使用不赞成的'GL_QUADS' – elect

回答

1

我写这个给你,这是未经测试,因为我修改了它与GL_TRIANGLES工作,试图让我知道

radius是球体半径,rings是水平切片,sectors垂直那些

private void createGeometry(float radius, short rings, short sectors) { 

    float R = 1f/(float)(rings - 1); 
    float S = 1f/(float)(sectors - 1); 
    short r, s; 
    float x, y, z; 

    points = new float[rings * sectors * 3]; 
    normals = new float[rings * sectors * 3]; 
    texcoords = new float[rings * sectors * 2]; 

    int t = 0, v = 0, n = 0; 
    for(r = 0; r < rings; r++) { 
     for(s = 0; s < sectors; s++) { 
      x = (float) (Math.cos(2 * Math.PI * s * S) * Math.sin(Math.PI * r * R)); 
      y = (float) Math.sin(-Math.PI/2 + Math.PI * r * R); 
      z = (float) (Math.sin(2 * Math.PI * s * S) * Math.sin(Math.PI * r * R)); 

      texcoords[t++] = s * S; 
      texcoords[t++] = r * R; 

      points[v++] = x * radius; 
      points[v++] = y * radius; 
      points[v++] = z * radius; 

      normals[n++] = x; 
      normals[n++] = y; 
      normals[n++] = z; 
     } 


    } 
    int counter = 0; 
    indices = new short[rings * sectors * 6]; 
    for(r = 0; r < rings - 1; r++){ 
     for(s = 0; s < sectors-1; s++) { 
      indices[counter++] = (short) (r * sectors + s);  
      indices[counter++] = (short) (r * sectors + (s + 1)); 
      indices[counter++] = (short) ((r + 1) * sectors + (s + 1)); 
      indices[counter++] = (short) ((r + 1) * sectors + (s + 1)); 
      indices[counter++] = (short) (r * sectors + (s + 1));  
      indices[counter++] = (short) ((r + 1) * sectors + s);  
     } 
    } 
} 
+0

我会如何显示这样的东西?在点,法线和textcoords之前放置了一个float []后,我才开始工作。不过谢谢你。 –

+0

是的,基本上在我的示例中,您可以将'points'和'texcoords'放在'vertexData'里面。 'indexData'内的'indices'。目前跳过“法线”,除非您执行照明,否则不需要这些。相应地修改顶点属性参数,因为现在你的位置是3而不是2;) – elect

+0

我还没有理解。对不起,我吮吸这个...我如何把点和texcoors?我试着把它们放在这里:'private float [] vertexData = new float [] {texcoords,points }; private short [] indexData = new short [] { indicantly };',但这只是给了我一个蓝屏。对不起,如果我错过了一些非常明显的东西... –