在openGL/glsl中围绕静止对象旋转灯光

在openGL/glsl中围绕静止对象旋转灯光,opengl,glsl,Opengl,Glsl,所以,我试着在我的场景中心围绕一个静止的物体旋转一盏灯。我很清楚,我将需要使用旋转矩阵来实现这种转换。然而,我不确定如何在代码中实现它。我是线性代数的新手,所以在解释过程中任何帮助都会有很大帮助 基本上,我现在正在处理这两个问题,我不确定如何使光线在物体上循环 mat4 rotation = mat4( vec4( cos(aTimer), 0.0, sin(aTimer), 0.0), vec4( 0, 1.0, 0.0, 0.0),

所以,我试着在我的场景中心围绕一个静止的物体旋转一盏灯。我很清楚,我将需要使用旋转矩阵来实现这种转换。然而,我不确定如何在代码中实现它。我是线性代数的新手,所以在解释过程中任何帮助都会有很大帮助

基本上,我现在正在处理这两个问题,我不确定如何使光线在物体上循环

mat4 rotation = mat4(
    vec4( cos(aTimer), 0.0, sin(aTimer), 0.0),
    vec4(           0, 1.0,         0.0, 0.0),
    vec4(-sin(aTimer), 0.0, cos(aTimer), 0.0),
    vec4(         0.0, 0.0,         0.0, 1.0)
);
这就是我的灯光的设置方式:

float lightPosition[4] = {5.0, 5.0, 1.0, 0};
glLightfv(GL_LIGHT0, GL_POSITION, lightPositon);

此代码中的aTimer是一个不断递增的浮点

即使希望灯光围绕对象旋转,也不能使用旋转矩阵,而应使用平移矩阵

你正在处理的矩阵是模型矩阵。它定义对象的方向、位置和比例

这里的矩阵是旋转矩阵,所以光线的方向会改变,但位置不会改变,这就是你想要的

因此,这里有两个问题需要解决:

1.正确定义矩阵。由于您需要翻译(循环),我认为这是您需要的矩阵:

mat4 rotation = mat4(
  vec4( 1.0, 0.0, 0.0, 0.0),
  vec4( 0.0, 1.0, 0.0, 0.0),
  vec4( 0.0, 0.0, 1.0, 0.0),
  vec4( cos(aTimer), sin(aTimer), 0.0, 1.0)
);
2.为灯光定义一个好的顶点位置。由于它是单个顶点,并且移动灯光是模型矩阵(如上)的工作,因此光矢量4D应为:

float lightPosition[4] = {0.0f, 0.0f, 0.0f, 1.0f}; 
//In C, 0.0 is a double, you may have warnings at compilation for loss of precision, so use the suffix "f"
第四部分必须是一,因为正是因为它,翻译才有可能

你可以在这里找到更多信息


但是,它们使用的是列向量。从你的旋转矩阵判断,我相信你使用了行向量,所以平移分量在模型矩阵的最后一行,而不是最后一列

关于如何从函数中构造“look-at”矩阵的描述可能会对您有所帮助。我不想做look-at。我的gluLookAt函数固定在场景的中心,我不希望它改变。我只是想让光线使物体循环。对不起,我假设你有一个聚光灯,你想在光线围绕物体旋转时指向它。不清楚你在用什么。您的问题上有
glsl
标记,表示您正在使用glsl着色器。但是使用
glLightfv()
表明您可能正在使用传统的固定管道。你能说明你想去哪个方向吗?对于这两种方法,答案看起来非常不同。因此,我使用glsl是为了拥有着色器和所有。不过,在我的主文件中,我的所有openGL代码都在那里,我正在设置灯光。我仍然很困惑,那个链接并没有起到多大的作用。我来这里是因为我不知道该怎么做,也不知道该怎么写。我不明白为什么我不需要一个旋转矩阵,当我仍然需要光线在任何时候都面对物体的时候。此外,我使用glsl只是为了让您知道着色器的使用,但我的所有灯光都在我的主文件中声明。您没有提到您使用聚光灯,所以我假设您使用的是独立于方向的点光源。此外,应该让着色器移动灯光。你不应该在C代码上这样做。只需更新您的模型矩阵(认真地说,look-at函数就是您所需要的,例如look-QMatrix4x4),并将其作为统一文件发送即可。