青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

OpenCascade Chinese Text Rendering

Posted on 2014-08-17 14:52 eryar 閱讀(5282) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCascade Chinese Text Rendering

eryar@163.com

Abstract. OpenCascade uses advanced text rendering powered by FTGL library. The FreeType provides vector text rendering, as a result the text can be rotated and zoomed without quality loss. FreeType also support unicode charset. The paper focus on the Chinese Text rendering.

Key Words. OpenCascade, FreeType, Chinese Text, 中文漢字, Unicode

1. Introduction

OpenGL中并沒有提供直接的文字繪制支持,一個通用的二維文字解決方案是使用glDrawPixels()來顯示位圖形式的字體,前提是用戶已經預先生成了一系列的位置形式的文字字庫,這也是很多早期計算機游戲的通用做法。使用位圖來繪制文字的主要問題是不能控制顯示過程中的圖像走樣。因為文字圖像的大小總是一定的,縮放后變形比較明顯;如果圖像是根據視點實時地進行縮放,則勢必消耗大量的系統資源。一個較好的解決方案就是使用紋理來表達矢量類型的文字。矢量文字的優點在于:每個字型都是使用數學公式來描述的,并使用光滑的曲線實現筆畫之間的連接。因此,將矢量文字用紋理來表達的話,只要預先設置的紋理分辨率滿足需求,那么對紋理面進行縮放或改變用戶的視點時,都不會造成明顯的文字失真變形。

矢量文字的處理首推著名的開源跨平臺開發庫FreeType。這是一個專業的字體數據解析工具,可以解析TrueType, Type1等多種矢量字體格式,并通過統一的函數接口提供給用戶程序使用。FreeType本身不包含文字排版和圖形化顯示的功能,因此可以直接將它解析字體文件的結果應用在OpenGL程序中。

OpenCascade的文字顯示就用到了FreeType庫,將文字轉換成了矢量圖形,所以可以對其任意縮放,都不會影響其顯示質量。且還支持Unicode的文字的顯示,當然也包含中文的顯示。本文主要介紹在OpenCascade中顯示中文的注意事項,也介紹了OpenCascade中將文字轉換成TopoDS_Shape的功能。

2. Render Chinese Text

OpenCascade在Draw Test Harness中有關于顯示文字的命令vdrawtext,顯示文字效果如下圖所示:

wps_clip_image-19716

Figure 2.2 Text in Draw Test Harness

實現上圖的Tcl命令如下圖所示:

wps_clip_image-4179

Figure 2.2 Draw Text Tcl Command

wps_clip_image-6580

Figure 2.3 vdrawtext command

從vdrawtext命令中可以看出,最后一個參數就是關于多字節字符串的顯示處理。輸入如下命令來顯示包含中文的字符串:

vdrawtext 你好OpenCascade 100  300 -400 000 255 255 0 0 000 1 50 1 SimSun 1 

顯示結果如下所示:

wps_clip_image-9941

Figure 2.4 Render Chinese Text by vdrawtext command

由圖可知,顯示結果不正確。找到vdrawtext命令實現部分的源代碼,實現代碼在文件VeiwerTest_ObjectCommands.cxx中,修改其轉換算法后代碼如下所示:

 

static int VDrawText (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
 
// Check arguments
  if (argc < 14)
  {
    di
<<"Error: "<<argv[0]<<" - invalid number of arguments\n";
    di
<<"Usage: type help "<<argv[0]<<"\n";
   
return 1; //TCL_ERROR
  }

  Handle(AIS_InteractiveContext) aContext
= ViewerTest::GetAISContext();

 
// Create 3D view if it doesn't exist
  if ( aContext.IsNull() )
  {
    ViewerTest::ViewerInit();
    aContext
= ViewerTest::GetAISContext();
   
if( aContext.IsNull() )
    {
      di
<< "Error: Cannot create a 3D view\n";
     
return 1; //TCL_ERROR
    }
  }

 
// Text position
  const Standard_Real X = Draw::Atof(argv[2]);
 
const Standard_Real Y = Draw::Atof(argv[3]);
 
const Standard_Real Z = Draw::Atof(argv[4]);
 
const gp_Pnt pnt(X,Y,Z);

 
// Text color
  const Quantity_Parameter R = Draw::Atof(argv[5])/255.;
 
const Quantity_Parameter G = Draw::Atof(argv[6])/255.;
 
const Quantity_Parameter B = Draw::Atof(argv[7])/255.;
 
const Quantity_Color aColor( R, G, B, Quantity_TOC_RGB );

 
// Text alignment
  const int hor_align = Draw::Atoi(argv[8]);
 
const int ver_align = Draw::Atoi(argv[9]);

 
// Text angle
  const Standard_Real angle = Draw::Atof(argv[10]);

 
// Text zooming
  const Standard_Boolean zoom = Draw::Atoi(argv[11]);

 
// Text height
  const Standard_Real height = Draw::Atof(argv[12]);

 
// Text aspect
  const Font_FontAspect aspect = Font_FontAspect(Draw::Atoi(argv[13]));

 
// Text font
  TCollection_AsciiString font;
 
if(argc < 15)
    font.AssignCat(
"Courier");
 
else
    font.AssignCat(argv[
14]);

 
// Text is multibyte
  const Standard_Boolean isMultibyte = (argc < 16)? Standard_False : (Draw::Atoi(argv[15]) != 0);

 
// Read text string
  TCollection_ExtendedString name;
 
if (isMultibyte)
  {
     
/* eryar modified 20140817 11:11
    const char *str = argv[1];
    while ( *str || *(str+1)=='\x0A' || *(str+1)=='\x0B' || *(str+1)=='\x0C' || *(str+1)=='\x0D'
                 || *(str+1)=='\x07' || *(str+1)=='\x08' || *(str+1)=='\x09' )
    {
      unsigned short c1 = *str++;
      unsigned short c2 = *str++;
      if (!c2) break;
      name += (Standard_ExtCharacter)((c1 << 8) | c2);
    }
   
*/
      Resource_Unicode::ConvertGBToUnicode(argv[
1], name);
  }
 
else
  {
    name
+= argv[1];
  }

 
if (name.Length())
  {
    Handle(MyTextClass) myT
= new MyTextClass(name,pnt,aColor,hor_align,ver_align,angle,zoom,height,aspect,font.ToCString());
    aContext
->Display(myT,Standard_True);
  }

 
return 0;
}

主要是當是多字節字符串,使用Resource_Unicode::ConvertGBToUnicode()函數來實現字符串轉換,修改后仍輸入前面的命令,可以顯示中文字體了:

wps_clip_image-23063

Figure 2.5 Render Chinese Text by vdrawtext command

綜上所述,結合Draw中的代碼可知,要在OpenCascade中顯示中文,需要注意以下幾點:

v 由于OpenCascade并沒有提供直接顯示文字的類,都需要從AIS_InteractiveObject派生一個文字顯示類,并重載有關函數Compute();

v 字符串轉換要使用Resource_Unicode::ConverteGBToUnicode()來將中文的字符串轉換為Unicode字符串;

v 一定要選擇正確的中文字體,否則也是顯示不正確的。

wps_clip_image-27915

Figure 2.6 A Chinese Quote

image

Figure 2.7 Chinese Quotes

對應的Tcl腳本為:

 

# Try to display the Chinese Text.
# eryar@163.com
# 2014-08-23


pload ALL

vinit
#vgrid

vsetgradientbg 
0 0 180 255 255 255 2

vzbufftrihedron

# render Chinese text with different font
vdrawtext "年歲有加,并非垂老\n理想丟棄,方墮暮年" 0 60 0 000 255 255 0 0 000 1 50 1 LiSu 1

vdrawtext 
"天行健,君子以自強不息\n地勢坤,君子以厚德載物" -100 300 0 255 0 0 0 0 000 1 50 1 SimHei 1


# make 3D text
text2brep text2d eryar@163.com Times-Roman 28 bold composite=0
prism text text2d 
0 0 6

# show result
vdisplay text
vsetdispmode 
1
vfit

 

3. Convert Text to TopoDS_Shape

借助于FreeType庫OpenCascade可以將文字轉換成樣條并生成TopoDS_Shape,即三維文字效果,相關的draw命令是text2brep,生成效果如下圖所示:

wps_clip_image-14323

Figure 3.1 3D Text in Draw Test Harness

生成上述效果的Tcl腳本如下所示:

text2brep text2d eryar@163.com Times-Roman 18 bold composite=0 

prism text text2d
0 0 2 

vdisplay text

vsetdispmode
1 

vfit

 

4. Conclusion

OpenCascade使用FreeType來實現了文字的高質量的顯示,因為是矢量圖形,所以任意縮放不影響文字的質量。

OpenCascade中顯示中文時,需要注意字符串轉換到Unicode時選擇正確的轉換函數,且要選擇正確的字體格式,即中文字體,本文中僅以仿宋SimSun為例。

OpenCascade還可將文字轉換為TopoDS_Shape進而可以顯示三維字體。

綜上所述,可知FreeType庫的功能還是很強大的。

5. References

1. 王銳,錢學雷,OpenSceneGraph三維渲染引擎設計與實踐,清華大學出版社

2. 在OpenCasCade的2D窗口中顯示漢字的方法,

http://www.cadcaecam.com/forum.php?mod=viewthread&tid=15444

3. OpenCascade Draw Test Harness code

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品国产精品亚洲精品| 欧美日韩成人综合| 麻豆精品视频在线| 欧美在线观看视频在线| 亚洲女同精品视频| 亚洲性xxxx| 亚洲欧美日韩国产中文| 美国十次了思思久久精品导航| 在线综合亚洲| 亚洲综合国产激情另类一区| 一区二区欧美激情| 亚洲资源在线观看| 欧美专区日韩视频| 欧美国产国产综合| 亚洲精品之草原avav久久| 一区二区不卡在线视频 午夜欧美不卡在 | 久久久91精品国产| 另类天堂av| 亚洲激情网站| 亚洲国产成人av| 亚洲在线观看| 欧美国产大片| 国产精品日韩欧美| 亚洲高清中文字幕| 亚洲一区二区三区视频| 久久一区二区三区四区五区| 91久久精品日日躁夜夜躁国产| 中文精品在线| 老鸭窝毛片一区二区三区| 欧美亚州在线观看| 在线精品福利| 久久国产精品久久久久久久久久| 亚洲国内自拍| 久久精品五月婷婷| 欧美少妇一区| 亚洲黄网站在线观看| 欧美亚洲视频在线看网址| 亚洲欧洲精品一区二区三区| 午夜久久资源| 欧美午夜一区二区福利视频| 亚洲激情另类| 久久久亚洲人| 宅男66日本亚洲欧美视频| 美女视频黄 久久| 国模私拍一区二区三区| 99这里只有久久精品视频| 欧美在线视频观看| 99精品视频一区二区三区| 亚洲一区制服诱惑| 欧美+亚洲+精品+三区| 久久婷婷人人澡人人喊人人爽| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲精品一区二区三区樱花| 久久久久久久一区二区三区| 欧美日韩精品欧美日韩精品| 亚洲性图久久| 亚洲人成网站精品片在线观看| 影院欧美亚洲| 在线视频亚洲一区| 亚洲欧洲日产国码二区| 久久久一区二区三区| 国产精品综合av一区二区国产馆| 一区二区三区日韩| 亚洲精品视频免费观看| 欧美—级在线免费片| 亚洲日本电影在线| 亚洲国产欧美日韩精品| 欧美福利电影网| 一区二区精品在线观看| 亚洲三级电影在线观看| 欧美日本成人| 亚洲在线免费| 午夜精品在线视频| 狠狠色香婷婷久久亚洲精品| 久久精品国产91精品亚洲| 午夜视频一区在线观看| 好吊视频一区二区三区四区| 久久天天躁狠狠躁夜夜爽蜜月| 精品动漫3d一区二区三区免费版| 欧美一区国产二区| 欧美一区日韩一区| 亚洲黄色在线| av成人老司机| 很黄很黄激情成人| 亚洲激情影视| 国产精品高精视频免费| 欧美伊人久久久久久久久影院| 亚洲在线视频免费观看| 国产午夜精品理论片a级探花| 久久人人爽人人爽爽久久| 欧美二区在线播放| 亚洲一区二区在线看| 亚洲欧美日韩在线一区| 激情另类综合| 亚洲乱码视频| 狠狠入ady亚洲精品| 免费试看一区| 欧美先锋影音| 亚洲电影免费| 国产精品男女猛烈高潮激情| 欧美一级精品大片| 欧美www视频| 久久国产婷婷国产香蕉| 女仆av观看一区| 欧美在线二区| 巨胸喷奶水www久久久免费动漫| 一区二区三区精品视频| 午夜免费电影一区在线观看| 日韩视频永久免费| 欧美影片第一页| 99热精品在线| 老司机免费视频久久| 欧美主播一区二区三区美女 久久精品人| 久久夜精品va视频免费观看| 亚洲一区二区视频在线观看| 久久国产精品久久久久久| 欧美国产精品久久| 欧美视频中文在线看 | 一区二区三区视频在线| 国产日韩欧美在线视频观看| 亚洲第一成人在线| 国产婷婷色一区二区三区| 亚洲国产99精品国自产| 国产一区二区三区高清| 亚洲美女诱惑| 亚洲精品免费看| 久久久一二三| 久久亚洲欧美| 国产无遮挡一区二区三区毛片日本| 亚洲国产精品久久91精品| 激情综合久久| 久久成人这里只有精品| 欧美一区观看| 国产偷国产偷亚洲高清97cao | 亚洲韩国青草视频| 最新中文字幕亚洲| 奶水喷射视频一区| 欧美激情视频一区二区三区不卡| 韩日成人av| 久久精品视频免费观看| 久久偷窥视频| 国内精品久久久久影院色| 久久国产夜色精品鲁鲁99| 久久成人资源| 影音先锋日韩资源| 久久久久久亚洲精品杨幂换脸 | 国产精品久久久久久久久借妻| 日韩视频中文字幕| 99www免费人成精品| 欧美日韩国产黄| 国产精品a级| 在线视频欧美日韩精品| 99国产精品久久久| 亚洲性视频网站| 国产精品高潮呻吟视频| 在线亚洲伦理| 欧美一级专区免费大片| 国产三区精品| 久久久久久网址| 亚洲精选成人| 香蕉久久夜色精品国产| 国语自产精品视频在线看8查询8| 欧美制服第一页| 欧美国产另类| 亚洲欧美日韩精品久久| 国产一区清纯| 欧美日韩国产免费观看| 亚洲欧美综合| 欧美激情视频一区二区三区免费 | 一本色道久久综合亚洲二区三区 | 欧美日韩在线观看一区二区三区| 午夜精品美女久久久久av福利| 国产亚洲成人一区| 嫩草影视亚洲| 亚洲一区二区三区精品在线观看 | 亚洲精品国产日韩| 久久成人免费视频| 一区二区三区在线视频免费观看| 免费看成人av| 欧美国产日韩a欧美在线观看| 亚洲精品国产品国语在线app| 亚洲免费视频成人| 亚洲电影自拍| 国产精品色一区二区三区| 狂野欧美性猛交xxxx巴西| 中文日韩欧美| 蜜桃久久av一区| 午夜国产不卡在线观看视频| 亚洲二区在线视频| 国产伦精品一区二区三区照片91| 欧美成人亚洲| 欧美自拍偷拍午夜视频| 一本久久综合亚洲鲁鲁| 欧美国产综合| 蜜桃av一区二区| 久久精品亚洲一区二区| 在线视频精品一区| 在线观看欧美激情| 国产亚洲制服色| 国产精品亚洲欧美|