2012-05-07 63 views
0

试图制作一个球体。但它看起来不像3D,实际上它看起来像一张平坦的2D图片。我在这里错过了什么?OpenGL es - 不看3D,看起来更像2D

2d sphere 三江源

std::vector<GLfloat> ballVerts; 

for(int i = 0; i <= 40; i++) 
{ 
    double lat0 = M_PI * (-0.5 + (double) (i - 1)/40); 
    double z0 = sin(lat0); 
    double zr0 = cos(lat0); 

    double lat1 = M_PI * (-0.5 + (double) i/40); 
    double z1 = sin(lat1); 
    double zr1 = cos(lat1); 

    for(int j = 0; j <= 40; j++) 
    { 
     double lng = 2 * M_PI * (double) (j - 1)/40; 
     double x = cos(lng); 
     double y = sin(lng); 

     // normals 
     glNormal3f(x * zr0, y * zr0, z0); 

     ballVerts.push_back(x * zr0); //X 
     ballVerts.push_back(y * zr0); //Y 
     ballVerts.push_back(z0);  //Z 

     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); 
     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); //R,G,B,A 

     // normals 
     glNormal3f(x * zr1, y * zr1, z1); 

     ballVerts.push_back(x * zr1); //X 
     ballVerts.push_back(y * zr1); //Y 
     ballVerts.push_back(z1);  //Z 

     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); 
     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); //R,G,B,A 

//渲染代码 此外,我旋转这个圈子,旋转正常工作,因为我有光变化,这让我说,它正在旋转的想法,是逸岸一圈至少

glRotatef(Angle, 1.0f, 0.5f, 0.3f); 

glBindBuffer(GL_ARRAY_BUFFER, VertexBufferObject[2]); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 7*4, 0); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 3200); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

回答

3

首先你需要检查是否使用glGetIntegerv(GL_LIGHTING,&i)当前已启用照明,也许打开它glEnable(GL_LIGHTING)

然后设置的glMaterial(...)glLightModel(...)glLight(...),有教程http://www.cse.msu.edu/~cse872/tutorial3.html

,或者您可以使用自己的GLSL着色器应用一些先进的照明,一些教程在这里http://www.lighthouse3d.com/opengl/glsl/

在一些琐碎的情况下,你可以只通过glColor3f(...)传递顶点颜色,而不是使用GL光照。

法线也应该是单位向量或使能标准化glEnable(GL_NORMALIZE)

+0

现在看起来好多了,如果不是最好的。谢谢你的帮助 :) – HungryCoder