当前位置: 首页 > 后端技术 > Java

足不出户,探索古今,打造在线3D数字博物馆!

时间:2023-04-01 17:09:02 Java

随着3D技术的不断创新,为了让更多的用户领略历史之美,越来越多的博物馆开始举办线上展览。通过模拟不同环境、灯光投射、360°无死角放大缩小展品,让观众享受身临其境的体验。不仅如此,在展品中加入BGM或语音解说,可以帮助观众了解展品的详细背景,让演示现场更加身临其境。效果指示看完如此逼真的效果展示,是不是想知道它是如何实现的呢?通过AndroidStudio的Kotlin工程实现3D场景构建、物品展示和声音播放功能即可完成。1.准备3D模型华为移动服务最新发布的3D对象建模服务(3DModelingKit),轻松建模。我们只需要利用手机摄像头,通过拍摄物体不同角度的图像,自动生成物体的3D几何模型和纹理,为应用提供3D模型构建、预览等能力。具体操作说明请参考《5分钟给商品建立3D模型,我是如何做到的?》2、创建3D对象视图接下来,我们将通过华为图形引擎服务,将准备好的展品的3D模型,创建一个交互式3D对象视图,如图:↓↓↓↓↓↓集成华为图形引擎服务的软件要求:JDK1.7及以上?minSdkVersion:设置为19及以上?targetSdkVersion:设置为19及以上?compileSdkVersion:设置为19及以上?Gradle3.5及以上版本build.gradle文件配置如下内容:buildscript{repositories{...maven{url'https://developer.huawei.com/repo/'}}...}allprojects{repositories{...maven{url'https://developer.huawei.com/repo/'}}}在应用级build.gradle文件中配置如下内容:dependencies{...implementation'com.huawei.scenekit:full-sdk:5.1.0.300'}示例项目使用Kotlin的viewBinding函数从而绕过了视图初始化样板代码。可以在应用级build.gradle文件中添加如下代码开启viewBinding功能:android{...buildFeatures{viewBindingtrue}...}build.gradle文件同步后,就可以使用图形引擎了项目中的服务。在本文中,我们只需要使用该服务来显示物品的3D图像并与之交互。如需使用其他功能,可参考华为图形引擎服务官方文档。创建一个3D视图创建一个自定义视图的目的很简单,保证视图初始化完成后第一个模型可以自动加载到视图中。通过默认的SceneView手动实现模型加载,如下::super(context)构造函数(context:Context?,attributeSet:AttributeSet?):super(context,attributeSet)overridefunsurfaceCreated(holder:SurfaceHolder){super.surfaceCreated(holder)loadScene("qinghuaci/scene.gltf")loadSpecularEnvTexture("qinghuaci/specularEnvTexture.dds")loadDiffuseEnvTexture("qinghuaci/diffuseEnvTexture.dds")}}显示项需要添加相关模型文件,打开工程文件夹,在“src/main”路径下创建“assets”文件夹,保存3D模型文件,例如:surfaceCreated中的loadScene()、loadSpecularEnvTexture()和loadDiffuseEnvTexture()方法用于加载item。创建表面后,第一个项目将加载到表面中。接下来打开用于显示3D模型视图的XML文件,在本项目中为activity_main.xml。在该文件中,创建您刚刚构建的CustomSceneView。下面的代码使用箭头图像在不同的项目模型之间切换。一切准备就绪,申请后打开就可以看到第一个展品:青花瓷花瓶。添加切换功能现在,我们可以通过切换功能查看多个展品的3D模型。在MainActivity中,配置如下信息:privatelateinitvarbinding:ActivityMainBindingprivatevarselectedId=0privatevalmodelSceneList=arrayListOf("qinghuaci/scene.gltf","tangyong/scene.gltf",)privatevalmodelSpecularList=arrayListOf("qinghuaci/specularEnvTexture.dds","tangyong/specularEnvTexture.dds",)privatevalmodelDiffList=arrayListOf("qinghuaci/diffuseEnvTexture.dds","tangyong/diffuseEnvTexture.dds",)overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)binding=ActivityMainBinding.inflate(layoutInflater)valview=binding.rootsetContentView(view)binding.ivRightArrow.setOnClickListener{如果(modelSceneList.size==0)return@setOnClickListenerselectedId=(selectedId+1)%modelSceneList.size//确保ID处在模型列表的范围内。loadImage()}binding.ivLeftArrow.setOnClickListener{if(modelSceneList.size==0)return@setOnClickListenerif(selectedId==0)selectedId=modelSceneList.size-1//确保ID在模型列表范围内.elseselectedId-=1loadImage()}}privatefunloadImage(){binding.csvMain.loadScene(modelSceneList[selectedId])binding.csvMain.loadSpecularEnvTexture(modelSpecularList[selectedId])binding.csvMain.loadDiffuseEnvTexture(modelDiffList[selectedId])}在onCreate()中,创建了一个简单的逻辑来查看下一个/上一个模型。项目文件路径在每个硬编码列表中存储为字符串。您可以自己修改此逻辑以使模型更具动态性。其中,selectedId表示正在展示的item模型的ID。这样就实现了使用SceneView来展示3D模型,效果如下:3.为展品添加说明文字当加载不同的3D模型时,我们可以通过华为音频服务播放展品对应的说明文字来为用户提供详细的展品介绍。集成华为音频服务的软件要求:?JDK版本1.8.211及以上?minSdkVersion:设置为21?targetSdkVersion:设置为29?compileSdkVersion:设置为29引擎服务软件要求较高,需要保证音频服务满足使用要求。首先打开应用级的build.gradle文件,添加音频服务的相关配置。dependencies{...implementation'com.huawei.hms:audiokit-player:1.1.0.300'...}在配置图形引擎服务之前,已经添加了必要的库,所以项目级的build.gradle不需要被改变。在activity_main.xml文件中,添加一个简单的播放按钮。此按钮可用于为显示的项目播放声音。然后在MainActivity中添加如下配置:privatevarmHwAudioManager:HwAudioManager?=nullprivatevarmHwAudioPlayerManager:HwAudioPlayerManager?=nulloverridefunonCreate(savedInstanceState:Bundle?){...initPlayer(this)binding.btnPlaySound.setOnClickManageListener{mHwA(selectedId)//创建播放列表实例。selectedId:要播放的曲目的参数。}...}privatefuninitPlayer(context:Context){valhwAudioPlayerConfig=HwAudioPlayerConfig(context)HwAudioManagerFactory.createHwAudioManager(hwAudioPlayerConfig,object:HwAudioConfigCallBack{overridefunonSuccess(hwAudioManager:HwAudioManager?){try{mHwAudioManager=hwAudioPlayerwManagermHwA?.playerManagermHwAudioPlayerManager?.playList(getPlaylist(),0,0)}catch(ex:Exception){ex.printStackTrace()}}overridefunonError(p0:Int){Log.e("init:onError:","$p0")}})}fungetPlaylist():List?{valplayItemList:MutableList=ArrayList()valaudioPlayItem1=HwAudioPlayItem()valsound=Uri.parse("android.resource://yourpackagename/raw/soundfilename").toString()//soundfilename不包含文件扩展名。audioPlayItem1.audioId="1000"audioPlayItem1.singer="Taoge"audioPlayItem1.onlinePath="https://lfmusicservice.hwcloudtest.cn:18084/HMS/audio/Taoge-chengshilvren.mp3"//这里Demo使用歌曲表示audioPlayItem1.setOnline(1)audioPlayItem1.audioTitle="chengshilvren"playItemList.add(audioPlayItem1)valaudioPlayItem2=HwAudioPlayItem()audioPlayItem2.audioId="1001"audioPlayItem2.singer="淘哥"audioPlayItem2.onlinewmuscusloic="://https.cn:18084/HMS/audio/Taoge-dayu.mp3"//这里Demo使用歌曲表示audioPlayItem2.setOnline(1)audioPlayItem2.audioTitle="dayu"playItemList.add(audioPlayItem2)returnplayItemList}添加上面的配置后,你可播放展品说明。该项目中使用的声音音频是在线资源。如需播放本地音频,可参考官网指南。这样就可以导入音频文件来为item播放声音了。至此,我们就可以用360°制作一个可以旋转、放大缩小、有音效的展览场景了。最后,除了3D文物展示等应用场景,我们还可以将这些能力应用到很多相关行业,比如:在线社交领域的萌脸、视频表情、视频虚拟背景;电商购物领域3D产品展示、家装场景渲染、AR试穿;3D解锁屏保/手机主题,3D特效渲染,视听领域的真人表情包;教育领域的3D教学、3D图书、VR远程教学。详细请参考:华为3D建模服务、开源仓库华为图形引擎服务官网、开源仓库华为音频服务官网、开源仓库华为HMSCore官方论坛解决集成问题请到StackOverflow并点击关注,第一时间了解HMSCore的最新技术~