Я украсил свой дом с помощью дополненной реальности: вот как я это сделал
26 января 2023 г.Примерно полгода назад я решил начать украшать свой новый дом. Прежде чем приступить к работе, я провел множество исследований по различным темам, связанным с внутренней отделкой, например, как выбрать последовательную цветовую схему, какие размеры и как сделать, и как выбрать правильную мебель. р>
Однако моя подготовка заставила меня понять, что независимо от того, насколько хорошо вы подготовлены, вы всегда будете сталкиваться со множеством неожиданных проблем. Прежде чем бежать в мебельный магазин, я перечислил все предметы мебели, которые хотел разместить в своей гостиной, включая диван, чайный столик, растения в горшках, обеденный стол и ковер, а также определил ожидаемые размеры, цвета и комплектацию. стилей этих различных предметов мебели. Однако, когда я, наконец, добрался до мебельного магазина, головокружительное разнообразие выбора привело меня в замешательство, и мне было очень трудно представить, как разные варианты мебели будут выглядеть в реальной гостиной.
В этот момент мне пришла в голову мысль: было бы здорово, если бы было приложение, позволяющее пользователям загружать изображения своего дома, а затем свободно выбирать различные мебельные изделия, чтобы посмотреть, как они будут выглядеть в их доме? Такое приложение, несомненно, сэкономит пользователям, желающим украсить свой дом, много времени и ненужных хлопот, а также уменьшит риск того, что пользователи будут недовольны окончательным результатом украшения.
Именно тогда мне пришла в голову идея разработать приложение самостоятельно. Моя первоначальная идея заключалась в разработке приложения, которое люди могли бы использовать, чтобы помочь им быстро удовлетворить свои потребности в украшении дома, позволяя им увидеть, как мебель будет выглядеть в их домах.
Основной способ работы приложения заключается в том, что пользователи сначала загружают одно или несколько изображений комнаты, которую они хотят украсить, а затем устанавливают эталонный параметр, например расстояние между полом и потолком. Вооружившись этой информацией, приложение автоматически рассчитает параметры других зон в комнате.
Затем пользователи могут загружать изображения понравившейся мебели в виртуальную корзину. При загрузке таких изображений пользователям необходимо указывать размеры мебели. На экране редактирования пользователи могут перетаскивать мебель из корзины на изображение комнаты, чтобы просмотреть эффект. Но тут возникает проблема: изображения перетащенной и брошенной в комнату мебели выглядят наклеенными и не сливаются естественным образом с окружающей обстановкой.
По счастливой случайности я обнаружил HMS Core AR Engine. при поиске решения вышеупомянутой проблемы. Этот комплект для разработки предоставляет возможность реалистично интегрировать виртуальные объекты в реальный мир, а это именно то, что нужно моему приложению. Благодаря возможности обнаружения плоскостей мое приложение сможет обнаруживать настоящие плоскости в доме и позволит пользователям размещать виртуальную мебель на основе этих плоскостей; а благодаря возможности тестирования на попадание пользователи могут взаимодействовать с виртуальной мебелью, чтобы естественным образом менять свое положение и ориентацию.
Далее я хотел бы кратко рассказать о двух возможностях, предлагаемых этим пакетом средств разработки.
AR Engine отслеживает освещение, плоскости, изображения, объекты, поверхности и другую информацию об окружающей среде, чтобы позволить приложениям интегрировать виртуальные объекты в физический мир и выглядеть и вести себя так, как если бы они были реальными. Его функция обнаружения плоскостей идентифицирует характерные точки в группах на горизонтальной и вертикальной плоскостях, а также границы плоскостей, гарантируя, что ваше приложение сможет размещать на них виртуальные объекты.
Кроме того, комплект постоянно отслеживает местоположение и ориентацию устройств относительно окружающей их среды и устанавливает единое геометрическое пространство между виртуальным миром и физическим миром. Комплект использует возможность проверки попадания, чтобы сопоставить точку интереса, которую пользователи нажимают на экране, с точкой интереса в реальной среде, откуда будет испускаться луч, указывающий на местоположение камеры устройства, и возвращать точку пересечения. между лучом и плоскостью. Таким образом, пользователи могут взаимодействовать с любым виртуальным объектом на экране своего устройства.
Функции и возможности
- Обнаружение плоскости: поддерживаются как горизонтальные, так и вертикальные плоскости.
- Точность: допустимая погрешность составляет около 2,5 см, если целевая плоскость находится на расстоянии 1 м от камеры.
- Задержка распознавания текстуры: < 1 с
- Поддерживает подгонку полигонов и объединение плоскостей.
Процедура разработки (обнаружение плоскости)
1) Создайте объект WorldActivity. В этом примере показано, как использовать мировой AR-сценарий AR Engine.
Public class WorldActivity extends BaseActivity{
Protected void onCreate (Bundle saveInstanceState) {
Initialize DisplayRotationManager.
mDisplayRotationManager = new DisplayRotationManager(this);
Initialize WorldRenderManager.
mWorldRenderManager = new WorldRenderManager(this,this);
}
// Create a gesture processor.
Private void initGestureDetector(){
mGestureDetector = new GestureDetector(this,new GestureDetector.SimpleOnGestureListener()){
}
}
mSurfaceView.setOnTouchListener(new View.OnTouchListener()){
public Boolean onTouch(View v,MotionEvent event){
return mGestureDetector.onTouchEvent(event);
}
}
// Create ARWorldTrackingConfig in the onResume lifecycle.
protected void onResume(){
mArSession = new ARSession(this.getApplicationContext());
mConfig = new ARWorldTrackingConfig(mArSession);
…
}
// Initialize a refresh configuration class.
private void refreshConfig(int lightingMode){
// Set the focus.
mConfig.setFocusMode(ARConfigBase.FocusMode.AUTO_FOCUS);
mArSession.configure(mConfig);
}
}
2) Инициализировать класс WorldRenderManager, который управляет отрисовкой, связанной с мировыми сценариями, включая отрисовку меток и отрисовку виртуальных объектов.
public class WorldRenderManager implements GLSurfaceView.Renderr{
// Initialize a class for frame drawing.
Public void onDrawFrame(GL10 unused){
// Set the openGL textureId for storing the camera preview stream data.
mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());
// Update the calculation result of AR Engine. You are advised to call this API when your app needs to obtain the latest data.
ARFrame arFrame = mSession.update();
// Obtains the camera specifications of the current frame.
ARCamera arCamera = arFrame.getCamera();
// Returns a projection matrix used for coordinate calculation, which can be used for the transformation from the camera coordinate system to the clip coordinate system.
arCamera.getProjectionMatrix(projectionMatrix, PROJ_MATRIX_OFFSET, PROJ_MATRIX_NEAR, PROJ_MATRIX_FAR);
Session.getAllTrackables(ARPlane.class)
...
}
}
3) Инициализируйте класс VirtualObject, который предоставляет свойства виртуального объекта и необходимые методы для рендеринга виртуального объекта.
Public class VirtualObject{
}
4) Инициализируйте класс ObjecttDisplay для рисования виртуальных объектов на основе заданных параметров.
Public class ObjectDisplay{
}
Процедура разработки (Hit Test)
1) Инициализируйте класс WorldRenderManager, который управляет отрисовкой, связанной с мировыми сценариями, включая отрисовку меток и отрисовку виртуальных объектов.
public class WorldRenderManager implementsGLSurfaceView.Renderer{
// Pass the context.
public WorldRenderManager(Activity activity, Context context) {
mActivity = activity;
mContext = context;
…
}
// Set ARSession, which updates and obtains the latest data in OnDrawFrame.
public void setArSession(ARSession arSession) {
if (arSession == null) {
LogUtil.error(TAG, "setSession error, arSession is null!");
return;
}
mSession = arSession;
}
// Set ARWorldTrackingConfig to obtain the configuration mode.
public void setArWorldTrackingConfig(ARWorldTrackingConfig arConfig) {
if (arConfig == null) {
LogUtil.error(TAG, "setArWorldTrackingConfig error, arConfig is null!");
return;
}
mArWorldTrackingConfig = arConfig;
}
// Implement the onDrawFrame() method.
@Override
public void onDrawFrame(GL10 unused) {
mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());
ARFrame arFrame = mSession.update();
ARCamera arCamera = arFrame.getCamera();
...
}
// Output the hit result.
private ARHitResult hitTest4Result(ARFrame frame, ARCamera camera, MotionEvent event) {
ARHitResult hitResult = null;
List<ARHitResult> hitTestResults = frame.hitTest(event);
// Determine whether the hit point is within the plane polygon.
ARHitResult hitResultTemp = hitTestResults.get(i);
if (hitResultTemp == null) {
continue;
}
ARTrackable trackable = hitResultTemp.getTrackable();
// Determine whether the point cloud is tapped and whether the point faces the camera.
boolean isPointHitJudge = trackable instanceof ARPoint
&& ((ARPoint) trackable).getOrientationMode() == ARPoint.OrientationMode.ESTIMATED_SURFACE_NORMAL;
// Select points on the plane preferentially.
if (isPlanHitJudge || isPointHitJudge) {
hitResult = hitResultTemp;
if (trackable instanceof ARPlane) {
break;
}
}
return hitResult;
}
}
2) Создайте объект WorldActivity. В этом примере показано, как использовать мировой AR-сценарий AR Engine.
public class WorldActivity extends BaseActivity {
private ARSession mArSession;
private GLSurfaceView mSurfaceView;
private ARWorldTrackingConfig mConfig;
@Override
protected void onCreate(Bundle savedInstanceState) {
LogUtil.info(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.world_java_activity_main);
mWorldRenderManager = new WorldRenderManager(this, this);
mWorldRenderManager.setDisplayRotationManage(mDisplayRotationManager);
mWorldRenderManager.setQueuedSingleTaps(mQueuedSingleTaps)
}
@Override
protected void onResume() {
if (!PermissionManager.hasPermission(this)) {
this.finish();
}
errorMessage = null;
if (mArSession == null) {
try {
if (!arEngineAbilityCheck()) {
finish();
return;
}
mArSession = new ARSession(this.getApplicationContext());
mConfig = new ARWorldTrackingConfig(mArSession);
refreshConfig(ARConfigBase.LIGHT_MODE_ENVIRONMENT_LIGHTING | ARConfigBase.LIGHT_MODE_ENVIRONMENT_TEXTURE);
} catch (Exception capturedException) {
setMessageWhenError(capturedException);
}
if (errorMessage != null) {
stopArSession();
return;
}
}
@Override
protected void onPause() {
LogUtil.info(TAG, "onPause start.");
super.onPause();
if (mArSession != null) {
mDisplayRotationManager.unregisterDisplayListener();
mSurfaceView.onPause();
mArSession.pause();
}
LogUtil.info(TAG, "onPause end.");
}
@Override
protected void onDestroy() {
LogUtil.info(TAG, "onDestroy start.");
if (mArSession != null) {
mArSession.stop();
mArSession = null;
}
if (mWorldRenderManager != null) {
mWorldRenderManager.releaseARAnchor();
}
super.onDestroy();
LogUtil.info(TAG, "onDestroy end.");
}
...
}
Обзор
Если вы когда-либо занимались внутренней отделкой, я уверен, вы хотели иметь возможность увидеть, как будет выглядеть мебель в вашем доме, не покупая ее заранее. В конце концов, большая часть мебели стоит недешево, а доставка и сборка могут доставить немало хлопот. Вот почему приложения, которые позволяют пользователям размещать и просматривать виртуальную мебель в своих реальных домах, действительно меняют жизнь.
HMS Core AR Engine может значительно упростить разработку таких приложений. Благодаря возможностям обнаружения самолетов и проверки на попадание, этот комплект для разработки позволяет вашему приложению точно обнаруживать самолеты в реальном мире, а затем естественным образом смешивать виртуальные объекты с реальным миром.
Помимо виртуального украшения дома, этот мощный набор также имеет множество других применений. Например, вы можете использовать его возможности для разработки видеоигры с дополненной реальностью, обучающего приложения на основе дополненной реальности, которое позволяет учащимся просматривать исторические артефакты в 3D, или приложения для электронной коммерции с функцией виртуальной примерки.
Оригинал