DirectX9.0
基礎知識:用類D3DXVETOR3表示3D空間中的向量
1.向量相等:
const float EPSILON = 0.001f;
bool Equals(float lhs, float rhs)
{
return fbs(lhs-rhs)< EPSILON ? true : false;
}
2.計算向量的模:
float D3DXVec3Length(const DDXVECTOR3 * pV); // 原型
D3DXVECTOR3 v(1.f,2.0f,3.f);
float magnitude = D3DXVec3Length(&v);
3.向量的規(guī)范化:
D3DXVECTOR3M* D3DXVec3Normalize(
D3DXVECTOR3 * pOUT, //結果
const D3DVECTOR3 * pV); //要求的向量指針
4.向量加法:只有維數相同的兩個向量才能相加
重載加法運算符(+)
D3DXVECTOR3 sum = u + v;
5.向量減法:
重載減法運算符(-)
D3DXVECTOR3 different = u - v;
6.數乘:
D3DXVECTOR3 scaledVec = u*10.0f;
7.點積:
float D3DXVec3Dot(
const D3DXVECTOR3 * pV1,
const D3DXVECTOR3* pV2); // 原型
float dot = D3DXVec3Dot(&u , &v);
8.叉積:
可以借助左手法則來判斷叉積的方向
D3DXVECTOR3 *D3DXVec3Cross(
D3DXVECTOR3 *pOUT, //結果
const D3DXVECTOR3 *pV1,
const D3DXVECTOR3 *pV2);
9.矩陣:
D3DXMATRIX M;
M(0,0) = 0.5f; // 括號運算符
D3DXMATRIX *D3DXMatrixIdentity(
D3DXMATRIX *pout); // 單位矩陣
D3DXMATRIX *D3DXMatrixTranspose(
D3DXMATRIX *pout, // 轉置結果
const D3DXMATRIX *pM); // 需要轉置的矩陣
D3DXMATRIX *D3DXMatrixInverse(
D3DXMATRIX *pout, // 求逆的結果
float *pDeeterminant,
const D3DXMATRIX *pM); // 要求逆的矩陣
D3DXMATRIX A(...);
D3DXMATRIX B;
D3DXMatriInverse(&B , 0 , &A);
10.平移矩陣:
D3DXMATRIX *D3DXMatrixTranslation(
D3DXMATRIX *pout, // 結果
float x, // 沿x軸平移的量
float y, // 沿y軸平移的量
float z); // 沿z軸平移的量
11.旋轉矩陣:
// 沿X軸旋轉
D3DXMATRIX *D3DXMatriRotationX(
D3DXMATRIX *pout,
float Angle);
// 沿Y軸旋轉
D3DXMATRIX *D3DXMatriRotationY(
D3DXMATRIX *pout,
float Angle);
// 沿Z軸旋轉
D3DXMATRIX *D3DXMatriRotationZ(
D3DXMATRIX *pout,
float Angle);
旋轉矩陣R的逆矩陣與其轉置相等幌衣,具備這樣特點的矩陣稱為正交矩陣矾削。
12.比例變換矩陣
D3DXMATRIX *D3DXMatrixScaling(
D3DXMATRIX *pout, // 結果
D3DXMATRIX sx, // x軸的變換比例
D3DXMATRIX sy, // y軸的變換比例
D3DXMATRIX sz); // z軸的變換比例
13.向量和點的變換
// 對點進行變換,并假定向量的第4個分量為1
D3DXVECTOR3 *D3DXVec3TransformCoord(
D3DXVECTOR3*pout,
CONST D3DXVECTOR3 *pV,
CONST D3DXMATRIX *pm);
// 對向量進行變換豁护,并假定向量的第4個分量為0
D3DXVECTOR3 *D3DXVec3TransformNormal(
D3DXVECTOR3 *pout,
CONST D3DXVECTOR3 *pV,
CONST D3DXMATRIX *pM);
14.COM(組件對象模型)
創(chuàng)建COM接口時不可使用C++關鍵字new哼凯。使用完一個接口應調用該接口相應的Release方法。
COM接口都有一個前綴1.
15.表面
表面是Direct3D主要用于存儲2D圖像數據的一個像素矩陣楚里。本質上是一個線性數組断部。
寬度(width)和高度(height)都用像素來度量,跨度(pitch)用字節(jié)來度量班缎。
// _surface是一個IDirect3DSurface9 interface的指針
// 獲得當前表面的描述信息
D3DSURFACE_DESC sufaceDesc;
_surface->GetDesc(& surfaceDesc);
// 得到一個指向表面像素數據的指針
D3DLOCKED_RECT lockedRect;
_surface->LockedRect(
& lockedRect, // 指向獲得的數據指針
0, // 指向整個表面
0); // 沒有指向的標志
// 循環(huán)訪問表面上的每個像素并將其標紅
DWORD * imageData = (DWORD *)lockedRect.pBits;
for(int i = 0; i < surfaceDesc.Height ; i++)
{
for(int j=0; j<surfaceDesc.Width; j++)
{
// index into texture, note we use the pitch and divide by four
// since the pitch is given in bytes and there are 4 bytes per DWORD
int index = i * lockedRect.Pitch / 4 + j;
imagedata[index] = 0xffff0000; // 標紅
}
}
_surface->UnlockedRect();