C++游戏引擎中的坐标系

发布时间:2024年01月11日

一.Direct3D四大变换

? ? <1.世界矩阵变换:

? ? ? ?为了模拟3D物体的旋转,缩放,平移等功能,Direct3D将静态模型的顶点坐标x,y,z经过旋转平移矩阵变换以得到新的顶点坐标x1,y1,z1

D3DXMATRIX mTrans ;  
D3DXMatrixTranslation (&mTrans , 5 , - 3 , 0 );  
g_pd3dDevice->SetTransform (D3DTS_WORLD , &mTrans) ;  

? ? <2.取景变换:

? ? ? 为投影变换做准备,设置摄像机camera的坐标,观察点坐标,观察方向向量.

D3DXMATRIX matView; //定义一个矩阵  
D3DXVECTOR3 vEye(0.0f, 0.0f, -200.0f);  //摄像机的位置  
D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f); //观察点的位置  
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);//向上的向量
D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp); //计算出取景变换矩阵  
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //应用取景变换矩阵 

? ? <3.投影变换:

? ? ? ?计算机屏幕是2D界面,为了渲染3D模型故设计投影变换矩阵,可将3D模型投影到2D屏幕上.投影变换矩阵可设置摄像机光圈大小,视觉深度等参数.

D3DXMATRIX matProj; //定义一个矩阵  
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f, 1.0f, 1.0f, 1000.0f);//计算投影变换矩阵  
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj); //设置投影变换矩阵  

? ? <4.视口变换

? ? ? ?将投影结果选择性投射到2D屏幕中.

D3DVIEWPORT9 vp; //实例化一个D3DVIEWPORT9结构体,然后做填空题给各个参数赋值就可以了  
vp.X      = 0;      //表示视口相对于窗口的X坐标  
vp.Y      = 0;      //视口相对对窗口的Y坐标  
vp.Width  = WINDOW_WIDTH;   //视口的宽度  
vp.Height = WINDOW_HEIGHT; //视口的高度  
vp.MinZ   = 0.0f; //视口在深度缓存中的最小深度值  
vp.MaxZ   = 1.0f;   //视口在深度缓存中的最大深度值  
g_pd3dDevice->SetViewport(&vp); //视口的设置  

二.Unity3D中的坐标系

? ? ?为了简化矩阵变换操作和实际应用,游戏引擎将矩阵变换经过封装和处理后变成坐标系,通过提供坐标系之间的变换接口实现我们常用的功能.

? ? ?世界坐标系:与Direct3D世界坐标系相同,是物体的绝对坐标x,y,z

? ? ?局部坐标系:与世界矩阵变换对应的坐标系,物体局部坐标×世界矩阵变换 = 物体世界坐标x,y,z

? ? ?屏幕坐标系:与投影变换对应的坐标系,物体世界坐标×投影变换矩阵 = 2D屏幕坐标x,y

? ? ?视口坐标系:与视口变化对应,为物体在实际渲染窗口中的2D屏幕坐标x,y

三.相对坐标与相对运动

? ? ?在实际的游戏场景中,人物或者物体的移动是向前,向后,向左运动,是基于局部坐标系的位置偏移量.在blender中通过修改游标控制本地坐标系原点.

? ? ?C++游戏引擎一般提供绕世界坐标系旋转,绕本地坐标系旋转,沿本地坐标系移动,沿世界坐标系移动,获取一个物体相对于另一个物体的相对坐标等API实现物体相对运动坐标的确定和调整.

? ? ?例如Unity

文章来源:https://blog.csdn.net/qq_35829452/article/details/135516772
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。