DX笔记-现在有点饿了
2017-04-27 本文已影响0人
我原来还有这个账号
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.向量的规范化:
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(组件对象模型)
创建COM接口时不可使用C++关键字new。使用完一个接口应调用该接口相应的Release方法。
COM接口都有一个前缀1.
15.表面
表面是Direct3D主要用于存储2D图像数据的一个像素矩阵。本质上是一个线性数组。
宽度(width)和高度(height)都用像素来度量,跨度(pitch)用字节来度量。
// _surface是一个IDirect3DSurface9 interface的指针
// 获得当前表面的描述信息
D3DSURFACE_DESC sufaceDesc;
_surface->GetDesc(& surfaceDesc);
// 得到一个指向表面像素数据的指针
D3DLOCKED_RECT lockedRect;
_surface->LockedRect(
& lockedRect, // 指向获得的数据指针
0, // 指向整个表面
0); // 没有指向的标志
// 循环访问表面上的每个像素并将其标红
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();