2013-05-17 8 views
3

OpenGL을 처음 사용합니다. Torus와 Sphere와 그 둘레를 회전하는 두 개의 독립적 인 광원이라는 두 가지 색상의 두 가지 모양을 표시하는 프로그램을 작성하고 싶습니다.OpenGL : 두 개의 독립적 인 광원이 서로 회전하는 두 개의 본체

지금까지 Torus 주위를 멋지게 회전시키는 광원을 만드는이 코드가 있습니다. 그러나 Sphere와 주위를 회전하는 새로운 광원을 추가하는 방법을 알아낼 수 없습니다.

편집 :

여기 내 코드가 있습니다. 키보드의 's'또는 'd'키를 누르면 빛이 회전합니다.

#include "stdafx.h" 
#include <windows.h> 
#include <glut.h> 

static int spin = 0; 
bool updown = false; 
bool leftright = false; 

GLfloat black[] = { 0.0, 0.0, 0.0, 1.0 }; 
GLfloat yellow[] = { 1.0, 1.0, 0.0, 1.0 }; 
GLfloat red[] = { 1.0, 0.0, 0.0, 1.0 }; 
GLfloat cyan[] = { 0.0, 1.0, 1.0, 1.0 }; 
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; 
GLfloat direction[] = { 1.0, 1.0, 1.0, 0.0 }; 
GLfloat direction2[] = { 1.0, 0.0, 0.0, 0.0 }; 

void display() { 
    GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 }; 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 

    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cyan); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, white); 
    glMaterialf(GL_FRONT, GL_SHININESS, 30); 
    glTranslatef(-2.0, 1.0, 0.0); 
    glPushMatrix(); 
    if(updown){ 
     glRotated ((GLdouble) spin, 1.0, 0.0, 0.0); 
    } 
    if(leftright){ 
     glRotated ((GLdouble) spin, 0.0, 1.0, 0.0); 
    } 
    glLightfv (GL_LIGHT0, GL_POSITION, position); 

    glTranslated (0.0, 0.0, 1.5); 
    glDisable (GL_LIGHTING); 
    glColor3f (0.0, 1.0, 1.0); 
    glEnable (GL_LIGHTING); 
    glPopMatrix(); 
    glutSolidTorus(0.275, 0.85, 16, 40); 
    glPopMatrix(); 
    glFlush(); 
} 

void reshape(GLint w, GLint h) { 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    GLfloat aspect = GLfloat(w)/GLfloat(h); 
    glLoadIdentity(); 
    if (w <= h) { 
     glOrtho(-2.5, 2.5, -2.5/aspect, 2.5/aspect, -10.0, 10.0); 
    } else { 
     glOrtho(-2.5*aspect, 2.5*aspect, -2.5, 2.5, -10.0, 10.0); 
    } 
} 
void init() { 
    glLightfv(GL_LIGHT0, GL_AMBIENT, black); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, yellow); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, white); 

    glEnable(GL_LIGHTING);     
    glEnable(GL_LIGHT0); 
    glEnable(GL_DEPTH_TEST);    
} 

void keyboard(unsigned char button, int x, int y) 
{ 
    switch (button) { 
     case 's': 
      updown = true; 
      leftright = false; 
      spin = (spin + 30) % 360; 
      glutPostRedisplay(); 
      break; 
     case 'd': 
      updown = false; 
      leftright = true; 
      spin = (spin + 30) % 360; 
      glutPostRedisplay(); 
      break; 
     default: 
      break; 
    } 
} 

int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowPosition(80, 80); 
    glutInitWindowSize(800, 600); 
    glutCreateWindow("Shapes and light"); 
    glutReshapeFunc(reshape); 
    glutKeyboardFunc(keyboard); 
    glutDisplayFunc(display); 
    init(); 
    glutMainLoop(); 
} 
+0

코드가 불완전합니다. 당신은 2 번 glPushMatrix와 1 번 glPopMatrix를 호출합니다. 완전한 코드를 작성하면 도움이 될 것입니다. 그런데 glRotate 함수를 호출하지 않으면 빛이 어떻게 회전하고 있습니까? – Amadeus

+0

나는 그 질문을 정말로 이해하지 못한다. 토러스를 조명하고 그리는 코드를 복사하고 구체를 그리려면 수정 한 다음 구체를 렌더링하기 전에 광원을 다른 위치로 이동하면됩니다. 문제가있는 부분을 구체적으로 설명해 주시겠습니까? –

+0

새 조명의 색상과 새 모양의 색상을 변경하는 방법을 이해하는 데 어려움이 있습니다. – Helena

답변

2

나는이 문제가 더 개념적이라고 생각합니다. OpenGL은 stateful입니다. 이것은 실제로 상태를 수정하고, 무언가를 그렸으며, 상태를 다시 수정하고, 다른 것을 그립니다. OpenGL 1.x의 상태에는 행렬 스택, 재료 및 조명이 포함됩니다.

나는 당신이 생각하기에 새로운 빛의 물체를 추가하고 새로운 물체를 그려서 그려서 OpenGL로 렌더링하려고한다. 그것은 OpenGL의 작동 방식이 아닙니다. OpenGL에는 실제 객체가 없습니다.

무언가를 그릴 때 어떤 일이 발생합니까? glutSolidTorus으로 OpenGL이 화면을 포함하여 버퍼에 픽셀을 넣는다는 것입니다. 이 픽셀의 색상을 결정하기 위해 이전에 넣은 상태를 봅니다. 따라서 두 객체를 그리려면 먼저 조명, 재료, 첫 번째 객체의 위치를 ​​설정하고 glutSolidTorus을 호출 한 다음 두 번째 객체의 조명, 재료, 위치를 설정하고 glutSolidSphere으로 호출합니다. 구를 렌더링 할 때 "새 머티리얼을 추가"하거나 "새 빛을 추가"할 필요가 없습니다. 렌더링하기 전에 상태를 변경하기 만하면됩니다. GL_LIGHT0을 다른 위치로 이동하십시오.

+0

나는 물건을 찾아 냈습니다. 설명해 주셔서 감사합니다. :) – Helena