DirectX10一变换(三)

一.基本变换

       当我们用Direct3D编程时,我们使用4 x 4矩阵描述变换操作,具体的思路是:先设置一个4 x 4矩阵M,然后为M的每一个元素赋值,使其满足一个特定的变换,然后,将一个点或者一个向量放到1 x 4 行向量v中,通过计算vM得到一个新的行向量v’,这就是变换后的向量。

注意:这里面有一个齐次坐标(homogeneous coordinate)的概念,通过第四个分量w决定描述的是一个点还是向量,即

(x,y,z,0):表示向量    (x,y,z,1)表示点

1.缩放

缩放矩阵:

          Sx   0   0   0

 S =    0  Sy  0   0

          0   0  Sz  0

          0   0   0  1

Sx  Sy ,Sz 分别表示几何体沿着x,y,z轴的缩放倍数

2.旋转、

假设任意旋转轴n = (x,y,z),旋转角度 θ,则旋转矩阵如下:

 

Rn = 

[

  c+(1-c)x2   (1-c)xy+sz  (1-c)xz -sy   0

  (1-c)xy -sz  c+(1-c)y2   (1-c)yz + sx   0

  (1-c)xz +sy  (1-c)yz - sx  c+(1-c)z2     0

     0           0            0       1

]

 

其中,c=cosθ、s=sinθ。

注意:在左手坐标系中,当沿着旋转轴的正轴方向俯视时,顺时针方向为正角。

3.平移

平移矩阵如下:

T = 

[  1   0   0   0

   0   1   0   0

   0   0   1   0

   bx  by   bz  1

]

二.DX中的运用

D3DXMATRIX  *WINAPI D3DXMatrixScaling(

D3DXMATRIX *pOut,

FLOAT sx,FLOAT sy,FLOAT sz

);

 

用途:

通过放缩系数sx,sy,sz生成放缩矩阵pOut

D3DXMATRIX *WINAPI D3DXMatrixRotationX

(

D3DXMATRIX *pOut,

FLOAT Angle;

);

用途:

生成一个旋转矩阵pOut,该矩阵绕X轴旋转Angle(弧度制角度)

注意:同理 D3DXMatrixRotationY,D3DXMatrixRotationZ

 

D3DXMATRIX *WINAPI  D3DXMatrixRotationAxis

(

D3DXMATRIX *pOut,

CONST D3DXVECTOR3 *pV,

FLOAT Angle

);

用途:

生成旋转矩阵pOut,该矩阵绕旋转轴pV旋转Angle

 

D3DXMATRIX *WINAPI  D3DXMatrixTranslation

(

D3DXMATRIX  *pOut,

FLOAT x,FLOAT y,FLOAT z

);

 

用途:

生成平移矩阵pOut,平移向量(x,y,z)

 

代码示例:

 

#include <iostream>
#define _USE_MATH_DEFINES // for C++
#include <cmath>
#include <D3DX10math.h>

#pragma  comment(lib,"d3dx10.lib")
#pragma  comment(lib,"d3dx10d.lib")

using namespace std;

ostream& operator<<(ostream& os,D3DXVECTOR4& v)
	{
		os<<"{"<<v.x<<","<<v.y<<","<<v.z<<","<<v.w<<"}";
		return os;
	}
	


ostream& operator<<(ostream& os,D3DXMATRIX& v)
{
	for (int i=0;i<4;++i)
	{
		for (int j=0;j<4;++j)
		{
			os<<v(i,j)<<" ";
		}
		os<<endl;
	}

return os;
}

int  main()
{

	D3DXVECTOR3 v(1.0f,1.0f,1.0f);

	D3DXVECTOR4 X(1.0f,  2.0f ,  3.0f ,  0);

	D3DXVECTOR4 Y;

	D3DXMATRIX A(
		1.0f,  2.0f ,  3.0f ,  0,
		  0 ,   1  ,  0    ,  0,
		  0,    0,     1    ,  0,
		  0,    0,     0    ,  1		
		);

	D3DXMATRIX B,C,D,E,F,G,H;

	D3DXMatrixScaling(&B,1.0f,2.0f,3.0f);

		C = A*B;

	D3DXMatrixRotationX(&D,M_PI_2);//沿着X轴旋转90度

	
	D3DXMatrixRotationY(&E,M_PI_4);//沿着Y轴旋转45度



	D3DXMatrixRotationZ(&F,M_PI);//沿着Z轴旋转180度



	D3DXMatrixRotationAxis(&G,&v,M_PI_2);//旋转向量v,旋转角度 90.0度



	D3DXMatrixTranslation(&H,1.0f,2.0f,3.0f);//平移向量,返回平移矩阵


	D3DXVec4Transform(&Y,&X,&A);

	cout<<"A="<<endl<<A<<endl;

	cout<<"B="<<endl<<B<<endl;
	
	cout<<"C="<<endl<<C<<endl;

	cout<<"X="<<X<<endl;

    cout<<"Y="<<Y<<endl;

	cout<<"D="<<endl<<D<<endl;

	cout<<"E="<<endl<<E<<endl;

	cout<<"F="<<endl<<F<<endl;

	cout<<"G="<<endl<<G<<endl;

	cout<<"H="<<endl<<H<<endl;

	system("pause");
	return 0;
}

结果显示:

 

 

注意事项:

1.要使用C++中的数学常量宏,需要在程序开始处声明

#define _USE_MATH_DEFINES // for C++

#include <cmath>

2.在程序中添加链接库的方法为

#pragma  comment(lib,"XXX.lib")

前提是链接库的搜索路径已经被添加进系统中

 

 

 

 

 

 

转载于:https://www.cnblogs.com/ainima/p/6331129.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值