这个例子使用Sceneform UX包,来使创建AR更加简单。
1.ArFragment
首先在布局中,使用ArFragment:
<fragment android:name="com.google.ar.sceneform.ux.ArFragment"
android:id="@+id/ux_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
接着在Activity中获取ArFragment的实例:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设备是否支持AR检测
if (!checkIsSupportedDeviceOrFinish(this)) {
return;
}
setContentView(R.layout.activity_ux);
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
}
首先,需要判断Android和OpenGL等级。
根据官方文档表明,当检查通过后,ArFragment会自动创建一个ArSceneView和ARCore Session,并自动完成一些相关配置(具体作用不明,待查)。
2.ModelRenderable(可渲染模型)
接下来创建虚拟模型,首先需要导入3D模型的资源。对于如何导入3D模型资源,官方文档已给出了明确的操作步骤,不再赘述。
接下来,根据已导入的资源,创建虚拟的3D模型:
//当构建一个可渲染对象时,Sceneform将会在后台加载资源,并返回一个CompletableFuture对象。
//在调用get()之前,调用theAccept()、handle()或者isDone()。
ModelRenderable.builder()
.setSource(this, R.raw.iron_man)
.build()
//获得可渲染对象
.thenAccept(renderable -> andyRenderable = renderable)
.exceptionally(
throwable -> {
Toast toast =
Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return null;
});
3.AnchorNode(锚点)
最后需要设置监听器,当扫描好周围的平面环境,触摸手机屏幕触发监听器的回调:
arFragment.setOnTapArPlaneListener(
(HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {
if (andyRenderable == null) {
return;
}
// 创建锚点。
Anchor anchor = hitResult.createAnchor();
AnchorNode anchorNode = new AnchorNode(anchor);
anchorNode.setParent(arFragment.getArSceneView().getScene());
// 创建可变化的锚点,并加入可渲染模型。
TransformableNode andy = new TransformableNode(arFragment.getTransformationSystem());
andy.setParent(anchorNode);
andy.setRenderable(andyRenderable);
andy.select();
});
创建锚点需要使用:
HitResult(Defines an intersection between a ray and estimated real-world geometry~~~定义光线与估计的真实世界几何体之间的交点)。
Plane(Describes the current best knowledge of a real-world planar surface~~~描述当前对真实平面的最佳了解。)
对于锚点(AnchorNode)的概念不是很明确,同时setParent()方法的作用有待查证。
网友评论