Mathematics for 3D Game Programming and Computer Graphics 笔记 Chapter 2

Chapter2 Matrices

2.1 Matrix Properties

  • MTij = Mji
  • (aM)ij = aMij
  • (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

Read more »

从五笔 86 转到五笔新世纪版

从初一开始用五笔字形,学的时候学的 86 版,用了也有 10 年了,今天突然在想五笔 98 年出过一个 98 版,难道这么多年再就没更新过?于是 Google 发现了新世纪版。

新世纪版不管与 86 还是 98 版,都有很大区别,98 版我没有用过,看网上的评论新世纪跟 98 版更接近一些。以下总结了一些 86 版与新世纪版的区别:

Read more »

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 ||

Read more »

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个顶点.

Read more »

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 配置界面。

Read more »

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)

想看效果的话去这里:

http://www.youtube.com/watch?v=jNa3axo40qM

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)

成功~