gpt4 book ai didi

opengl - 创建保留其世界坐标的固定光源

转载 作者:行者123 更新时间:2023-12-01 13:00:38 25 4
gpt4 key购买 nike

我想在固定在特定位置的场景中放置一盏灯。这是 OpenGL site 的内容不得不说:

How can I make my light stay fixed relative to my scene? How can I put a light in the corner and make it stay there while I change my view?

As your view changes, your ModelView matrix also changes. This means you'll need to respecify the light position, usually at the start of every frame. A typical application will display a frame with the following pseudocode:

  • Set the view transform.
  • *Set the light position //glLightfv(GL_LIGHT_POSITION,…)*
  • Send down the scene or model geometry.
  • Swap buffers.

If your light source is part of a light fixture, you also may need to specify a modeling transform, so the light position is in the same location as the surrounding fixture geometry.

所以我将其添加到 paintGL() 函数中。

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(0.0, 5.0, 0.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
GLfloat l0pos[] = {0.0, 0.0, 0.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, l0pos);
glPopMatrix();

当我站着不动时似乎还好,但是当我移动相机的眼睛位置或相机的中心位置时,灯光会闪烁。我做错了什么?


更新 2:我最终使用了这段代码,但我仍然遇到问题。光不再移动,但它的位置不准确。堆栈顶部的矩阵是由表示相机位置的 gluLookAt 命令生成的矩阵。

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(xCoordinate, yCoordinate, zCoordinate);
GLfloat lpos[] = {0.0, 0.0, 0.0, w};
glLightfv(GL_LIGHT0, GL_POSITION, lpos);
glPopMatrix();

最佳答案

我不完全确定这是否是导致您出现症状的原因,但是:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(0.0, 5.0, 0.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);

这里有一些您想要查看的内容。

首先,根据在线文档,gluLookAt 堆栈顶部的矩阵乘以相机变换矩阵,而不是设置它(此外,glPushMatrix 保留当前矩阵)。出于这个原因,在进行相机变换之前确保当前矩阵是单位矩阵是个好主意。推送/弹出通常就足够了,但如果您在任何其他转换之后或“内部”调用 gluLookAt,则可能会发生不好的事情。

其次,您需要使用实际的相机坐标,以便 GL 可以正确地变换光线位置。否则,灯光将不会随着场景几何体移动。我建议一次执行 gluLookAt,然后在再次弹出相机变换矩阵之前一次性变换灯光和绘制几何图形。这样您就可以确定您的灯光和几何形状按预期保持在一起。

关于opengl - 创建保留其世界坐标的固定光源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6205569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com