VC下编程实现3D文字

2016-02-19 14:25 33 1 收藏

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的VC下编程实现3D文字,手机电脑控们准备好了吗?一起看过来吧!

【 tulaoshi.com - 编程语言 】

    提起3D文字制作,不少人会马上想到3D MAX等一些专门的3维制作工具,即使选用VC以编程的手段来实现也多是假手于OpenGL图形开发库来完成。熟悉OpenGL开发的编程人员一定对其初始化、材质以及灯光的渲染等一系列烦琐而又必要的编程过程深有感触。虽然通过以上的手段可以产生出包括3D文字在内的质感相当强的3维图形,但如果程序仅需要产生不很复杂的3D文字,而采用OpenGL去实现未免显得大材小用。其实在要求不很苛刻的情况下,完全可以通过MFC提供的CFont类制作出层次感较强的3D文字,其实现过程要比OpenGL简练得多。

  实现原理

  计算机屏幕是平面二维的,我们之所以能欣赏到真如实物般的三维图像,是因为显示在计算机屏幕上时色彩灰度的不同而使人眼产生视觉上的错觉,而将二维的计算机屏幕感知为三维图像。基于色彩学的有关知识,三维物体边缘的凸出部分一般显高亮度色,而凹下去的部分由于受光线的遮挡而显暗色。这一认识被广泛应用于网页或其他应用中对按钮、3D线条的绘制。对于本文所要绘制的3D文字同样也适用,即在原始位置显示高亮度颜色,而在左下或右上等位置用低亮度颜色勾勒出其轮廓,这样在视觉上便会产生3D文字的效果。具体实现时,可用完全一样的字体在不同的位置分别绘制两个不同颜色的2D文字,只要使两个文字的坐标合适,就完全可以在视觉上产生出不同效果的3D文字。

  具体实现

  在实现3D文字时一般不使用缺省的字体设置,而是通过对字体的设置而使产生的3D文字在视觉上更美观。在使用CFont类时,首先要通过其成员函数CreateFontIndirect根据预先设定好的LOGFONT结构来初始化CFont对象:

CFont m_font;

……

m_font.CreateFontIndirect(&lf);

  其参数为一个指向LOGFONT结构的指针。LOGFONT结构主要定义了字体的属性,其定义可通过MSDN帮助查到:

typedef struct tagLOGFONT {

LONG lfHeight;

//字符字体高度

LONG lfWidth; //字符平均宽度

LONG lfEscapement;

//文本行逆时针旋转角度

LONG lfOrientation; //字体角度

LONG lfWeight; //字体粗细程度

BYTE lfItalic; //倾斜

BYTE lfUnderline; //下划线

BYTE lfStrikeOut; //删除线

……

} LOGFONT;

  在对其进行设置时,lfOutPrecision、lfClipPrecision、lfQuality 以及lfPitchAndFamily这几个成员变量一般可如下设置而无需改动:

LOGFONT lf;

//lf定义字体属性

lf.lfOutPrecision= OUT_STROKE_PRECIS;

lf.lfClipPrecision= CLIP_STROKE_PRECIS;

lf.lfQuality = DRAFT_QUALITY;

lf.lfPitchAndFamily= VARIABLE_

PITCH|FF_MODERN;
 对于其他的成员变量则要根据实际需求进行具体的设定。例如,对于本文要显示的没有下划线和删除线并且没有倾斜处理的粗体幼圆汉字,可以采取如下设置:

lf.lfHeight = 50;

lf.lfWidth = 0;

lf.lfEscapement = 0;

lf.lfOrientation = 0;

lf.lfWeight = FW_HEAVY;

lf.lfItalic = FALSE;

lf.lfUnderline = FALSE;

lf.lfStrikeOut = FALSE;

lf.lfCharSet = GB2312_CHARSET; strcpy(lf.lfFaceName,“幼圆”);

  同其他使用CDC绘图类进行绘图的程序类似,对字体进行绘制处理也是在视类的OnDraw()函数中完成的。首先需要选择前面设定好的字体,由于3D文字的显示是靠两层(甚至更多层)文字的叠加而成,因此需要并将其背景设定透明,否则将仅在文字的轮廓处有3D效果,而文字内部仍是平面的:

CFont* pOldFont = (CFont*)pDC-SelectObject(&m_font);

pDC-SetBkMode(TRANSPARENT);

  在此为了说明原理仅选择了两层文字进行叠加,可通过API函数GetSysColor获得当前系统的三维高亮度色和三维低亮度色,并对字体进行设置,由于3维文字是文字在前,阴影在后,所以需要先对阴影部分进行绘制:

pDC-SetTextColor(::GetSysColor(COLOR_3DDKSHADOW));

pDC-TextOut(10,10,sTemp); //sTemp为待显示文字

  此时的效果如下图所示,但仍是2维文字:

 为了显示出3维效果,需要在其上覆盖上一层高亮度文字,显然坐标不能仍是(10,10),否则显示出的文字仍是2维的。一般可通过错开一两个像素来达到不同光源位置的3D文字效果,比如在此就是在原位置向右上移动了3个像素,可通过在平面移动适当的距离来控制3D效果的深度:

pDC-SetTextColor(::GetSysColor(COLOR_3DHILIGHT));

pDC-TextOut(13,7,sTemp);

  从下图可以看出此时已经具有了立体感相当强的视觉效果了:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  另外,还可以通过设置路径对象来对普通的3D文字进行轮廓勾勒,使之具备特殊的3D效果:

pDC-BeginPath(); //开始路径

pDC-TextOut(13,7,sTemp,19);

//向路径输出汉字

pDC-EndPath(); //结束路径

pDC-SetPolyFillMode(WINDING); //填充路径

pDC-StrokeAndFillPath(); //绘制路径外观、设置填充模式

  下图便为通过路径输出而得到的勾勒出轮廓的空心3D文字:

  结束语

  本文通过对CFont类和CDC绘图类的使用,结合色彩学的有关知识,成功地在VC下以简单的代码实现了效果比较好的3维立体文字。CFont类对字体控制的能力还是很强的,通过对CFont类的深入研究,可对字体的显示做出更加完备的控制。

(本文所述算法在Windows 98下,由Microsoft Visual C++ 6.0编译通过)

来源:https://www.tulaoshi.com/n/20160219/1606934.html

延伸阅读
【PS文字特效】PS制作3D文字效果   PS的3D功能用起来挺麻烦,可最终效果也是不错的tulaoshi,试试吧!
PowerPoint2013 3D文字效果   一、设置文本映像 选中右侧需要进行处理的文字,单击格式选项卡下文字效果选项,点击映像按钮,映像是指文字需不需要显示出倒影。我们选择一种映像。 二、设置文本棱台 在棱台中选择一种样式,这样看上去更具立体感,否则无法实现3D效果。 二、设置文本三维旋转 虽然进行...
标签: PS效果 PS PS基础
2.按Ctrl + T适当的把文字变形,这个需要按照实际文字的需要把握。让文字有点透视感。 图2 3.选择渐变工具,颜色设置如图3,然后如图4锁定图层,给文字拉上渐变色,效果如图4 图3 图4 4.把文字图层复制一份,把副本填充为颜色:#328A1C,按Ctrl + [ 把图层移下来,然后按住Alt键,移动小键盘上的方向图标左,下依次复制...
1、输入文字后ctrl+shift+p,再ctrl+j转成合成路径 2、ctrl+shift+c克隆一个。为方便我的讲解,我对上层文字命名为a,下层文字为b.选中b层文字进行位移,位移后的效果如下: 3、隐藏a层文字,继续对b层文字进行设置,画一矩形,放置如图示位置: 4、同时选中b层和矩形,执行修改组合路径联合,得到如图示的样子: 5、选中刀子工具...
【PS文字特效】PS 3D文字tuLaoShi.com效果教程   3D文字效果教程,简单粗暴几步即可以完成,适用于专题页面和海报制作      

经验教程

849

收藏

64
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部