gpt4 book ai didi

java - ARFragment 和 GLSurfaceView 在一个 Activity 中兼容吗?

转载 作者:行者123 更新时间:2023-11-29 22:36:59 26 4
gpt4 key购买 nike

我正在尝试在我的 Android 应用程序中将 ARCore 示例 - hellosceneform 和 augmented_image_java 组合在一起成为一个 Activity 。也就是说,可以触摸屏幕并放下 AR 对象,也可以让相机扫描它识别的对象,并在对象周围放置一个 AR 框架。请帮忙?

最佳答案

Sceneform 在 SceneView 中实现了自己的渲染引擎类(class)。这使得它与 GLSurfaceView 不兼容。你可以通过组合 hellosceneform 来做你想做的事样本和 augmentedimage示例,它们都使用 Sceneform。

要合并两者,从 AugmentedImageActivity.java 开始并添加模型的成员变量:

private ModelRenderable andyRenderable;

您还需要 Andy 的模型。

然后在onCreate中,在onCreate()的末尾添加模型的加载和点击的处理:

   @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

arFragment = (ArFragment)
getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
fitToScanView = findViewById(R.id.image_view_fit_to_scan);
arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdateFrame);

/*** Add HelloSceneform functionality here vvvvvvvvv **/

// When you build a Renderable, Sceneform loads its resources in
// the background while returning a CompletableFuture.
// Call thenAccept(), handle(), or check isDone() before calling get().
ModelRenderable.builder()
.setSource(this, R.raw.andy)
.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;
});

arFragment.setOnTapArPlaneListener(
(HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {
if (andyRenderable == null) {
return;
}

// Create the Anchor.
Anchor anchor = hitResult.createAnchor();
AnchorNode anchorNode = new AnchorNode(anchor);
anchorNode.setParent(arFragment.getArSceneView().getScene());

// Create the transformable andy and add it to the anchor.
TransformableNode andy = new TransformableNode(arFragment.getTransformationSystem());
andy.setParent(anchorNode);
andy.setRenderable(andyRenderable);
andy.select();
});
}

增强图像 fragment 关闭了平面发现,因此您需要删除该代码以便渲染平面。此代码在 AugmentedImageFragment.java 中.只需删除这些行:

// Delete these lines to keep the plane discovery.
getPlaneDiscoveryController().hide();
getPlaneDiscoveryController().setInstructionView(null);
getArSceneView().getPlaneRenderer().setEnabled(false);

关于java - ARFragment 和 GLSurfaceView 在一个 Activity 中兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59435595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com