BIN3D有段时间没写了,代码也没怎么看,有点空虚的节奏。哎,最近想法有点多了。
在别人的博客上对Nebula3评价不错,好吧,Ogre和Torque3D就先这样(Torque3D的代码确实堆得有点多,不是很容易看),研究一下Nebula3的代码(不过这个项目已经没有更新了)。
前面在BIN3D里面弄了一个Camera的控制,跟Maya Camera控制类似,但感觉不怎么好,今天
研究了下Nebula3里面的Maya Camera控制,顺便把BIN3D里的重写了。
Maya Camera控制的模型:
以某一点为中心,给定半径,构成一个球坐标系模型,Camera就围绕这个中心点在球上旋转。所以需要记录的数据有:
1:中心点坐标 lookAt
2:半径 radis
3:球坐标系的连个角度 theta 和 roha
在鼠标控制Camera的时候,主要就调节theta,roha(旋转控制), lookAt(平移),radis(缩放)。
通过这些参数构造Camera坐标系的 基和原点
1:基
假设Camera的初始点在(0, 0, radis)上面,这个时候Camera的基为x(-1, 0, 0), y(0, 1, 0), z(0, 0, -1 )记为Eo = (x, y, z)^t, 而theta和roha这用来旋转这个基,从而得到新的Camera的基。theta取值[0, pi]从y到-y,roha取值[0, 2pi],从z开始。theta影响绕x轴旋转,roha影响绕y轴旋转。故得
R = RotX(pi/2-theta)*RotY(roha)
En = Eo*R = (xn, yn, zn)^t
2:原点
原点实际上就是当前Camera在World下的坐标,记为P,从En里面得到zn,P = -zn*radis+lookAt。这里因为Camera的z轴是朝着lookAt这个点,所以需要-zn*radis来加lookAt。
这样View = Inv((En, P)^t)
其他:
RotX得到绕着x轴旋转的矩阵
RotY得到绕着y轴旋转的矩阵
^t表示转置
这里采用Vector*Matrix的形式
阅读(3084) | 评论(0) | 转发(0) |