Chinaunix首页 | 论坛 | 博客
  • 博客访问: 178052
  • 博文数量: 43
  • 博客积分: 827
  • 博客等级: 准尉
  • 技术积分: 487
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-26 19:19
文章分类

全部博文(43)

文章存档

2015年(1)

2014年(1)

2013年(5)

2012年(36)

我的朋友

分类: C/C++

2013-10-31 21:59:07

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

上一篇:Programmer’s dilemma

下一篇:南湖之春

给主人留下些什么吧!~~