游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3966|回复: 8

请问如何在3D世界坐标里绘制文字,或者怎么把FONT的DRAWTE

[复制链接]

20

主题

56

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2008-5-4 11:08:00 | 显示全部楼层 |阅读模式
我想要文字移动 ,怎么做?
我的文字目前只能用FONT画在屏幕坐标,请问具体怎么做。或者有相关文章可以看

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-5-10 21:08:00 | 显示全部楼层

Re:请问如何在3D世界坐标里绘制文字,或者怎么把FONT的DRA

将文字写到图形中,然后空间贴图即可。
可以利用 RT 纹理,也可以利用普通纹理,通过 Surface 获取 DC 然后写上文字,处理透明。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-5-10 21:21:00 | 显示全部楼层

Re:请问如何在3D世界坐标里绘制文字,或者怎么把FONT的DRA

最简单的方法,计算射线,投影到view视图平面上,直接在那里绘制font就有可以了。
当然也有别的方法,比如楼上的做法,稍微麻烦点,也要计算投影,可以有更好的透视效果。

你可以看看诛仙和魔兽分别是这两种方式。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-5-11 00:33:00 | 显示全部楼层

Re: Re:请问如何在3D世界坐标里绘制文字,或者怎么把FONT

awenruicheng: Re:请问如何在3D世界坐标里绘制文字,或者怎么把FONT的DRAWTEXT画在3D空间里?

将文字写到图形中,然后空间贴图即可。
可以利用 RT 纹理,也可以利用普通纹理,通过 Surface 获取 DC 然后写上文字,处理透明。


为什么要用RT文理呢?
仅仅是为了能够直接使用ID3DXFont?

但这样绕的弯子是不是大了一些?

11

主题

114

帖子

118

积分

注册会员

Rank: 2

积分
118
QQ
发表于 2008-5-11 03:29:00 | 显示全部楼层

Re:请问如何在3D世界坐标里绘制文字,或者怎么把FONT的DRA

因为直接用文本的GDI绘制效率是大部分游戏无法接受的,所以需要把文字先绘制到纹理上

15

主题

56

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2008-5-11 11:20:00 | 显示全部楼层

Re:请问如何在3D世界坐标里绘制文字,或者怎么把FONT的DRA

问下怎么改变纹理对象里的图像数据?有方法但是不知道怎么用。

33

主题

544

帖子

554

积分

高级会员

Rank: 4

积分
554
发表于 2008-5-11 11:26:00 | 显示全部楼层

Re:请问如何在3D世界坐标里绘制文字,或者怎么把FONT的DRA

直接写在纹理上

22

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
发表于 2008-5-13 06:18:00 | 显示全部楼层

Re:请问如何在3D世界坐标里绘制文字,或者怎么把FONT的DRA

这是我读《Introduction.To.Direct3D9中文版》字体一章做的笔记,用D3DXCreateText绘制3D网格文字,Mesh可以做变换的哦,不过估计性能应该不会很好。
Step1.定义文字网格对象

ID3DXMesh* Text = 0;



22

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
发表于 2008-5-13 06:23:00 | 显示全部楼层

Re:请问如何在3D世界坐标里绘制文字,或者怎么把FONT的DRA

Step2. 用D3DXCreateText创建3D文字网格

//

    // Get a handle to a device context.

    //

    HDC hdc = CreateCompatibleDC( 0 );

    HFONT hFont;

    HFONT hFontOld;

    //

    // Describe the font we want.

    //

    LOGFONT lf;

    ZeroMemory(&lf, sizeof(LOGFONT));

    lf.lfHeight         = 25;    // in logical units

    lf.lfWidth          = 12;    // in logical units

    lf.lfEscapement     = 0;        

    lf.lfOrientation    = 0;     

    lf.lfWeight         = 500;   // boldness, range 0(light) - 1000(bold)

    lf.lfItalic         = false;   

    lf.lfUnderline      = false;   

    lf.lfStrikeOut      = false;   

    lf.lfCharSet        = DEFAULT_CHARSET;

    lf.lfOutPrecision   = 0;              

    lf.lfClipPrecision  = 0;         

    lf.lfQuality        = 0;           

    lf.lfPitchAndFamily = 0;   

    strcpy(lf.lfFaceName, "Times New Roman"); // font style

    //

    // Create the font and select it with the device context.

    //

    hFont = CreateFontIndirect(&lf);

    hFontOld = (HFONT)SelectObject(hdc, hFont);

    //

    // Create the text mesh based on the selected font in the HDC.

    //

    D3DXCreateText(Device, hdc, "hello!world!",

        0.001f, 0.4f, &Text, 0, 0);

    //

    // Restore the old font and free the acquired HDC.

    //

    SelectObject(hdc, hFontOld);

    DeleteObject( hFont );

DeleteDC( hdc );

Step3.渲染3D文字:

        //

        // Render

        //

        Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);

        Device->BeginScene();

        Device->SetMaterial(&d3d::WHITE_MTRL);

        Text->DrawSubset(0);

        Device->EndScene();

   Device-&gtresent(0, 0, 0, 0);

Step4.释放网格对象

void Cleanup()

{

    d3d::Release<ID3DXMesh*>(Text);

}

在DXUT中试过,可以绘制中文。其中d3d命名空间的函数如下:
template<class T> void Release(T t)

    {

        if( t )

        {

            t->Release();

            t = 0;

        }

    }

        

    template<class T> void Delete(T t)

    {

        if( t )

        {

            delete t;

            t = 0;

        }

    }


D3DMATERIAL9 d3d::InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p)

{

    D3DMATERIAL9 mtrl;

    mtrl.Ambient  = a;

    mtrl.Diffuse  = d;

    mtrl.Specular = s;

    mtrl.Emissive = e;

    mtrl.Power    = p;

    return mtrl;

}

const D3DMATERIAL9 WHITE_MTRL  = InitMtrl(WHITE, WHITE, WHITE, BLACK, 2.0f);

const D3DMATERIAL9 RED_MTRL    = InitMtrl(RED, RED, RED, BLACK, 2.0f);

const D3DMATERIAL9 GREEN_MTRL  = InitMtrl(GREEN, GREEN, GREEN, BLACK, 2.0f);

const D3DMATERIAL9 BLUE_MTRL   = InitMtrl(BLUE, BLUE, BLUE, BLACK, 2.0f);

const D3DMATERIAL9 YELLOW_MTRL = InitMtrl(YELLOW, YELLOW, YELLOW, BLACK, 2.0f);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 12:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表