【问题标题】:Correct handling for objects and lights in 3D space - OpenGL正确处理 3D 空间中的对象和灯光 - OpenGL
【发布时间】:2011-12-13 01:01:48
【问题描述】:

我正在尝试使用我的引擎启动并运行所有内容,但无法确定添加对象和灯光以正确渲染所有内容的顺序。

我在我的初始化中设置了我的投影和模型视图矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();                            

gluPerspective(75.0f,(GLfloat)width/(GLfloat)height, 0.1f , 1000.0f);

glMatrixMode(GL_MODELVIEW);                         
glLoadIdentity(); 

然后,当我渲染几何图形时,我会清除缓冲区并加载单位矩阵并更新我的相机。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

// Camera updates
glRotatef(camera.anglePitch, 1.0f, 0.0f, 0.0f);
glRotatef(camera.angleYaw, 0.0f, 1.0f, 0.0f);
glTranslatef(-camera.position.x, -camera.position.y, -camera.position.z);

// Now render
level.render();

我对我的关卡的看法是一个相机,我收集到的是四处移动的眼睛坐标。我正在尝试在我的关卡中渲染对象和灯光,并让它们出现在正确的位置。

我需要在世界的特定点添加对象。例如,在 (10, 10, 25) 处的圆环。在渲染这个圆环对象之前我需要做些什么来使它们在 10、10、25 时正确显示吗?例如,我是否需要渲染然后翻译它们?

另外,第 2 部分与灯光有关。这几乎是同一个问题。在渲染 50、50、50 时我必须考虑什么?我可以正常定位灯还是再做一次,我必须把它翻译到那里吗?还是我想多了?

【问题讨论】:

  • 你的问题有几点不清楚:首先,你指的是什么原点,眼睛坐标空间的原点还是物体坐标空间的原点?其次,“渲染灯光”是什么意思?你是指你的多边形是如何着色的,还是你想渲染一个看起来像光源的对象? (很抱歉最初在发布评论时混淆了,我没有写就错误地保存了它:)
  • 对不起。我试图避免这种情况。请告诉我我能澄清什么。
  • @jcage 如果您还有任何问题,请告诉我。我正在尝试正确地表达所有内容。我有绝对坐标的级别数据,即(2.5、1.2、10.2)处的三角形,我需要渲染的对象只有它们的网格坐标,然后是它们需要去的位置。如何在正确的位置渲染这些对象?类似于加载对象然后将它们翻译到它们的特定位置的东西?我真的不确定。希望这能解决我的问题。
  • 嗯,我会做的方式是转换对象的坐标,通过向每个对象添加该对象的所需位置。不需要通过模型视图矩阵进行翻译,只需执行简单的向量添加并像渲染关卡对象一样渲染它们。

标签: opengl render light


【解决方案1】:

如果我理解这个问题,我同意你想多了。 glTranslate 和 glRotate 的转换应用于模型视图矩阵,所有顶点乘以该矩阵以提供稍后将在投影中裁剪的眼睛坐标。同样的变换也适用于您的灯光。

您还可以使用 glPopMatrix 和 glPushMatrix 将模型视图矩阵的不同状态应用于不同的顶点。

我还建议您参考http://www.opengl.org/resources/faq/technical/transformations.htm 中的问题 9.070

【讨论】:

  • 好的。例如,我从文件中加载一个对象,并希望将其添加到 (100, 100, 0)。我只需加载对象,然后将其转换为 (100, 100, 0) 并应用我需要的任何旋转,就是这样吗?多个对象都需要在不同的位置渲染呢?我该怎么做?为了简单起见,假设我在不同的位置渲染了 5 个圆形模型。渲染这五个圆圈的循环会是什么样子。你可以给我一个例子吗?谢谢。
  • 另外,我真的很抱歉措辞令人困惑。你写的正是我需要的,我只是好奇 glTranslate 和 glRotate 如何适合在不同位置渲染多个对象的函数。
  • 我相信使用模型视图矩阵执行此操作需要为每个对象重建矩阵。所以循环将是 glLoadIdentity-> glRotate&Transform -> obj1.render -> glLoadIdentity -> glRotate&Transform -> obj2.render 等等。我有可能是错的,但我认为情况就是这样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
相关资源
最近更新 更多