Проект: я сделал приложения ARCore. В основном вы ставите 2 очка (Andy aka The Android Robot), тогда он будет вызывать объект (шкаф) в середине этих 2 пунктов.
Проблема: В основном я хочу, чтобы дверь моего шкафа была обращена на основании где я размещаю эти 2 балла. Но, оказывается, дверь шкафа будет обращена туда, куда я смотрю, когда я ПЕРВЫЙ открою приложение.
Проверено на эмуляторе, и та же проблема, когда на устройстве
На эмуляторе я делаю: I откройте приложение, камера направлена на диван. затем я случайным образом размещаю 2 точки (не важно где), что порожденная дверь шкафа модели AR будет обращена к дивану. Я перемещаюсь по приложению лицом к окну, закрываю его, снова открываю, удерживая его лицом к окну. Затем я случайным образом помещаю 2 точки снова (не имеет значения) И СЕЙЧАС порождаемая дверь шкафа будет обращена к окну. В этот момент, независимо от того, куда я иду / поворачиваюсь / поворачиваюсь на эмуляторе, дверь шкафа будет обращена к окну.
Есть идеи, как повернуть объект в зависимости от того, куда я помещаю точки?
Связанный код:
//Slope
float m_slope = (pose0.tz() - pose1.tz()) / (pose0.tx() - pose1.tx());
float perpedicular_slope = -1f/m_slope;
float middle_z = (pose0.tz() + pose1.tz())/2;
float middle_x = (pose0.tx() + pose1.tx())/2;
float b = middle_z - middle_x * perpedicular_slope;
// backward/forward from middle
float DEVIATION_X = 0f; // TODO: change this >0 to make it on side
float new_x = middle_x + DEVIATION_X * side;
float new_y = perpedicular_slope*new_x+b;
float[] pos0_2 = { new_x , (pose0.ty() + pose1.ty())/2, new_y};
float[] rotation0_2 = {0,0,0,1};
/* BASICALLY Above is the code to positioning the cupboard Beside the middle of 2 points */
Anchor anchor0_2 = session.createAnchor(new Pose(pos0_2, rotation0_2));
AnchorNode anchorNode0_2 = new AnchorNode(anchor0_2);
anchorNode0_2.setParent(arFragment.getArSceneView().getScene());
TransformableNode andy0_2 = new TransformableNode(arFragment.getTransformationSystem());
andy0_2.setParent(anchorNode0_2);
andy0_2.setRenderable(cupBoardRenderable);
andy0_2.select();
andy0_2.setWorldRotation(Quaternion.axisAngle(new Vector3(0, 1f, 0), 0f));
//Already try something like this too, but pose0.qy() return very little number like 0.01-1 so i mult 100
//andy0_2.setWorldRotation(Quaternion.axisAngle(new Vector3(0, 1f, 0), pose0.qy()*100f));
Облицовка дивана
Облицовка windows
Шкаф