2013-05-17 79 views
3

我是OpenGL的新手。我想編寫一個程序,顯示兩種不同顏色的形狀,一個是圓環和一個球體,另外兩個是獨立的光源,可以圍繞它們旋轉。OpenGL:兩個具有兩個獨立光源的物體,圍繞它們旋轉

到目前爲止,我有這個代碼,它使得光源很好地圍繞環面旋轉。但是我無法弄清楚如何添加一個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。把一個完整的代碼,所以,它會更容易幫助你。順便說一下,如果調用no glRotate函數,燈光如何旋轉? – Amadeus

+0

我真的不明白這個問題。您可以簡單地複製照明代碼並繪製圓環,修改它以繪製球體,並在渲染球體之前將光線移動到另一個位置。你能更具體地指出你遇到了哪些問題嗎? –

+0

我很難理解如何改變新燈的顏色和新形狀的顏色 – Helena

回答

2

我相信問題更具概念性。 OpenGL是有狀態的。這在實踐中意味着你修改狀態,繪製某些東西,再次修改狀態,繪製其他東西。 OpenGL 1.x的狀態包括矩陣堆棧,材質和燈光。

我相信你的想法,你想添加一個新的light對象,然後添加一個新的對象來繪製,然後讓OpenGL渲染它。這不是OpenGL的工作原理。 OpenGL中沒有真正的對象。

當你畫畫時會發生什麼,例如與glutSolidTorus,是OpenGL將像素放入緩衝區,包括屏幕。要確定這些像素的顏色,它會查看之前放置的狀態。因此,要繪製兩個物體,首先要爲第一個物體設置照明,材料和位置,請撥打glutSolidTorus,然後設置第二個物體的光照,材料和位置,請致電glutSolidSphere。請注意,您不需要「添加新材質」或「添加新燈光」來渲染球體。您只需在呈現前更改狀態,例如通過移動GL_LIGHT0到不同的位置。

+0

我想通了,感謝您解釋:) – Helena