【问题标题】:iPhone OpenGL-ES : Stopping the light source from movingiPhone OpenGL-ES:阻止光源移动
【发布时间】:2023-03-05 18:45:02
【问题描述】:

我一直关注lighting guide 并为我的旋转立方体设置了一个光源(通过用户交互在 3 轴上旋转)

但是,无论我做什么,我都无法让光源保持在正确的位置,它似乎随着立方体旋转。因此,如果我旋转立方体,一部分会被点亮,而另一部分则不会。

我正在做很多矩阵操作。我尝试重置矩阵,然后应用光源,我尝试glLoadIdentity() 重置视图。

我似乎无法保持静止。

static const Vertex3D light0Position[] = {{0.0, 10.0, 10.0}};
glLightfv(GL_LIGHT0, GL_POSITION, (const GLfloat *)light0Position); 

// Calculate light vector so it points at the object
static const Vertex3D objectPoint[] = {{8.0, 8.0, -4.0}};
const Vertex3D lightVector = Vector3DMakeWithStartAndEndPoints(light0Position[0], objectPoint[0]);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, (GLfloat *)&lightVector);

【问题讨论】:

    标签: iphone opengl-es lighting


    【解决方案1】:

    您指定给 OpenGL ES 的位置和聚光灯方向在调用 glLightfv 时由当前模型视图矩阵转换,并在调用 glLightfv 时由模型视图矩阵转换后应用于顶点调用 glDrawArrays/glDrawElements。两者都没有考虑投影矩阵的状态。

    为了让我们了解您的转换可能出错的原因,您需要准确显示何时将对象/世界/相机转换应用于模型视图矩阵,以及相对于相对于何处进行光照属性规范和绘制这个。

    【讨论】:

    • 有没有办法重置。我不得不做各种疯狂的事情来让立方体按我想要的方式旋转,但我需要一个固定的灯光
    • 您希望您的光源相对于相机保持固定,还是您的相机在世界中移动时的某个坐标?您现在如何创建/更新模型视图矩阵,以及多久更新一次光照属性(每帧一次,或仅在开始时)?
    • 我正在尝试每帧更新。没有相机(例如 glLookAt)。它只是一个呈现在我面前的 3D 立方体,它根据用户输入旋转。它使用 glMultMatrixf 进行旋转。无论旋转是什么,我基本上都需要它照亮立方体的右上角。
    • 如果“右上角”是相对于屏幕定义的,那么在模型视图矩阵中添加任何其他旋转之前,在剪辑空间中指定灯光位置和方向就足够了.这将确保在对立方体进行任何变换后,始终相对于屏幕应用照明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2011-09-16
    相关资源
    最近更新 更多