Mathematics for 3D Game Programming and Computer Graphics 笔记 Chapter 2
Chapter2 Matrices
2.1 Matrix Properties
- MTij = Mji
- (aM)ij = aMij
- (F + G)ij = Fij + Gij
- (FG)ij = Σ FikGkj (=F的第i行向量点乘G的第j列向量)
- F + G = G + F
- (F + G) + H = F + (G + H)
- a(bF) = (ab)F
- a(F + G) = aF + aG
- (a + b)F = aF + bF
- (aF)G = a(FG)
- (FG)H = F(GH)
- (FG)T = GTFT
从五笔 86 转到五笔新世纪版
从初一开始用五笔字形,学的时候学的 86 版,用了也有 10 年了,今天突然在想五笔 98 年出过一个 98 版,难道这么多年再就没更新过?于是 Google 发现了新世纪版。
新世纪版不管与 86 还是 98 版,都有很大区别,98 版我没有用过,看网上的评论新世纪跟 98 版更接近一些。以下总结了一些 86 版与新世纪版的区别:
Mathematics for 3D Game Programming and Computer Graphics 笔记 Chapter 1
Chapter 1 Vector
1.1 Vector Properties
- V = [V1, V2, … , Vn]
- aV = Va = [aV1, aV2, … , aVn]
- P + Q = [P1 + Q1, P2 + Q2, … ,Pn + Qn]
- P + Q = Q + P
- (P + Q) + R = P + (Q + R)
- (ab)P = a(bP)
- a(P + Q) = aP + aQ
- (a + b)P = aP + bP
- || V || = √( Σ Vi² )
- || P || >= 0
- |a| || P || = || aP ||
- || P + Q || <= || P || + || Q ||
Mathematics for 3D Game Programming and Computer Graphics 笔记 Chapter 0
Chapter 0 The Rendering Pipeline 渲染管线
0.1 Graphics Processors
一个典型的3D场景由许多物体组成,每个物体由一组顶点(vertices)表示,同时要指定一个 graphics primitive 来表明顶点数据应怎样组合在一起.下图为 OpenGL 支持的10种 primitive,通常3D模型由三角形列表表示,每个三角形指向顶点列表的3个顶点.
EC2 建立 FreeBSD 操作系统
回学校后没经济来源了,所以 linode 到期也就不续费了,知道 amazon 的 ec2 有免费的套餐,就把 blog 搬过来了,也顺便体验一下 FreeBSD。免费套餐支持个 wordpress 还是完全没压力。
之间由于操作错误,被 amazon 扣过钱,于是贴一下配置过程。
ec2 上没有默认的 freebsd 服务器,我是参照 http://www.daemonology.net/freebsd-on-ec2/ 配置的。
在搞定信用卡等东西之后,直接打开 https://console.aws.amazon.com/ec2/home 配置界面。
3D相机变换
在此使用UVN相机模型.比起欧拉相机模型,这种模型更自然也更容易.
如图,UVN向量定义了以相机位置为原点的一组基向量,相机变换要做到事就是把以xyz为基的世界坐标转换成uvn坐标.
假设在世界坐标系中相机的位置为c(cx, cy, cz),注视目标的位置为lookat(lx, ly, lz), 世界中任意一点 p(px, py,pz), 改点在uvn坐标系中的坐标为p”(px”, py”, pz”).
首先要计算相机的uvn向量.步骤如下:
1. n = lookat – c;
2.假设 v = (0, 1, 0);
3. u = v × n;
4. v = n × u;
5.(可选)将uvn向量分别除以长度,归一化
相机变换由平移和旋转两部分组成,我们可以这样理解: 首先将相机平移回原点, 然后再旋转一定角度使其朝向z轴正方向,这样uvn坐标系就和xyz坐标系重合,此时物体的坐标就是相机坐标了.
平移部分比较简单,可以直接用p’ = p – c = (px – cx , py – cy , pz – cz), 用矩阵表示就是:
| 1 0 0 0| T = | 0 1 0 0| | 0 0 1 0| |-cx -cy -cz 1|
旋转部分
将xyz坐标系中的一点转换成uvn坐标系中的点,直观来说, 就是计算该点在 uvn 三个轴上的投影长度, 也就是分别求与对应轴的点积.
| ux vx nx 0| p'' = | px' py' pz' 1| * | uy vy ny 0| = |p'*u p'*v p'*n 1| | uz vz nz 0| | 0 0 0 1|
总结:
|1 0 0 0| | ux vx nx 0| p'' = |px py pz 1| * |0 1 0 0| * | uy vy ny 0| |0 0 1 0| | uz vz nz 0| |-cx -cy -cz 1| | 0 0 0 1| | ux vx nx 0| = p * | uy vy ny 0| | uz vz nz 0| |-(c*u) -(c*v) -(c*n) 1|
Emacs – 多点编辑
sublime 火了也有一阵了,支持 vim 的快捷键,又有很多独特好用的功能,身边好多 vimer 都投奔 sublime 去了。
今天去翻了下 sublime 的功能,发现多点编辑的不错,果断搞到 emacs 上来。
用的是 multiple-cursors 插件,使用方法也很简单,官网很详细了,图就不贴了,只贴个配置文件
(add-to-list 'load-path "~/.emacs.d/site-lisp/multiple-cursors") (require 'multiple-cursors) (global-set-key (kbd "M-l") 'mc/edit-lines) (global-set-key (kbd "M-p") 'mc/mark-previous-like-this) (global-set-key (kbd "M-n") 'mc/mark-next-like-this)
想看效果的话去这里:
Ogre v1.8.1 安装和配置 VS2008
首先,下载一个 ogre sdk for vs2008 .下载后解压,例如 F:\ogre_code\OgreSDK_vc9_v1-8-1
然后设置系统变量 OGRE_HOME 为 F:\ogre_code\OgreSDK_vc9_v1-8-1 ,具体方法为 右键我的电脑->属性->高级系统设置->高级->环境变量.
要新建 VS2008 项目有两种方法:
方法一:使用 Ogre app wizard , 08版的下载地址 http://cdn.bitbucket.org/jacmoe/ogreappwizards/downloads/Ogre_VC9_AppWizard_1.8.0.exe
下载后随便安装在哪, 然后打开vs, 新建项目, 选择 OGRE Application 就能自动为你建好环境 ,并根据你的选项可能会给你一个可运行程序.
注意 wizard 的环境配置依赖于 OGRE_HOME 的设置.
方法二:手动配置.
新建 win32 空项目, 假设名为 HelloWorld , 项目位置为 F:\ogre_code\HelloWorld
新建 cpp 文件, 输入代码.
打开项目属性,在配置属性中进行如下设置:
常规->字符集->多字节字符集
调试->工作目录:$(OGRE_HOME)\Bin\$(ConfigurationName)
c/c++ -> 附加包含目录:
$(OGRE_HOME)\include;
$(OGRE_HOME)\include\OIS;$(OGRE_HOME)\include\OGRE;
$(OGRE_HOME)\Samples\Common\include;
$(OGRE_HOME)\boost
链接器->附加库目录:$(OGRE_HOME)\lib\debug;$(OGRE_HOME)\boost\lib
链接器->输入->附加依赖项: OgreMain_d.lib OIS_d.lib
以上是 debug 版本的设置, release 版本把上面对应的 _d 去掉.
ssh 共享 Session
ssh 登录服务器之后,如果要再开一个终端登录同一台服务器,还要再输一遍密码,好烦呀,于是找着一个session共享的方案
在 /etc/ssh/ssh_config 加入下面代码即可
HOST * ControlMaster auto ControlPath ~/.ssh/session/%r@%h:%p
Emacs — 配置 正则
由于要写 chrome 插件用到 javascript,于是
yaourt -S emacs-js2-mode
默认 .emacs 里的配置是
(autoload 'js2-mode "js2" nil t) (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))
但我需要 .json 文件同样用 js2-mode,参考 http://dsec.pku.edu.cn/~rli/WiKi/EmacsRegexp.html 改成了
(autoload 'js2-mode "js2" nil t) (add-to-list 'auto-mode-alist '("\\.\(js\|json\)$" . js2-mode)
无效…继续改…
发现 \. 在默认配置里是 \\. 想必原因肯定是正则经过了2次转义~ 于是
(autoload 'js2-mode "js2" nil t) (add-to-list 'auto-mode-alist '("\\.\\(js\\|json\\)$" . js2-mode)
成功~