基向量

用OpenGL列向量的方式讨论。

关键点:

  • 矩阵表示坐标空间变换。
  • 矩阵的列相当于是基向量。
  • 矩阵乘法(坐标空间变换)就是换基向量。

别无其他。基向量的解读方式真是简单透彻。

基础设定

看了100页3D数学基础,左右手坐标系、正负旋转方向、行列矢量乘法,是用图形库和引擎需要了解的几个前提。

OpenGL使用右手坐标系,DirectX使用左手坐标系,如果屏幕右边x、上边y,OpenGL屏幕朝里是-z,逆时针是正向旋转。

OpenGL使用列矢量,DirectX使用行矢量,矩阵乘法顺序是反的。

此外还有什么?

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的位置。算是支持简单的交互。

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

七夕

果然不出所料,一回到西安,躺在自己的床上,过去的事就像永远不会停止的陀螺一样在脑子里转。无论怎样困、头怎样疼,都无法入睡。

……

想写点什么,又担心无意中又伤害到谁,分手几个月,胆子变得小得多,话不敢乱讲,脾气不敢发,一切倒也相安无事,可能就此改变也未可知。重新打算写点什么,本意是想找回过去写记事的感觉。翻看旧的记事,前些年每年大概有两百到三百篇,而最近一年多,只有几十篇,其中大都真的是记事,一二十字而已。

今年买书快过千了,无奈时间不够,只读了一部分,有些只是翻过没仔细读。曾国藩说,读书要读完一本再读一本,我以前经常三四本一起读,以后得改。上个月在亚马逊花了三十九块大洋买了一套原价近两百的《曾国藩家书》。一套共四册,去杭州我以为读书时间不够,只带了第一册,没想到只一个星期就读完了。第一册家书里,曾国藩几位弟弟都还年轻,团练还没办,他本人还刚刚升到二品官,一切教训无外乎是学习和读书,即便这样也收获很多。钱穆曾跟李敖说,书要一遍遍读,治学要求通。曾氏的书,应该是值得一遍一遍读的。用冯唐的话说:

读《曾文正公嘉言钞》,和《论语》比较,同样零乱无体系,但是丰富很多,一切在现世做正经事儿遇到的心灵困扰都有指导,可以当事儿逼《圣经》常翻。于是欢喜。

以后读书写心得,深思、慎言、克己修身。找个目标,不荒废了自己。