在DirectX可以直接向屏幕输出,其的位置不受坐标变换,视点变换的影响. 就是用 ID3DXFont接口来输出文字.
当然也可以输出随坐标和视点变化而变化的文字,就是用D3DXCreateText 函数,但要注意参数的设置,不正确时可能就会没有文字出现.可以设两个数字位,0.001,0.1:
关于坐标变换的问题: 想计算出某个点在屏幕上的坐标时,可以计算出内部的矩阵变换, 反之 计算出逆矩阵,也可以确定一个屏幕的点在3d中的位置,这里假定其在一个固定的深度.代码如下:
//给出一个屏幕坐标,然后估计一个世界坐标
D3DXVECTOR4 GetRecommValue(D3DXVECTOR4 value,D3DXMATRIXA16 & mat,D3DVIEWPORT9 & vp)
{
value.x=0.0f;//-15;
value.y=20.0f;//10;
value.z=0.8f;
value.w=1.0f;
D3DXVec4Transform(&value,&value,&mat);
value.x/=value.w;value.y/=value.w;value.z/=value.w;
value.x=(value.x*vp.Width/2)+(vp.Width/2);
value.y=(-value.y)*vp.Height/2+(vp.Height/2);
return value;
}
//输入是屏幕坐标,输出是屏幕坐标
D3DXVECTOR4 SreenToScreenGeneration(D3DXVECTOR4 dot,D3DXMATRIXA16 & mat,
D3DXMATRIXA16 & matInverse,D3DVIEWPORT9 & vp)
{
dot.x=(dot.x-vp.Width/2)*2/(vp.Width);
dot.y=(vp.Height/2-dot.y)*2/(vp.Height);
dot.x*=dot.w; dot.y*=dot.w;dot.z*=dot.w;
D3DXVec4Transform(&dot,&dot,&matInverse);
dot.z=0.8f; ///假定的深度
dot.w=1.0f;
D3DXVec4Transform(&dot,&dot,&mat);
dot.x/=dot.w;dot.y/=dot.w;dot.z/=dot.w;
dot.x=(dot.x*vp.Width/2)+(vp.Width/2);
dot.y=(-dot.y)*vp.Height/2+(vp.Height/2);
return dot;
}
D3DXVECTOR4 SreenToWorld(D3DXVECTOR4 dot,D3DXMATRIXA16 & mat,
D3DXMATRIXA16 & matInverse,D3DVIEWPORT9 & vp)
{
dot.x=(dot.x-vp.Width/2)*2/(vp.Width);
dot.y=(vp.Height/2-dot.y)*2/(vp.Height);
dot.x*=dot.w; dot.y*=dot.w;dot.z*=dot.w;
D3DXVec4Transform(&dot,&dot,&matInverse);
return dot;
}
我爱娟娟