纠结了很久,终于算是可以完全控制灯光位置了,好开心~
我的理解是这样的:(可能和实际的计算过程有出入,不过这么理解的确可以正确地进行编程。)
1、其实OpenGL只有一个坐标系,叫做世界坐标系,后面说的都是世界坐标系中的坐标。
2、摄像机始终在原点。
3、我们在程序里面写的物体的坐标或者灯光的坐标,是原始坐标。
4、物体和灯光在的 最终坐标 = 其原始坐标 * 变换矩阵。变换矩阵就是 GL_MODELVIEW,模型视图矩阵。
5、修改变换矩阵的方法是用glMultiMatrix*函数乘以另外一个矩阵。当然,自己计算矩阵较麻烦,可以用 glTranslate* glRotate* glScaled* 等来自动生成一些矩阵。
举几个例子:
1、让灯光随着镜头移动,例如CS里面枪的灯光跟随着人移动!
前面说了,摄像机是不动的(始终在原点),我们希望灯光在镜头那儿,所以灯光也要在原点呀~
灯光最终坐标 = (0,0,0) 即可!
因为我们只能设置原始坐标,所以将变换矩阵设置为单位矩阵以排除其影响,于是 最终坐标 = 原始坐标 * 单位矩阵 = 原始坐标。
设置灯光位置的代码大概是下面这样的。这段代码放到哪里都行,只要保证被执行一次就行 :)
glPushMatrix()
GLfloat final_pos[] = {0,0,0,1.0};
glLoadIdentity();
glLightfv( GL_L