• 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")

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

     

  • 相关阅读:
    字符序列(characts)
    装载问题(load)
    哈密顿路
    犯罪团伙
    回溯算法
    维修机器人
    旅行计划
    皇后游戏
    运输
    亲身实测可用的java实现wordxlsxpdf文件下载功能
  • 原文地址:https://www.cnblogs.com/ainima/p/6331129.html
Copyright © 2020-2023  润新知