Android min3D использует сенсорное вращение вокруг объекта - PullRequest
3 голосов
/ 03 января 2012

Я пытаюсь повернуть камеру вокруг объекта с помощью сенсорного экрана. Вращение вокруг оси Y работает нормально (ось X отключена). Вращение вокруг оси X действительно странно. когда Объект (его ракета) становится выше rocket.position().y++ & scene.camera().position.y++, вращение вокруг оси х становится больше и страннее. Если ракеты останавливаются rocket.position().y = 500; & scene.camera().position.y = 500;, я не могу вращаться вокруг оси x, вместо этого я увеличиваю или уменьшаю объект. При включении обеих осей это странно, как ад.

В initScene Я установил камеру, чтобы смотреть в центр ракеты.

Вот мой код:

initScene:
    scene.camera().position.z = 90;
    scene.camera().target = raketeOBJ.position();

onTouchEvent:
    public boolean onTouchEvent(MotionEvent me) {
     if (me.getAction() == MotionEvent.ACTION_DOWN) {
        xpos = me.getX();
        ypos = me.getY();
        return true;
    }

    if (me.getAction() == MotionEvent.ACTION_UP) {
        xpos = -1;
        ypos = -1;
        touchTurn = 0;
        touchTurnUp = 0;
        return true;
    }

    if (me.getAction() == MotionEvent.ACTION_MOVE) {
        float xd = me.getX() - xpos;
        float yd = me.getY() - ypos;

        xpos = me.getX();
        ypos = me.getY();

        touchTurn = xd / -200f;
        touchTurnUp = yd / -200f;
        return true;
    }

    try {
        Thread.sleep(15);
    } catch (Exception e) {

    }

    return super.onTouchEvent(me);
}

UpdateScene:

    if (touchTurn != 0) {
        scene.camera().position.rotateY(touchTurn);
        touchTurn = 0;
    }

    if (touchTurnUp != 0) {
        scene.camera().position.rotateX(touchTurnUp);
        touchTurnUp = 0;
    }

Ответы [ 3 ]

1 голос
/ 04 октября 2012

Я думаю, что это вопрос ориентации взгляда. попробуйте основной пример OpenGL для Android "вращающиеся кубики", я думаю, что это похожее поведение.

Чтобы избежать этого, необходимо преобразовать координаты экрана в координаты вращения объекта min3D.

Подумайте о перемещении пальца на 1 см на дисплее влево, когда 3D-объект следует за вашим пальцем. Это означает, что x_display = x_object. Если вы поворачиваете свой объект, между дисплеем и объектом все еще остается фиксированная связь. (x_display = - 1 см) равно (x_object = -1 см)
при 90 ° и 270 ° ваш объект будет перемещаться по оси X, при 180 ° ваш объект будет двигаться по оси X.

используйте некоторые грехи, чтобы преодолеть это.

редактировать: также поворотный круг (объект) = - поворотный круг (камера)

0 голосов
/ 10 марта 2012

Вы продолжаете говорить странно, но вы знаете, что это не описывает то, что вы видите.Поворот на самом деле метод Number3d.Он не знает о цели , поэтому я предполагаю, что вращение выполняется по центру, а не по ракете (не совсем проверил, просто предположение).Может быть 2 решения:

  1. Самое простое - установить ракету на (0,0,0) и вместо этого переместить ракету, переместить все остальное.Ну, это было бы глупое предложение.Забудьте об этом.
  2. Другое решение состоит в том, чтобы рассчитать траекторию вращения камеры, используя sin () и cos ()
  3. Возможно, существует третье решение, но я об этом не особо задумывался иэто может быть неправильно.То, что вам нужно сделать, это переместить камеру, как цель в (0,0,0), повернуть и затем вернуть камеру.

Будет выглядеть примерно так:

Number3d target = scene.camera.target;
Number3d cp = scene.camera.position.clone();
// move position like target is (0,0,0)
cp.x -= target.x;
cp.y -= target.y;
cp.z -= target.z;

cp.roateX(angle);

// restore offset
cp.x += target.x;
cp.y += target.y;
cp.z += target.z;
scene.camera.position.setAllFrom(cp);

Вы можете попробовать 3, но не надейтесь, что это сработает.

0 голосов
/ 15 января 2012

Одним из вариантов является вращение самого контейнера вместо камеры.В min3d вы часто работаете с Object3dContainer как переменная класса в вашей деятельности, которая отображает модель.Когда вы получите MotionEvent, вы можете использовать метод вращение () из вашего класса Object3dContainer и установить свойства x или y в зависимости от ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...