视图空间变换

  一直被这个问题所困扰....

 原来在视图中,世界坐标系的位置其实是确定的,要想旋转或移动一个物体,既可以通过改变该物体在世界坐标系中的位置来改变,g_pDevice->SetTransform(D3DTS_WORLD,&mx_world); 还可以通过移动照相机来改变...一般主角的移动都是通过照相机的改变来实现..

  要改变照相机,必须计算视图空间变换矩阵.. 先看书上的原话.世界空间中的任何物体与摄象机是相对于世界坐标系而言的,然而在坐标系中摄象机的位置是任意的,为了使变换变得简单,我们把摄象机平移交换到世界坐标系的原点,并把它的方向旋转到屏幕内侧,即z轴正方向..世界坐标系中的任何物体都将随着摄象机的变换而做相同的变换...请注意最后一句话......世界坐标系中的任何物体都将随着摄象机的变换而做相同的变换,归根到底...摄象机只是虚拟出来的东西而已...最终变换的还是物体在世界坐标系中的物体....

 D3DXMatrixLookAtLH()..一直被这个函数迷惑,其实该函数只是个参考函数...如果想更灵活一些这个虚拟的东西(摄象机)的话...可自己计算视图变换矩阵(反正最后还是把物体的位置做一下旋转,移动.)..还好DirectX给我们提供了一些函数..D3DXMatrixRotationAxis..可绕任意轴进行旋转..根据此函数..就可以做到现实中很多种动作..斜航,偏移..等等.只需绕着向量旋转就行了...但是视图空间最后的变换是需要矩阵来作为参数的...不幸的是这个矩阵需要我们自己算出来..其实也简单..只需要两个矩阵,一个平移,一个旋转...然后合并(想乘)成一个矩阵...

下面是得出将摄象机移动到坐标系原点,并将方向旋转到z轴正方向的代码..为了方便管理..对摄象机定义4个向量,一些简单的变换只需要绕着这几个向量旋转就可实现 _up  _look _right _pos

//前三句是为了让这3个向量互相垂直..

void getViewMatrix(D3DXMATRIX* V)
{

D3DXVec3Normalize(&_look, &_look);

 D3DXVec3Cross(&_up, &_look, &_right);
 D3DXVec3Normalize(&_up, &_up);

 D3DXVec3Cross(&_right, &_up, &_look);
 D3DXVec3Normalize(&_right, &_right);

 // Build the view matrix:
 float x = -D3DXVec3Dot(&_right, &_pos);
 float y = -D3DXVec3Dot(&_up, &_pos);
 float z = -D3DXVec3Dot(&_look, &_pos);

 (*V)(0,0) = _right.x; (*V)(0, 1) = _up.x; (*V)(0, 2) = _look.x; (*V)(0, 3) = 0.0f;
 (*V)(1,0) = _right.y; (*V)(1, 1) = _up.y; (*V)(1, 2) = _look.y; (*V)(1, 3) = 0.0f;
 (*V)(2,0) = _right.z; (*V)(2, 1) = _up.z; (*V)(2, 2) = _look.z; (*V)(2, 3) = 0.0f;
 (*V)(3,0) = x;        (*V)(3, 1) = y;     (*V)(3, 2) = z;       (*V)(3, 3) = 1.0f;

}

最终返回矩阵V...可用做视图空间的变换的参数....只需要一个g_pDevice->SetTransform(D3DTS_VIEW,&V);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值