如何围绕固定对象(OpenGL)旋转光源?

时间:2012-05-18 04:16:09

标签: opengl rotation lighting translate-animation glrotate

我正在尝试在我的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();
}

如何让这个新的lightsource围绕我的“modelAL”对象旋转?

1 个答案:

答案 0 :(得分:3)

对于固定管道,使用模型视图矩阵转换分配有glLight()的光源位置,就像普通对象一样。因此,您可以像使用普通对象一样使用变换功能来定位和旋转光源。

要围绕某个点旋转光源(或其他对象),您需要按照以下步骤操作。设L是旋转角度为0度时光源所在的位置,O是主体 - 要旋转光源的对象。

  1. 将光源定位在L-O(光源相对于主体的位置
  2. 围绕所需轴(可能是Y轴)旋转
  3. 将其翻译为O以将其移动到位。
  4. 由于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。

相关问题