|
|
发表于 2007-7-29 13:04:00
|
显示全部楼层
Re:用 “广告牌“来显示玩家头顶名字,效果不好。。。
LZ的思路有问题,不需要用公告牌技术,楼上说的方向是正确的,要用投影技术找到视锥投影z平面的x,y坐标,然后在这个坐标的位置直接写2d的文字就就可以了,这是我以前写的,你参考一下吧
另外这种思路可以实现绕点的公告牌效果,如果要实现绕轴的公告牌就是另一种思路了
void XScreen: rawTextToWorld(PSTR pMsg, float x, float y, float z,
int rect_width, int rect_height, D3DCOLOR color)
{
D3DXVECTOR3 p(0.0f, 0.0f, 0.0f);
D3DXMATRIX worldMat;
D3DXMatrixIdentity(&worldMat);
worldMat._41 = x;
worldMat._42 = y;
worldMat._43 = z;
D3DXMATRIX viewMat;
D3DXMATRIX projectMat;
D3DVIEWPORT9 viewPortMat;
m_pDevice->GetTransform(D3DTS_VIEW, &viewMat);
m_pDevice->GetTransform(D3DTS_PROJECTION, &projectMat);
m_pDevice->GetViewport(&viewPortMat);
D3DXVECTOR3 s;
//获取3D空间的P点投影到屏幕上的s点
D3DXVec3Project(&s, &p,
(D3DVIEWPORT9 *)&viewPortMat,
(const D3DXMATRIX*)&projectMat,
(const D3DXMATRIX*)&viewMat,
(const D3DXMATRIX*)&worldMat);
//printf("%s %f %f %f \r\n", pMsg, s.y, s.x, s.z);
if(s.z>0 && s.z <= 1.0f) //如果在可见范围只外投影的值和原点的z距离会大于1.0f
DrawText(pMsg, (int)s.y, (int)s.x, rect_width, rect_height, color);
} |
|