在openGL / glsl中围绕静止物体旋转灯光

时间:2014-05-16 03:48:31

标签: opengl glsl

所以,我试图围绕场景中心的静止物体旋转灯光。我很清楚我需要使用旋转矩阵才能进行这种转换。但是,我不确定如何在代码中执行此操作。我是线性代数的新手,所以任何有关解释的帮助都会有很大帮助。

基本上,我现在正在使用这两个,我不知道如何使光线传播物体。

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 个答案:

答案 0 :(得分:0)

即使您希望灯光围绕您的物体旋转,您也不能为此目的使用旋转矩阵,而是使用旋转矩阵。

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

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

所以这里要解决两个问题:

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"

第四个组成部分必须是一个,因为它可以翻译。

您可以在此处找到更多信息

Model matrix in 3D graphics / OpenGL

然而,他们正在使用列向量。从您的旋转矩阵判断我确实相信您使用行向量,因此转换组件位于最后一行,而不是模型矩阵的最后一列。