CG_9.18

完成了类Blender默认的视图操作,没看书没找资料,涂涂画画绕了挺久,有几个东西需要澄清。

Camera有Position,有Up和Direction。Blender有个有用的概念叫Cursor,是操作旋转时的中心点。

按住鼠标上下左右移动,是调整World围绕Cursor的旋转,Camera本身的位置和方向都不动,即该视角下,不论怎样旋转,LookAt矩阵都不用变化:

glm::lookAt(_position, _position + _direction, _up)

World围绕Cursor转动花了两个小时功夫,步骤是先位移到Cursor位置,然后绕X轴旋转,再绕Y轴旋转,再移回原位置。

一开始绕Y轴水平旋转时轴不对,不是物体实际的Y轴,而总是(0,1,0)。这里忽略的是绕X旋转后,Y轴已经被旋转了,需要计算新坐标系中“原Y轴”的向量,画一画就知道,应该是(0, cos, sin)。

CG_9.17

写了一个Camera,鼠标移动可以旋转,WASD可以移动摄像机位置,类似于Blender里的Walk Navi View。公式是自己推导的,能work,但好像跟学术做法不一致。

Camera的关键是三个参数:“位置向量”、“朝向向量”、“UP向量”,然后朝向和UP叉乘是垂直的左右向量。移动是调整“位置”,旋转是调整“朝向”,UP似乎不用变化。

建模或者地图编辑的视图是另一种,把整个World当成一个Model,目标跟随是另一种,Camera搞清楚够喝一壶,有哪些分类?

CG_9.15

写点3D图形学代码。

今天写:按Tab顺序变换选中的SceneNode,变色。支持按上下左右,调整被选中的SceneNode的位置。算是支持简单的交互。

“游戏类”的东西与图形渲染代码怎么剥离做抽象?