0
点赞
收藏
分享

微信扫一扫

从0开发游戏引擎---物体的平移、旋转和缩放


在Direct3D中,如果我们未进行任何空间坐标变换而直接绘制图形的话,图形将始终处于应用程序窗口的中心位置,在默认情况下这个位置就是世界坐标系的原点(0,0,0)。我们也不能改变观察图形的视角方向。默认情况下的观察方向是世界坐标系的Z轴正方向,也就是垂
直程序窗口的位置。

变换

平移函数D3DXMatrixTranslation

D3DXMatrixTranslation ( D3DXMATRIX pOut, FLOAT x, FLOATy, FLOAT z )
第一个参数: D3DXMATRIX 类型的pOut,从类型上看就知道它是一个D3DXMATRIX类型的4
4矩阵,我们调用这个D3DXMatrixTranslation方法,其实就是在为这个矩阵赋值,让这个矩阵相对于原点有一个偏移量,也就是我们需要平移的距离。这个函数其实是在创建一个平移矩阵。
第二个参数: float 类型的x,代表x轴方向的平移量
第三个参数: float 类型的y,代表y轴方向的平移量
第四个参数: float 类型的z,代表z轴方向的平移量
如果要沿着Z轴的正方向平移10个单位,就需要按下面代码设置平移矩阵:
D3DXMATRIX mTrans;
D3DXMatrixTranslation(&mTrans,0,0,10);
g_ D3DDevice->SetTransform(D3DTS_ WORLD, &g_ worldMatrix);

旋转D3DXMatrixRotationX

旋转D3DXMatrixRotationX、D3DXMatrixRotationY和D3DXMatrixRotationZ

D3DXMatrixRotationX ( D3DXMATRIX pOut,float Angle) ;
第一个参数:D3DXMATRIX类型的
pOut,是作为输出结果的旋转矩阵。
第二个参数: float 类型的angle表示要旋转弧度值
例子:将一个对象沿Y轴旋转90度:
D3DXMATRIX mTrans;
float fAngle=90*(2.0f*D3DX_PI)/360.0f;
D3DXMatrixRotationY(&mTrans, fAngle);
// Set the world matrix.
g_ D3DDevice->SetTransform(D3DTS_ WORLD, &mTrans);

矩阵的缩放D3DXMatrixScaling

D3DXMATRIX *D3DXMatrixScaking
D3DXMATRIX pOut,
float sx,
float sy,
float sz
)
第一个参数:D3DXMATRIX类型的
pOut,是作为输出结果的缩放矩阵。
第二个参数到第四个参数,XYZ 轴的缩放比例。

投影变化

为了将相对较远的图形投影到同一个平面上并体现出“近大远小”的真实视觉效果,就需要用到投影变换。

为了能够将三维场景显示在二维的平面上(显示器是二维的),还需要通过投影变换将三维物体投影到二维的平面上,这个过程我们把它叫做透视投影或投影变换。

我们可以看到,摄像机的距离和角度唯一确定 了落地窗的大小。

从0开发游戏引擎---物体的平移、旋转和缩放_二维


从0开发游戏引擎---物体的平移、旋转和缩放_二维_02


就好比一个人站在的一间封闭房间里,房间唯一可以接收到光线的地方是一块高大的落地窗,而房间外面对着落地窗这边的,是一堵无限长无限宽,绵延到世界尽头的白色的墙。人眼透过落地窗看到房子外边三维的世界,最终投影在了那堵二维的墙上。

显然,投影窗口是一个二维平面,用于描述三维物体模型经过透视投影后的二维图像,在Direct3D中投影窗口平面默认定义为z=1的平面。虚拟摄像机与投影窗口平面共同构成了一个对观察者可见的三维空间。在3D图形学中这部分空间被称作视截体(ViewFrustum),位
于视截体内的物体模型被映射到二维投影投影平面上,而位于视截体外的物体模型或者其中一部分将不可见,这个过程我们称作裁剪(Clipping),(取屏幕内的景物, 屏幕外的一律无视)。

投影变换负责将位于视截体内的物体模型映射到投影窗口中。D3DX库中的D3DXMatrixPerspectiveFovLH函数可以用来计算一个视截体,并根据该视截体的描述信息创建一个投影矩阵变换。这个D3DXMatrixPerspectiveFovLH方法可以在MSDN中查到如下函数原型;

D3DXMatrixPerspectiveFovLH(
    D3DXMATRIX *pOut,
    FLOAT       fovy,
    FLOAT       Aspect,
    FLOAT       zn,
    FLOAT       zf
);

pOut:指向输出的 D3DXMATRIX 结构的指针,表示生成的透视投影矩阵。
fovy:视野角度,以弧度表示,指定了从相机视角看到场景的视野范围。
Aspect:屏幕宽高比,通常为屏幕的宽度除以高度。
zn:近裁剪平面到相机的距离。
zf:远裁剪平面到相机的距离。

调用案例

// 设置移动和旋转的矩阵
	D3DXMatrixTranslation(&g_translation, 0.0f, 0.0f, 3.0f);
	D3DXMatrixRotationY(&g_rotation, g_angle);

	//设置世界坐标的矩阵并且更新角度
	g_worldMatrix = g_rotation * g_translation;
	g_angle += 0.01f;
	if(g_angle >= 360) g_angle = 0.0f;

	// 设置世界坐标
	g_D3DDevice->SetTransform(D3DTS_WORLD, &g_worldMatrix);


举报

相关推荐

0 条评论