Я украсил свой дом с помощью дополненной реальности: вот как я это сделал

Я украсил свой дом с помощью дополненной реальности: вот как я это сделал

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, или приложения для электронной коммерции с функцией виртуальной примерки.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE