0

球体を作ろうとしています。しかし、それは 3D のようには見えません。実際には、平面の 2D 画像のように見えます。ここで何が欠けていますか?

2D 球体 ありがとうございました

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

// Render code さらに、私はこの円を回転させています。回転は正常に機能します。なぜなら、光の変化があり、回転していて、少なくとも円であるという考えが得られるからです。

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);
4

1 に答える 1

3

まず、照明が現在有効になっているかどうかを確認し、場合によってはglGetIntegerv(GL_LIGHTING,&i)on にする必要がありますglEnable(GL_LIGHTING)

次に、glMaterial(...)チュートリアルをglLightModel(...)セットアップしますhttp://www.cse.msu.edu/~cse872/tutorial3.htmlglLight(...)

または、独自の GLSL シェーダーを使用して高度なイルミネーションを適用することもできます。いくつかのチュートリアルはhttp://www.lighthouse3d.com/opengl/glsl/にあります。

いくつかの些細なケースでは、GL 照明を使用する代わりに glColor3f(...) を介して頂点の色を渡すことができます。

また、法線は単位ベクトルであるか、正規化を有効にする必要がありますglEnable(GL_NORMALIZE)

于 2012-05-07T21:48:37.760 に答える