Как повернуть источник света вокруг неподвижного объекта (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();
}
Как я могу заставить этот новый источник света вращаться вокруг моего "модельного" объекта?
1 ответ
Для фиксированного трубопровода положение источника света назначается с glLight()
преобразуются с помощью матрицы вида модели, как и обычные объекты. Таким образом, вы можете использовать функции преобразования, чтобы позиционировать и вращать ваш источник света, как обычные объекты.
Чтобы повернуть источник света (или другой объект) вокруг точки, необходимо выполнить следующие действия. Пусть L будет там, где будет источник света, когда угол поворота составляет 0 градусов, а O будет объектом - объектом, вокруг которого вы хотите повернуть источник света.
- Установите источник света в положение LO (положение источника света относительно объекта)
- Поверните его вокруг требуемой оси (вероятно, оси Y)
- Переведите его на 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.