首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在arCore plane中设置3d模型而无需点击

如何在arCore plane中设置3d模型而无需点击
EN

Stack Overflow用户
提问于 2019-05-19 23:58:30
回答 1查看 723关注 0票数 1

当检测到飞机时,我想立即在ARcore的随机部分上设置一个3d模型。不确定使用哪种方法进行设置。

代码语言:javascript
运行
复制
addOnUpdateListener(this::onUpdate);

 private void onUpdate(FrameTime frameTime) {
    if (numOfModels > 0) return;
    modelLoader1 = new ModelLoader(weakReference);
    Frame frame = arFragment.getArSceneView().getArFrame();
    Collection<Plane> planes = frame.getUpdatedTrackables(Plane.class);
    for (Plane plane : planes) {
        if (plane.getTrackingState() == TrackingState.TRACKING) {
            addObject(Uri.parse("andy_dance.sfb"));
            break;
        }
    }
}

private void addObject(Uri model) {
    Frame frame = arFragment.getArSceneView().getArFrame();
    android.graphics.Point pt = getScreenCenter();
    List<HitResult> hits;
    if (frame != null) {
        hits = frame.hitTest(pt.x, pt.y);
        for (HitResult hit : hits) {
            Trackable trackable = hit.getTrackable();
            if (trackable instanceof Plane &&
                    ((Plane) trackable).isPoseInPolygon(hit.getHitPose())) {
                modelLoader1.loadModel(hit.createAnchor(), model);
                break;

            }
        }
    }
}

public void loadModel(Anchor anchor, Uri uri) {
    if (owner.get() == null) {
        Log.d(TAG, "Activity is null.  Cannot load model.");
        return;
    }
    ModelRenderable.builder()
            .setSource(owner.get(), uri)
            .build()
            .handle((renderable, throwable) -> {
                MainActivity activity = owner.get();
                if (activity == null) {
                    return null;
                } else if (throwable != null) {
                    activity.onException(throwable);
                } else {
                    activity.addNodeToScene(anchor, renderable);
                }
                return null;
            });

    return;
}

public void addNodeToScene(Anchor anchor, ModelRenderable renderable) {
    numOfModels++;
    AnchorNode anchorNode = new AnchorNode(anchor);
    TransformableNode node = new TransformableNode(arFragment.getTransformationSystem());
    node.setRenderable(renderable);
    node.setParent(anchorNode);
    node.setLocalPosition(new Vector3(0f, 0f, 0f));
    modelLoader1.setNumofLivesModel0(2);
    arFragment.getArSceneView().getScene().addChild(anchorNode);

    setNodeListener(node, anchorNode, modelLoader1);

到目前为止,我可以用一个模型填充屏幕,但在屏幕的中心,我们希望将模型设置在角落,如果可能的话现在

EN

回答 1

Stack Overflow用户

发布于 2019-05-24 03:17:25

在活动开始时,我实例化了一个新的Vector3对象,以便稍后可以将其用于3d模型定位:

代码语言:javascript
运行
复制
vector = new Vector3();

通过实现一个世界锚来解决这个问题,这个世界锚被ARCore识别为手机位置:

代码语言:javascript
运行
复制
AnchorNode anchorNode = new AnchorNode();
    anchorNode.setWorldPosition(new Vector3(0, 0, 0));

有了AnchorNode集,我们就能够在世界上定位一个对象,知道它实际在哪里。

代码语言:javascript
运行
复制
vector.set(randomCoordinates(true), randomCoordinates(false), -.7f);

AnchorNode anchorNode = new AnchorNode();
    TransformableNode node = new TransformableNode(arFragment.getTransformationSystem());
node.setRenderable(ModelRenderable);
node.setParent(anchorNode);
node.setWorldPosition(vector);

vector.set()接受的参数是3个浮点数,它们是x,y,z坐标。为了使3d模型显示在相机的前面,建议x坐标在-.300到.300之间,y坐标在-.500到.500之间,z坐标在-.7到1之间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56209547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档