1,使用键盘控制位置的移动
没有使用glutSpecialFunc,glutKeyboardFunc因为我这个win32程序。
2,
相机类里面定义了相机的三个方向成员:位置(position),target向量和up向量
前后移动是最简单的,因为这俩种移动方向和tartget向量在一条线上,我们只需要从起始位置加上或者减去一定数量的tartget向量即可实现前后移动,target向量本身不会变化。
在加减之前我们是使用一个常量‘步长‘ const
static
float STEP_SCALE = 1.0f;
不管哪个方向的移动都会乘上这个步长,其实就是改变移动速度。
左右的移动需要一个和tartget向量与up向量所在平面垂直的一个移动向量
两种组合:target * up 和 up * tartget,都有一个向量和平面垂直并且方向相反。
上下移动,修改y值就行。
3,
因为修改的是相机的位置,所以相对于观察物体,方向都是相反的。
相机向上移相当于观察物体下移了,相机左移相当于观察物体右移 。
只有前后移动是相同的,相机靠近或远离观察物体也是观察物体机靠近或远离相视角。
4,鼠标拖动调整相机方向:
5,
绕垂直于地面的向量(0,1,0)360度旋转,这个旋转的角度叫做‘水平倾角‘,这个向量叫做‘垂直轴线‘。绕一个和地面平行的向量上下旋转,这个倾斜角叫做‘垂直倾角。
鼠标左右滑动改变水平倾角使相机左右旋转,鼠标上下滑动改变垂直倾角使相机抬头低头。有了这两个倾角,我们想以此计算出旋转后最终的target向量和up向量。
6,
xy参数是鼠标在屏幕中的新的位置坐标。我先计算从之前的点到当前点在X和Y轴上的变化。然后将鼠标的位置设置为当前的点坐标作为下次调用的上个点坐标。按比例缩小后更新改变当前水平方向和竖直方向上的倾角。这里使用了一个效果比较好的缩放比例值20.0,但是在,
不同的电脑可能要调整不同的值是旋转的速度看上去合适(改变鼠标灵敏度相当于)。
7,