所以,我试图围绕场景中心的静止物体旋转灯光。我很清楚我需要使用旋转矩阵才能进行这种转换。但是,我不确定如何在代码中执行此操作。我是线性代数的新手,所以任何有关解释的帮助都会有很大帮助。
基本上,我现在正在使用这两个,我不知道如何使光线传播物体。
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是一个不断递增的浮点数。
答案 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
然而,他们正在使用列向量。从您的旋转矩阵判断我确实相信您使用行向量,因此转换组件位于最后一行,而不是模型矩阵的最后一列。