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

相关推荐

  • 用华为手机摄影老司机的技巧有哪些

    华为手机拍摄的照片质量一直备受好评,老司机几个常用的华为手机摄影技巧: 合理运用HDR功能:HDR(高动态范围)是一种常用于拍摄高反差场景的功能,开启后能让照片的明暗层次更加自然,…

    2023-05-11
  • 文字转语音的软件哪个好免费

    文字转语音软件是近年来技术的一项创新,它可以将大段的文字内容无缝转化为语音播报,在繁忙的现代社会中,它已成为许多人追求高效率生活的利器之一。而通知栏文字转语音功能则更为实用,它可以…

    2023-07-16
  • 最酷炫的主题插件

    越狱后很多人或多或少都有将自己的iOS设备进行美化,国外用户也是这样的,最近就有国内用户分享了国外大神的美化成果,并且还将其美化效果所需的插件以及源地址翻译成了中文带给大家,来了解…

    2023-07-29
  • 畅谈转转二手手机内幕(转转二手手机到底靠谱不)

    近年来,随着闲置分享经济的兴起,诸多二手交易电商平台也迅速风靡。“转转”平台是原58同城的二手频道,较先推出二手手机质检服务,占据了较大的市场份额。 近日,有消费者向新华日报财经客…

    2024-01-07
  • 高德地图暂时下线顺风车业务

    上线5个月后,高德地图于8月26日下线顺风车业务。8月27日,高德地图相关负责人首次向北京商报记者表示,“出于安全考虑,高德地图已暂时下线顺风车业务”。不过,该负责人并未透露业务具…

    2023-08-29
  • wifi信号差教你一招轻松提高网速

    很多朋友都会有这样的疑问,明明升级到千兆宽带,但家里的网速没有变快,相比较反而比以前百兆网速变慢了。手机刷视频还会经常出现卡顿。向运营商咨询后说网速没有问题,可能是路由器出现了问题…

    数码科技 2023-03-24
  • 企业建网站如何做到快而且省钱呢

    作为一名IT行业的从业者,我来解答一下。 首先,企业建立网站要根据不同的定位来选择具体的方案,在当前云计算、大数据的时代背景下,建立网站本身并不困难,困难的是如何让企业网站发挥出其…

    2023-03-16
  • 固态硬盘如何进行安全擦除(怎样彻底擦除固态硬盘数据)

    如果上天再给我一次机会,我想让我的固态硬盘如刚出厂一般焕然如新!对于电脑高手来说这个愿望不难实现,只要对硬盘进行一次安全擦除(Secure Erase)操作就能实现。 不过现在要给…

    2023-06-26
  • 手机投屏到汽车屏幕上的方法(亿连如何将手机投屏到车载中控屏)

    车载投屏,手机投屏,实现手机投屏汽车的两种方法 车机实现手机投屏主要有两种方法,一种是用投屏软件,另一种就是数据线直接连接然后来实现手机向汽车屏幕的投影。 投屏软件 必捷投屏可以满…

    2023-04-24
  • 苹果8p12.4和13.6哪个好

    12.3绝对目前最佳系统! 8P12.3和12.3.2哪个好? 我个人认为两者其实真的没有太大的区别,IOS系统除了大版本的差别,以及各别版本出现的问题以外,其他的差别真的不大。我…

    2023-02-18