2012-05-18 2 views
1

나는 OpenGL 프로젝트에서 내 캐릭터 모델을 중심으로 광원을 회전 시키려고 노력하고 있지만, 시도해 보면 지금까지 얻은 모든 것이 내 모델이 미친 듯이 (또는 바닥처럼) 회전하고있는 것입니다.고정 된 물체 (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"개체 중심으로 회전 할 수 있을까?

답변

3

고정 파이프 라인의 경우 광원 개체 위치는 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하지 지향성 사람 즉 적용됩니다.

+0

필자는 구형 좌표를 사용하여 똑같은 작업을하는 것이 더 확실하다는 점을 권장합니다. – imallett

관련 문제