Sign in to follow this  

How to layout 2d Font with D3DXVector3 in DirectX9

This topic is 2836 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I was developing a HUD in DirectX9. so I used a method of Id3dxfont follow as: INT DrawText( LPD3DXSPRITE pSprite, LPCTSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color ); I found the position of LPD3DXFONT depending on the varible RECT. But the member left,right,top,bottom of RECT is integer not float. In the 3D space,there was a trouble for tranforming the postion of 2d font I want to know a idear to layout 2d font and tranforming the position of font with matrix. I needed your advice. thanks a lot

Share this post


Link to post
Share on other sites
if I clearly understand what do you want to do. You should find position of 3-dimensional point onto screen. The pseudocode below.


Vector2D WorldToScreen(Vector3D 3dpos, Matrix ViewProjection)
{
Vector4D pos4(3dpos.x, 3dpos.y, 3dpos.z, 1);
Vector4D proj4 = ViewProjection * Pos4;

return Vector2D(((proj4.x/proj4.w)+1.0) * 0.5, ((-proj4.y/proj4.w)+1.0) * 0.5);
}





Further you may place left-upper corner of text rectangle in computed position.

Oh, forget to add.
The returned coordinates will in [0;1] range. And if proj4.z will be less nil it's a back projection, and doesn't need draw such text (may to do special flag).

[Edited by - RomanAlex on March 2, 2010 6:25:25 AM]

Share this post


Link to post
Share on other sites
Well, you can't set a transform matrix for the font, only the sprite that it uses to render. So, you can just use (0, 0) as the top left of your RECT, and change the text position using the matrix passed to ID3DXSprite::SetTransform().

Share this post


Link to post
Share on other sites
Thank RomanAlex and Evil Steve for giving my great help.

Now,there was a new problem in my hud.

The font didn't align with the scale line when they translated together.


The scale line is always faster than the font.

code snippet:

D3DXMatrixTranslation(&world,vx,speed,vz);
world=world*matOrth;
p_Line->SetWidth(1.43f);
p_Line->Begin();
p_Line->DrawTransform(plongVertexlist,2,&world,D3DCOLOR_XRGB(0,255,0));
p_Line->End();

pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE ,true);

D3DXMatrixTranslation(&world,0,speed,0);
p_sprite->SetTransform(&world);

if (p_sprite != NULL)
{
Rt=p_sprite->Begin(D3DXSPRITE_ALPHABLEND);

p_Font->DrawText( p_sprite,speed_buffer,-1,&m_Rect_speed_Font,DT_LEFT,
D3DCOLOR_ARGB(0xcb,0,255,0));
//
Rt= p_sprite->End();
}
}

Share this post


Link to post
Share on other sites
Quote:
Original post by Evil Steve
Well, you can't set a transform matrix for the font, only the sprite that it uses to render. So, you can just use (0, 0) as the top left of your RECT, and change the text position using the matrix passed to ID3DXSprite::SetTransform().


so I used (0, 0) as the top left of the RECT,but font appeared on the left of screen not where i minded.

[Edited by - SandWind on March 10, 2010 10:36:00 AM]

Share this post


Link to post
Share on other sites

This topic is 2836 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this