В настоящее время я разрабатываю приложение для Android для навигации в помещении с дополненной реальностью, и я изо всех сил пытаюсь использовать Google ARCore с Sceneform, чтобы создать путь навигации от моего текущего местоположения до пункта назначения (мой вопрос касается рендеринга и отображения, у меня уже есть потребности в моем местоположении) .
Если бы кто-то мог описать мне концептуально или с помощью кода хорошую стратегию для итеративного рендеринга arrowRenderable в разных положениях, я был бы очень признателен (например, использую ли я Poses, setWorldPosition (), setLocalPosition () и т. д.) . Я также могу преобразовать (широту, долготу) в пространство камеры, поэтому я действительно хочу лучше понять рендеринг ARCore.
Заранее благодарим вас и дайте мне знать, если вам нужна дополнительная информация.
Обновлено:
Что касается моей реализации, я использую IndoorAtlas для обработки моего внутреннего позиционирования. SDK IndoorAtlas для Android поставляется с возможностью поиска пути, которая создает маршруты от вашего текущего местоположения до пункта назначения (это загружается из ранее установленного графика навигации через онлайн-набор инструментов 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");
}
}
}
В качестве альтернативы я также попытался использовать некоторые SDK для геолокации AR, такие как https://github.com/appoly/ARCore-Location, но это было слишком неточно при перемещении. Я еще не пробовал Wikitude SDK.
@ J.Blackadar Спасибо за ваш совет, я отредактировал свой исходный вопрос, чтобы попытаться добавить больше контекста к тому, что я спрашиваю.
wikitude очень хорошо работала в демонстрационной версии, которую я пробовал, но, конечно, это платное решение. У меня были аналогичные неудовлетворительные результаты с ARCore-Location, и я еще не нашел подходящего решения с открытым исходным кодом




Добро пожаловать в Stack Overflow! Мы сможем помочь вам лучше, предоставив дополнительный контекст и подробности о вашей реализации, о том, что вы уже пробовали, а что не работает. См. руководящие указания для эффективной постановки вопроса.