日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DirectX10一变换(三)

發布時間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的DirectX10一变换(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。