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-07-01
  • 电脑上有什么软件可以把wifi分享给手机上

    “网络极客”,全新视角、全新思路,伴你遨游神奇的网络世界。 具有双网卡的电脑,可以将有线网络共享至无线网络,当做无线热点使用。 如果是Windows 10系统,可以通过系统自带的移…

    2023-07-12
  • 苹果手机怎样才能快速有效的清理内存?有什么办法?

    首先,明确一点,iPhone用户并不需要和安卓系统一样清理运行内存(RAM),而手机硬盘芯片(ROM)中存储的碎片信息需要在各自的APP内清理。 这是iPhone的iOS运存运行机…

    2023-01-26
  • 哈罗单车支付宝免费骑,支付宝哈罗单车怎么免押金骑

    可以明确的解答你,这个不是骗人的 我这人虽然年纪不小了,对新鲜事物却是非常能接受,有什么新东西出来我马上第一时间去体验,摩拜和OFO刚到我们这里时我就开始用了,当时首先下载的是摩拜…

    2023-04-08
  • 华为手机锁屏密码忘记了怎样解锁

    如果你不慎忘记了华为手机的锁屏密码,不要惊慌!有几种方法可以帮助你解锁手机并重新访问其中的数据。在执行任何操作之前,请务必备份重要数据并谨慎考虑可能的风险。以下是三种常用的解锁方法…

    2024-01-04
  • 怎样快速学会电脑

    基础知识就是说,无论你是用电脑从事哪方面的方面的工作,都应该了解的东西。 一、电脑的结构都已经标准化了的。大方向分为硬件和软件。 1.硬件就是你能摸得到的东西。比如:CPU(处理器…

    2023-02-17
  • 手机内存不足怎么清理微信内存

    相信有很多用户会有这样的烦恼,当初买手机时觉得32G、64G已经够用了,结果用了几个月之后手机内存提示不足了,时长打不开各种软件,必须要删除一些文件才能继续运行,结果查询一下软件占…

    2022-12-18
  • iphone7和iphone6s哪个值得购买

    第一个理由iphone7有很好的性能,iphone7搭载了苹果自家开发的A10处理器,比上一代A9性能强大不少,如果你想长时间使用那么性能是基础。 第二个理由iphone7系统更新…

    2023-03-29
  • 百变歌王k20(百变歌王k20价格)

    你们有看过直播吗?平时最喜欢看什么类型的直播呢?是电竞游戏直播?还是带货直播?美女直播?亦或者是二次元虚拟直播….. 随着直播行业的兴起,不少人尝到了其中的大甜头,也有…

    2023-07-15
  • 苹果ios11如何降级的,苹果8p降级ios11的系统

    iOS11一经发布已经吸引不少用户升级体验,但是难免存在一些不稳定的情况,比如有些第三方应用还未完全兼容,应用闪退和卡顿现象较为严重等等。如果你已经尝鲜完毕,想要重回iOS10.3…

    2023-01-12