osg显示文字,osg能开发安卓app吗

OSG默认只能显示英文和数字字符,如果想显示汉字的话必须加载中文字库,目前OSG只支持TTF格式的字库。

添加FreeType插件库

首先在Android.mk文件里添加对FreeType库的支持,找到LOCAL_LDFLAGS项并在最后添加以下两行:

LOCAL_LDFLAGS := -L $(LIBDIR) ...-l$(OSG_ANDROID_DIR)/lib/osgPlugins-3.6.5/libosgdb_freetype.a -l$(OSG_ANDROID_DIR)/obj/local/armeabi-v7a/libft2.a

然后在找在OsgMainApp.hpp里添加插件:

USE_OSGPLUGIN(freetype)

在项目中设置TTF字库文件

先从网上下载或从Windows里复制一份TTF文件到项目的assets目录下。然后在运行时将此文件复制到项目所在的内部存储的路径下,并把路径通过NDK传给OSG,以便于OSG通过C++代码加载字体文件。

在osgNativeLib.java最后添加:

public static native void setLocalFont(String fontName);

在MainActivity里实现字体文件的复制功能

private val fOntName= "fangsong_GB2312.ttf"private val fontFile by lazy { filesDir.path + File.separator + fontName }private fun checkLocalFont() { if (!File(fontFile).exists()) { try { val fis = resources.assets.open("font/$fontName") fis.copyTo(FileOutputStream(fontFile), 1024 * 6) } catch (e: IOException) { e.printStackTrace() } }}override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ... checkLocalFont() ... //建议在OSG初始化完成后调用 osgNativeLib.setLocalFont(fontFile)}

上述代码是在Android层面拿到字体位于项目所在的路径,现在需要把这个路径传给osgNativeLib.cpp

...JNIEXPORT void JNICALLJava_osg_AndroidExample_osgNativeLib_setLocalFont(JNIEnv *env, jobject obj, jstring fontName);...extern "C" JNIEXPORT void JNICALLJava_osg_AndroidExample_osgNativeLib_setLocalFont(JNIEnv *env, jobject obj, jstring fontName) { const char *lfOnt= env->GetStringUTFChars(fontName, JNI_FALSE); mainApp.setLocalFont(std::string(lfont)); //Release Strings to JNI env->ReleaseStringUTFChars(fontName, lfont);}

由于NDK只支持C语言的语法,所以osgNativeLib还要再二传手,把路径传给OsgMainApp,一般来说这个文件才是我们OSG的起始文件。

// OsgMainApp.hppvoid addText(const std::string & font);//OsgMainApp.cppvoid OsgMainApp::addText(const std::string & font) { setlocale(LC_ALL, ".936"); //等价setlocale(LC_ALL, "chs"); std::string str = "OSG for android 中文显示示例"; osg::ref_ptr<osgText::Text> text = new osgText::Text; osg::ref_ptr<osgText::Font> fOntHz= osgText::readRefFontFile(font); text->setFont(fontHz); text->setText(str, osgText::String::ENCODING_UTF8); text->setCharacterSize(40.0f); text->setPosition(osg::Vec3( 0.0, 0.0, 0.0f)); text->setAutoRotateToScreen( true); root->addChild(text);}

readRefFontFile就是读取字体文件并返回一个字体类型的指针,然后通过setFont设置这个字体指针,如果我们没有在项目中引入FreeType的插件库的话,readRefFontFile就直接返回一个null。
如果不需要操作字体指针的话可以直接在setFont指定字体文件的路径,这样代码更简洁些。

如何在OSG的Android平台上显示汉字

实际效果

本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023-03-23 10:12
下一篇 2023-03-23 11:23

相关推荐

  • 充不上电?开不了机?突然关机?不用担心了

    春节期间,小硕除了收到各式各样的祝福,剩下的大多都是问我自己的数码设备怎么突然充不上电的问题。 如:“我平板昨天还正常使用,怎么今天突然充不上电,开不了机。明明昨晚放在桌上,没有磕…

    2023-06-24
  • 微信网络连接不上其他都正常怎么回事

    手机微信明明连着网络,网络连接就是打不开,是怎么回事? 大家有没有发现,在使用手机微信的时候,明明手机连着网络就是打不开网页。 有几种可能的原因导致手机微信无法打开,即使网络连接正…

    2023-09-09
  • 三大秘籍,教你学会苹果手机相册加密

    “这个女生是谁?”当女朋友在你手机相册里看到了前任的照片,你该如何解释?(解释什么,恋爱时手机里就不该有前任的照片。)那当手机里有一些隐私或者不想被别人看到的照片该怎么做?如何将苹…

    2023-01-16
  • 魅族手机和小米手机谁好

    魅族手机,小米手机谁好谁坏?每个使用者都会有自己的答案。 我只能从我自己使用感受来解答。 小米1等了好久才买到,但是觉得值啊。那个时候别的手机同等配置都上三四千了。买了小米1后各种…

    2023-06-23
  • 抖音最新解封方法

    这个是我本人的亲身经历,从最开始永久封刀,慢慢的暂时冻结,然后现在已经完全解封,已经两年的时间 那我就从开始说吧,就是当时在19年的时候,当时在银行给客户办信用卡业务,我想着客户比…

    2023-09-17
  • 怎么用微信看电影不需要vip(微信看电影神器)

    我可以解答。随着手机使用越来越便利,用微信看电影越来越成为影迷的第一选择。今天小影就介绍一下在微信看电影的方法。 比如小影的“迷影生活”公众号,在菜单栏中间有个“在线观影”的选项,…

    2023-02-15
  • 你用什么表达爱,你用什么表达爱我

    钱。 从很小的时候我就知道,追求一个喜欢的女孩给她送零食比送情书效果更好,因为前者可以吃,而吃让人心情愉悦。 慢慢的长大了我更加明白钱是多么重要,前些日子闺蜜大学毕业实习,开始在外…

    2023-04-17
  • 那些年玩过的电脑单机游戏

    记得当年第一次去玩电脑游戏,网吧不叫网吧,而是叫“电脑室”或者“电脑房”。 电脑还没有盛行的年代,网络自然还没有搭建起来。此时能玩的只有单机游戏。 当时很多人开机都不会的,叫老板打…

    2023-08-06
  • #定位找人

    仅凭手机号码是否能定位他人位置?首先要明确,未经他人允许获取其位置是违法的。这里不会教授获取他人位置的方法,而是介绍几种手机定位技术。 ·1.基站定位:通过计算手机信号到达周围多个…

    2023-07-26
  • 微信qq如何在一台手机多开

    现在很多人因为工作和生活的关系,可能有好几个微信号或者QQ号,但是手机上只能下载安装一个相同的应用,这样就导致无法登录多个账号,有些人选择使用多开的工具,但是不安全,容易泄露隐私数…

    2023-04-02