开始只是知道公告板就是不管摄相机怎么转,对象总是在摄相机前面。这是公告板中的一种,也是最常见的一种
如游戏中人物、NPC的名字等,就是用贴图技术,然后再用公告板,这样不管玩家怎么转动视角,总是能看见名字正对着自己,
终于自己实现了一回公告板函数
void Billboard(IDirect3DDevice9* Device,D3DXMATRIX &matInput,D3DXMATRIX &matOutput)
{
//=========================
//公告板技术
//==========================
D3DXMATRIX matBillboard,matView;
D3DXMatrixIdentity(&matBillboard);//初始化为单位矩阵
Device->GetTransform(D3DTS_VIEW,&matView);//取得观察矩阵
matBillboard._11 = matView._11;//赋值
matBillboard._13 = matView._13;
matBillboard._31 = matView._31;
matBillboard._33 = matView._33;
D3DXMatrixInverse(&matBillboard,NULL,&matBillboard);//求其逆矩阵
matOutput = matBillboard * matInput;
//公告板结束
}
函数说明:
返回值:void
Device 是一个IDirect3DDevice9* 类型的参数
&matInput 是一个D3DXMATRIX 类型的参数
&matOutput 是一个D3DXMATRIX 类型的参数
功能,将传入的matInput 矩阵,与摄相机矩阵的Look方向矩阵相乘,得到matOutput
用法
D3DXMATRIX matWorld;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixTranslation(&matWorld,1,1,1); //对matWorld 进行必要的变换 如translation ,rotation 之类的。
Billboard(g_pDevice,matWorld,matWorld);
g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
接下来就可以进行材料,纹理设置、绘制等工作了!
虽然是很简单的技术,但却很实用。