DirectX10一变换(三)
一.基本變換
?????? 當(dāng)我們用Direct3D編程時,我們使用4?x?4矩陣描述變換操作,具體的思路是:先設(shè)置一個4?x?4矩陣M,然后為M的每一個元素賦值,使其滿足一個特定的變換,然后,將一個點或者一個向量放到1?x?4?行向量v中,通過計算vM得到一個新的行向量v’,這就是變換后的向量。
注意:這里面有一個齊次坐標(biāo)(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軸的縮放倍數(shù)
2.旋轉(zhuǎn)、
假設(shè)任意旋轉(zhuǎn)軸n?=?(x,y,z),旋轉(zhuǎn)角度?θ,則旋轉(zhuǎn)矩陣如下:
?
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θ。
注意:在左手坐標(biāo)系中,當(dāng)沿著旋轉(zhuǎn)軸的正軸方向俯視時,順時針方向為正角。
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
);
?
用途:
通過放縮系數(shù)sx,sy,sz生成放縮矩陣pOut
D3DXMATRIX?*WINAPI?D3DXMatrixRotationX
(
D3DXMATRIX?*pOut,
FLOAT?Angle;
);
用途:
生成一個旋轉(zhuǎn)矩陣pOut,該矩陣繞X軸旋轉(zhuǎn)Angle度(弧度制角度)
注意:同理?D3DXMatrixRotationY,D3DXMatrixRotationZ
?
D3DXMATRIX?*WINAPI??D3DXMatrixRotationAxis
(
D3DXMATRIX?*pOut,
CONST?D3DXVECTOR3?*pV,
FLOAT?Angle
);
用途:
生成旋轉(zhuǎn)矩陣pOut,該矩陣繞旋轉(zhuǎn)軸pV旋轉(zhuǎn)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軸旋轉(zhuǎn)90度D3DXMatrixRotationY(&E,M_PI_4);//沿著Y軸旋轉(zhuǎn)45度D3DXMatrixRotationZ(&F,M_PI);//沿著Z軸旋轉(zhuǎn)180度D3DXMatrixRotationAxis(&G,&v,M_PI_2);//旋轉(zhuǎn)向量v,旋轉(zhuǎn)角度 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; }結(jié)果顯示:
?
?
注意事項:
1.要使用C++中的數(shù)學(xué)常量宏,需要在程序開始處聲明
#define?_USE_MATH_DEFINES?//?for?C++
#include?<cmath>
2.在程序中添加鏈接庫的方法為
#pragma??comment(lib,"XXX.lib")
前提是鏈接庫的搜索路徑已經(jīng)被添加進系統(tǒng)中
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/ainima/p/6331129.html
總結(jié)
以上是生活随笔為你收集整理的DirectX10一变换(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在.Net中进行跨线程的控件操作(上篇:
- 下一篇: Maven报错“未结束的字符串字面值”