美文网首页
官方例子---HelloSceneform

官方例子---HelloSceneform

作者: 爱做梦的严重精神病患者 | 来源:发表于2019-01-17 15:32 被阅读0次

 这个例子使用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()方法的作用有待查证。

相关文章

网友评论

      本文标题:官方例子---HelloSceneform

      本文链接:https://www.haomeiwen.com/subject/fmabdqtx.html