在ARCore中渲染/显示带有可渲染对象的导航路径?

时间:2018-08-22 20:08:28

标签: java android android-studio arcore sceneform

我目前正在开发一个室内增强现实导航android应用程序,并且正在努力将Google ARCore与Sceneform结合使用,以创建从当前位置到目的地的导航路径(我的问题是关于渲染和显示,我已经有了位置必要性挑出来)。

如果有人可以在概念上或通过代码向我描述一种在不同位置迭代呈现arrowRenderable的好策略,我将非常感激(例如,我使用Poses,setWorldPosition(),setLocalPosition( )等)。我也可以将(经纬度)转换为相机空间,所以我真的想更好地了解ARCore渲染。

在此先感谢您,如果您需要其他信息,请告诉我。

编辑:

关于我的实现,我正在使用IndoorAtlas处理我的室内定位。 IndoorAtlas Android SDK带有寻路功能,该功能可以创建从您当前位置到目的地的路线(此路线是通过IndoorAtlas在线工具集从先前设置的寻路图加载的)。这些路线由具有起点和终点(纬度,经度)坐标的腿组成。我想做的是沿着末端(纬度,经度)坐标迭代地渲染AR中的对象。

以下是我尝试的一种实现方式的示例:

public void createNavigationPath() {
        // loop through the wayfinding route
        for (IARoutingLeg leg : mCurrentRoute) {

            // current loc
            Location currentLoc = new Location("Current Location");
            currentLoc.setLatitude(mLocation.latitude);
            currentLoc.setLongitude(mLocation.latitude);

            // end of wayfinding route segment
            Location legEnd = new Location("Leg End");
            legEnd.setLatitude(leg.getEnd().getLatitude());
            legEnd.setLongitude(leg.getEnd().getLongitude());

            // conversion from (lat,long) to camera space
            // conversion implementation credit:  
            // https://github.com/dat-ng/ar-location-based-android
            float[] currentLocationInECEF = WSG84toECEF(currentLoc);
            float[] pointInECEF = WSG84toECEF(legEnd);
            float[] pointInENU = ECEFtoENU(currentLoc, currentLocationInECEF, pointInECEF);

            float[] cameraCoordinateVector = new float[4];

            Matrix.multiplyMV(cameraCoordinateVector, 0, mRotatedProjectionMatrix, 0, pointInENU, 0);

            Frame frame = arFragment.getArSceneView().getArFrame();

            // cameraCoordinateVector[2] is z, that always less than 0 to display on right position
            // if z > 0, the point will display on the opposite
            if (cameraCoordinateVector[2] < 0) {
                float x = (0.5f + cameraCoordinateVector[0] / cameraCoordinateVector[3]) * arFragment.getArSceneView().getWidth();
                float y = (0.5f - cameraCoordinateVector[1] / cameraCoordinateVector[3]) * arFragment.getArSceneView().getHeight();

                // Pose pose = new Pose(new float[]{x,y,cameraCoordinateVector[2]}, new float[]{0,0,0});

                Anchor anchor = arFragment.getArSceneView().getSession().createAnchor(frame.getCamera().getPose().compose(Pose.makeTranslation(x,y,cameraCoordinateVector[2])).extractTranslation());
                AnchorNode anchorNode = new AnchorNode(anchor);

                Node tempNode = new Node();
                tempNode.setParent(anchorNode);
                tempNode.setRenderable(arrowRenderable);

                Log.d(TAG, "Render Completed");
            }
        }
    }

或者,我也尝试过使用一些https://github.com/appoly/ARCore-Location之类的AR Geolocation SDK,但是移动时它太不准确了。我还没有尝试过Wikitude SDK。

0 个答案:

没有答案