编程语言
首页 > 编程语言> > java – 使用GPS位置渲染ARCore中的3D对象?

java – 使用GPS位置渲染ARCore中的3D对象?

作者:互联网

我试图在Android中使用arcore构建增强现实导航. AR导航方向在印度是否可用?我只是按照这个链接使用arcore开发带有核心loaction的ar导航. https://github.com/appoly/ARCore-Location/tree/legacy.

是否有可能在Android中使用ARCore进行导航?任何帮助非常感谢请….

解决方法:

我也在研究这个问题,据我说,这是有可能的.由于其他一些工作,我还没有完成它,但我可以告诉你为实现这一目标你可以遵循的步骤.

最初,您需要了解如何在不点击屏幕的情况下放置对象,因为ARCore示例不允许这样做.我在StackOverflow上问了这个问题,最后得到了一个确实有效的答案.
How to place a object without tapping on the screen.你可以参考这个来实现这一目标.

在此之后,您需要找出将ar对象显示为方向所需的方向.为此,使用此公式找出标题

let lat1:Double = latSource/180 * .pi
let lng1:Double = lngSource/180 * .pi
let lat2:Double = latDestination/180 * .pi
let lng2:Double = lngDestination/180 * .pi

let y = sin(lng2 - lng1)*cos(lat2)
let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lng2 - lng1)

let tan2 = atan2(y, x)
let degre = tan2 * 180 / .pi
if degre < 0 {  return degre+360  }
else {  return degre  }

您需要传递源和目的地的纬度和经度,然后这将返回您目的地的TrueNorth角度.这是写的Swift,我希望你能把它转换成你想要的语言. Java或Kotlin

然后,您需要将此角度与设备罗盘角度匹配,并且当两者匹配时使用不放置对象的方法.我已经分享了这个链接.
这将为您提供目的地的对象.

之后,进行循环并将对象放在不同的z轴上.这是我写的代码

@Override
public void onUpdate(FrameTime frameTime) {



        frame = fragment.getArSceneView().getArFrame();

        if (frame != null) {

            for (Object o : frame.getUpdatedTrackables(Plane.class)) {

                plane = (Plane) o;

                if (plane.getTrackingState() == TrackingState.TRACKING) {
                    fragment.getPlaneDiscoveryController().hide();

                    Iterator iterableAnchor = frame.getUpdatedAnchors().iterator();

                    if (!iterableAnchor.hasNext()) {
                        method(plane, frame);
                    }
                }
            }
        }

}

public void makeAr(Plane plane, Frame frame ) {

    for (int k = 0; k <10 ; k ++) {
        if (this.degree >= 160 && this.degree <= 170) {
            Toast.makeText(this, "walk", Toast.LENGTH_SHORT).show();
            List<HitResult> hitTest = frame.hitTest(screenCenter().x, screenCenter().y);

            Iterator hitTestIterator = hitTest.iterator();

            while (hitTestIterator.hasNext()) {
                HitResult hitResult = (HitResult) hitTestIterator.next();

                modelAnchor = null;
                modelAnchor = plane.createAnchor(hitResult.getHitPose());

                AnchorNode anchorNode = new AnchorNode(modelAnchor);
                anchorNode.setParent(fragment.getArSceneView().getScene());

                TransformableNode transformableNode = new TransformableNode(fragment.getTransformationSystem());
                transformableNode.setParent(anchorNode);
                transformableNode.setRenderable(MainActivity.this.andyRenderable);

                float x = modelAnchor.getPose().tx();
                float y = modelAnchor.getPose().compose(Pose.makeTranslation(0f, 0f, 0)).ty();

                transformableNode.setWorldPosition(new Vector3(x, y, -k));

            }
        }
    }
}

private Vector3 screenCenter() {
    View vw = findViewById(android.R.id.content);
    return new Vector3(vw.getWidth() / 2f, vw.getHeight() / 2f, 0f);
}

此OnUpdate方法将Ar绘制到目标.完成此操作后,您需要使用Google Map Api数据安排所有内容.

据我所知,这是使用ARCore在AR中进行导航的最佳方式,因为在ARCore中有非常的限制,将来会有一些其他库可以使它变得容易.

我也尝试了ArCore Location,但是这对你来说不会有任何帮助,因为当你在路上行走时,它不会放置2D图像而不是3D.

祝你好运,希望你能完成这件事.

标签:java,core-location,android,arcore
来源: https://codeday.me/bug/20190722/1500110.html