Я новичок в 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();
}
Я считаю, что проблема более концептуальная. OpenGL с состоянием. На практике это означает, что вы изменяете состояние, рисуете что-то, снова изменяете состояние, рисуете что-то еще. Состояние OpenGL 1.x включает в себя стек матрицы, материалы и источники света.
Я верю, что вы хотите добавить новый световой объект, затем добавить новый объект для рисования, а затем сделать это в OpenGL. Это не то, как работает OpenGL. В OpenGL нет реальных объектов.
Что происходит, когда вы что-то рисуете, например с glutSolidTorus
является то, что OpenGL помещает пиксели в буферы, включая экран. Чтобы определить цвет этих пикселей, он смотрит на состояние, в котором вы его поместили ранее. Таким образом, чтобы нарисовать два объекта, вы должны сначала настроить освещение, материал, положение для первого объекта, вызвать glutSolidTorus
затем настройте освещение, материал, позицию для второго объекта, позвоните glutSolidSphere
, Обратите внимание, что вам не нужно «добавлять новый материал» или «добавлять новый свет» для рендеринга сферы. Все, что вам нужно сделать, это изменить состояние перед рендерингом, например, двигая GL_LIGHT0
в другую позицию.
Других решений пока нет …