1

OpenGL プロジェクトでキャラクター モデルの周りに光源を回転させようとしていますが、試してみると、これまでのところ、モデルが狂ったように (または床が) 回転するだけです。

私のレンダリングコードは次のようになります:

void mainRender() {
    updateState();
    renderScene();
    glFlush();
    glutPostRedisplay();

    //spin = (spin + 30) % 360;

    Sleep(30);
}

void renderScene() {
    glClearColor(backgrundColor[0],backgrundColor[1],backgrundColor[2],backgrundColor[3]);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // limpar o depth buffer

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    updateCam();
    renderFloor();
    modelAL.Translate(0.0f,1.0f,0.0f);
    modelAL.Draw();
}


void renderFloor() {


    // set things up to render the floor with the texture
    glShadeModel(GL_SMOOTH);
    glEnable(type);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glPushMatrix();

    glTranslatef(-(float)planeSize/2.0f, 0.0f, -(float)planeSize/2.0f);

    float textureScaleX = 10.0;
    float textureScaleY = 10.0;
    glColor4f(1.0f,1.0f,1.0f,1.0f);
    int xQuads = 40;
    int zQuads = 40;
    for (int i = 0; i < xQuads; i++) {
        for (int j = 0; j < zQuads; j++) {
            glBegin(GL_QUADS);
                glTexCoord2f(1.0f, 0.0f);   // coords for the texture
                glNormal3f(0.0f,1.0f,0.0f);
                glVertex3f(i * (float)planeSize/xQuads, 0.0f, (j+1) * (float)planeSize/zQuads);

                glTexCoord2f(0.0f, 0.0f);  // coords for the texture
                glNormal3f(0.0f,1.0f,0.0f);
                glVertex3f((i+1) * (float)planeSize/xQuads, 0.0f, (j+1) * (float)planeSize/zQuads);

                glTexCoord2f(0.0f, 1.0f);  // coords for the texture
                glNormal3f(0.0f,1.0f,0.0f);
                glVertex3f((i+1) * (float)planeSize/xQuads, 0.0f, j * (float)planeSize/zQuads);

                glTexCoord2f(1.0f, 1.0f);  // coords for the texture
                glNormal3f(0.0f,1.0f,0.0f);
                glVertex3f(i * (float)planeSize/xQuads, 0.0f, j * (float)planeSize/zQuads);

            glEnd();
        }
    }

    glDisable(type);


    glPopMatrix();
}

この新しい光源を「modelAL」オブジェクトの周りで回転させるにはどうすればよいですか?

4

1 に答える 1

4

固定パイプラインの場合、 で割り当てられた光源の位置glLight()は、通常のオブジェクトと同様に、モデル ビュー マトリックスで変換されます。したがって、変換関数を使用して、通常のオブジェクトと同じように光源を配置および回転できます。

ポイントを中心に光源 (または他のオブジェクト) を回転するには、次の手順に従う必要があります。回転が 0 度のときの光源の位置を L とし、光源を回転させたいオブジェクトである被写体を O とします。

  1. 光源を LO (被写体に対する光源の位置)に配置します。
  2. 必要な軸 (おそらく Y 軸) を中心に回転させます。
  3. 位置に移動するには、O で移動します。

OpenGL の動作方法により、基本的にこれらを逆順に実行します。基本的には次のようになります。

glPushMatrix();
glTranslatef(O.x,O.y,O.z);
glRotate(angle,0,1,0);
GLfloat lightpos[4] = {L.x-O.x,L.y-O.y,L.z-O.z,1};
glLightfv(GL_LIGHT0,GL_POSITION,lightpos);
glPopMatrix();

これは配置された光源にのみ適用され、指向性のある光源、つまり w=0 の光源には適用されないことに注意してください。

于 2012-05-18T04:48:39.193 に答える