Вращение объектов ARCore в зависимости от того, где я впервые открываю приложения - PullRequest
1 голос
/ 25 февраля 2020

Проект: я сделал приложения 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

Шкаф

1 Ответ

0 голосов
/ 26 февраля 2020

Проверьте функцию transform.LookAt (). Предоставляя преобразование, которое вы хотите, чтобы ваш актив смотрел на Unity, позаботится о ротации за вас.

...