ARCore Sceneform ViewRenderable 以随机角度旋转图像

Posted

技术标签:

【中文标题】ARCore Sceneform ViewRenderable 以随机角度旋转图像【英文标题】:ARCore Sceneform ViewRenderable rotates the image by random angle 【发布时间】:2020-05-22 04:14:44 【问题描述】:

我将 2D 图像放置在垂直墙上,就像挂在墙上的画一样。但是渲染的图像是随机旋转的。它没有正确对齐。我已经集成了以下代码:

 @RequiresApi(api = Build.VERSION_CODES.N)
    private void createViewRenderable(WeakReference<ARRoomViewActivity> weakActivity) 
        imageViewRenderable = new ImageView(this);
        Picasso.get().load(paintingImageUrl)
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .into(imageViewRenderable);

        ViewRenderable.builder()
                .setView(this, imageViewRenderable)
                .build()
                .thenAccept(renderable -> 
                    ARRoomViewActivity activity = weakActivity.get();
                    if (activity != null) 
                        activity.renderable = renderable;
                    
                )
                .exceptionally(
                        throwable -> 
                            return null;
                        );
    



 private void addToScene(HitResult hitResult) 
        if (renderable == null) 
            return;
        
        Anchor anchor = hitResult.createAnchor();
        anchorNode = new AnchorNode(anchor);
        anchorNode.setParent(arFragment.getArSceneView().getScene());

        node = new Node();
        node.setRenderable(renderable);

        transformableNode = new TransformableNode(arFragment.getTransformationSystem());
        node.setLocalRotation(Quaternion.axisAngle(new Vector3(-1f, 0, 0), -90f));
        node.setLookDirection(new Vector3(0, 10f, 0));
        transformableNode.setParent(anchorNode);
        node.setParent(transformableNode);
        transformableNode.select();
    

我正在使用以下 Sceneform 版本,也尝试了最新的 1.17.0 但无法成功

implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.7.0'

【问题讨论】:

您能否添加一张图片来说明未对齐的含义 - 这将有助于理解您的看法? 【参考方案1】:

默认情况下,锚点的方向是其中一个轴指向相机。这导致放置在地板上的模型“看着”用户。然而,墙上的模型最终会任意旋转。这可以通过设置节点的观察方向来解决。

在您的addToScene 方法中,您可以引入一个中间节点来固定相对于锚节点的方向。然后中间节点的子节点将被正确定向。

// Create an anchor node that will stay attached to the wall
Anchor anchor = hitResult.createAnchor();
anchorNode = new AnchorNode(anchor);
anchorNode.setParent(arFragment.getArSceneView().getScene());

// Create an intermediate node and orient it to be level by fixing look direction.
// This is needed specifically for nodes on walls.
Node intermediateNode = new Node();
intermediateNode.setParent(anchorNode);
Vector3 anchorUp = anchorNode.getUp();
intermediateNode.setLookDirection(Vector3.up(), anchorUp);

注意:上面代码示例中的最后两行是正确定位的关键。

【讨论】:

非常感谢@Survy。它工作完美,你刚刚拯救了我的一周!坚持下去。 这救了我的命,非常感谢@Survy!

以上是关于ARCore Sceneform ViewRenderable 以随机角度旋转图像的主要内容,如果未能解决你的问题,请参考以下文章

Sceneform 1.15 无法在 ARCore-Android 中播放 fbx 动画

ARCore Sceneform ChromaKeyVideo Sampleproject 如何使用视频功能

ARCore Sceneform ViewRenderable 以随机角度旋转图像

ARCore 不显示对象的真实尺寸

Google Sceneform – 是不是已弃用?有替代品吗? [关闭]

如何在 Flutter 中运行时生成 Sceneform 资源