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

如何让虚拟人物自然融入现实?

时间:2023-04-02 00:53:12 Java

随着AR的发展,虚拟角色被广泛应用于游戏、直播、社交等APP中。比如在直播APP中,商家可以自由打造虚拟主播的形象。通过AR算法,虚拟形象在介绍时不会遮挡实物商品,提高了直播的真实性和趣味性。那么,如何让虚拟人物自然地融入现实,实现与用户的真实互动呢?华为HMSCoreAREngine提供单双体轮廓识别跟踪能力,实时输出人体轮廓Mask信息和对应的骨点信息。其中人体Mask能力可以识别跟踪当前画面中人体所在区域,支持多人识别,识别率达到90%,提供区域深度信息。通过人体轮廓追踪能力,开发者可以利用人体轮廓Mask信息来覆盖虚拟物体和场景。比如在拍摄AR照片时改变虚拟背景,让虚拟人偶躲在人身后等,都可以利用Mask能力实现更自然的遮挡效果,进一步提升AR应用的真实感和观看体验。Demo演示开发步骤开发准备1.注册成为开发者在开发应用之前,您需要在华为开发者联盟网站上注册成为开发者,并完成实名认证。具体请参见账号注册与认证。2.创建应用参见创建项目和项目下的创建应用,完成应用的创建。配置如下:“SelectPlatform”:选择“Android”。“支持的设备”:选择“手机”。“应用类别”:选择“应用”或“游戏”。3.集成AREngineSDK华为在Maven仓库集成方式中提供了AREngineSDK包。在开始开发之前,您需要将AREngineSDK集成到您的开发环境中。4.配置AREngineSDK的Maven仓库地址。对于低于7.0、7.0和7.1及更高版本的Gradle插件,AndroidStudio代码库配置有所不同。请根据您当前的Gradle插件版本选择相应的配置流程。5.添加构建依赖在你的项目中打开应用级的“build.gradle”文件。在“dependencies”中添加如下编译依赖。dependencies{implementation'com.huawei.hms:arenginesdk:{version}'}重新打开修改后的build.gradle文件,右上角出现SyncNow链接。单击“立即同步”并等待同步完成。应用开发运行前,验证并检查当前设备是否安装了AREngine。如果已安装,它将正常运行。如果没有,应用应该使用适当的方式提醒用户安装AREngine,比如主动跳转到应用市场,要求安装AREngine。具体实现代码如下(详见示例代码)。booleanisInstallArEngineApk=AREnginesApk.isAREngineApkReady(this);if(!isInstallArEngineApk){//ConnectAppMarketActivity.class为跳转到应用市场的activity。startActivity(newIntent(this,com.huawei.arengine.demos.common.ConnectAppMarketActivity.class));isRemindInstall=true;}创建一个BodyActivity,演示AREngine的识别能力,显示人体骨骼,输出人体特征。publicclassBodyActivityextendsBaseActivity{PrivateBodyRendererManagermBodyRendererManager;ProtectedvoidonCreate(){//初始化surfaceViewmSurfaceView=findViewById();//保持OpenGLES运行上下文。mSurfaceView.setPreserveEGLContextOnPause(true);//设置OpenGLES版本。mSurfaceView.setEGLContextClientVersion(2);//设置EGL配置选择器,包括颜色缓冲区的位数和深度位数。mSurfaceView.setEGLConfigChooser(...);mBodyRendererManager=newBodyRendererManager(this);mSurfaceView.setRenderer(mBodyRendererManager);mSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);}ProtectedvoidonResume(){//初始化ARSession用于管理AREng整个运行状态(ARConfigBase.ENABLE_DEPTH|ARConfigBase.ENABLE_MASK);mArConfigBaseAR.setFocusMode(FocusMode.AUTO_FOCUSmArSession.configure(mArConfigBase);}//将需要的参数输入setBodyMaskmBodyRendererManager.setBodyMask(((mArConfigBase.getEnableItem()&ARConfigBase.ENABLE_MASK)!=0)&&mIsBodyMaskEnable);sessionResume(mBodyRenderer}}Manager)创建一个BodyRendererManager,渲染AREngine获取的个人数据。publicclassBodyRendererManagerextendsBaseRendererManager{publicvoiddrawFrame(){//获取指定类型的所有可追踪对象集合Collectionbodys=mSession.getAllTrackables(ARBody.class);for(ARBodybody:bodies){if(body.getTrackingState()!=ARTrackable.TrackingState.TRACKING){继续;}mBody=body;hasBodyTracking=true;}//更新显示在屏幕上的人体识别信息。StringBuildersb=newStringBuilder();updateMessageData(sb,mBody);大小textureSize=mSession.getCameraConfig().getTextureDimensions();if(mIsWithMaskData&&hasBodyTracking&&mBackgroundDisplayinstanceofBodyMaskDisplay){((BodyMaskDisplay)mBackgroundDisplay,onArmeDisplay).mBody.getMaskConfidence(),textureSize.getWidth(),textureSize.getHeight());}//在屏幕上显示更新的身体信息。mTextDisplay.onDrawFrame(sb.toString());for(BodyRelatedDisplaybodyRelatedDisplay:mBodyRelatedDisplays){bodyRelatedDisplay.onDrawFrame(bodies,mProjectionMatrix);}catch(ArDemoRuntimeExceptione){LogUtil.error(TAGEx,"ExceptiononcetheArpDemoRuntion"time)}catch(ARFatalException|IllegalArgumentException|ARDeadlineExceededException|ARUnavailableServiceApkTooOldExceptiont){Log(...);}}//更新手势相关数据以供显示。privatevoidupdateMessageData(){if(body==null){返回;}floatfpsResult=doFpsCalculate();sb.append("FPS=").append(fpsResult).append(System.lineSeparator());intbodyAction=body.getBodyAction();sb.append("bodyAction=").append(bodyAction).append(System.lineSeparator());}}自定义相机预览类,用于实现基于一定置信度的人体绘制。publicclassBodyMaskDisplayimplementsBaseBackGroundDisplay{}获取骨架数据并将其传递给OpenGLES,OpenGLES将渲染数据并显示在屏幕上。publicclassBodySkeletonDisplayimplementsBodyRelatedDisplay{获取骨架点连接数据,传递给OpenGLES进行屏幕渲染。publicclassBodySkeletonLineDisplayimplementsBodyRelatedDisplay{}其他类内容请参考示例代码集成。更多详情>>访问华为开发者联盟官网获取开发指导文档华为移动服务开源仓库地址:GitHub、Gitee关注我们,第一时间了解HMSCore最新技术资讯~