我目前正在开发一个室内增强现实导航android应用程序,我正在努力使用带有Sceneform的Google ARCore来创建从我当前位置到目的地的导航路径(我的问题是关于渲染和显示,我已经整理好了我的位置必需品) .
如果有人可以从概念上或用代码向我描述一个在不同位置迭代渲染的好策略,arrowRenderable
我将非常感激(例如,我是否使用姿势、setWorldPosition()、setLocalPosition() 等...)。我也可以将 (lat,long) 转换为相机空间,所以我真的很想更好地理解 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");
}
}
}
或者,我也尝试使用一些 AR 地理定位 SDK,例如https://github.com/apply/ARCore-Location,但在移动时它太不准确了。我还没有尝试过 Wikiitude SDK。