Вращение с векторами (OpenGL ES) - PullRequest
2 голосов
/ 26 декабря 2011

У меня проблема, я не могу разобраться.

Я использую сферу, когда пользователь касается любого места на сфере, я получаю точку в виде трехмерного вектора (x, y,z) все в координатах opengl.

У меня также есть определенная точка на сфере для начала, также трехмерный вектор.

Например:

realV x: -0.2881811, y: 0.25460157, z: 0.9231087

Где "real V" - точка, определенная для начала.(Сфера имеет готовность 1.0)

После того, как я повернул сферу с помощью gl.glRotatef, я хочу определить новую точку с координатами OpenGL "real V".

Делаяэто я использую что-то вроде этого:

real.rotate(-model.getRotationX(), 1f, 0f, 0);
    real.rotate(-model.getRotationY(), 0f, 1f, 0);

Где "getRotationX и Y - это общее вращение сферы (я знаю, что это правильно).

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

    public Vector3 rotate(float angle, float axisX, float axisY, float axisZ)
{
    inVec[0] = x;
    inVec[1] = y;
    inVec[2] = z;
    inVec[3] = 1;

    Matrix.setIdentityM(matrix, 0);
    Matrix.rotateM(matrix, 0, angle, axisX, axisY, axisZ);
    Matrix.multiplyMV(outVec, 0, matrix, 0, inVec, 0);
    x = outVec[0];
    y = outVec[1];
    z = outVec[2];
    return this;
}

При выполнении этого, а также переводе вектора "real (V)" путем добавления вектора происхождения spehere к вектору "real (V)", я бы поверил, что получуправильная новая точка на сфере, где я мог бы, например, установить флаг или подобное значение.

Проблема в том, что что-то не получается сразу после вращения векторов.

Еслия не вращаю сферу и, следовательно, не вращаю вектор, все становится так, как я хочу. Но когда я поворачиваю его, чем больше вращение, тем больше я прихожу из правильной точки.

контур от LogCat:

реальное V x: -0,2881811, y: 0,25460157, Z: 0,9231087
, повернутое V x: 0,10823092, Y: 0,79800075, Z: 0,5928582
добавлено V x: 0,10823092, Y: 0,79800075, Z: -3,4071417
вычтено V x: 0.10823092, y: 0.79800075, z: 0.5928583
backRotated V x: -0.5257477, y: 0.21287462, z: 0.8235738

Как вы можете видеть, при обратном повороте это не такпо той же причине, что и оригинал.

    Vector3 real = Result.getRealVector(location);

    Log.d(TAG, "real V "+ real.toString());
    real.rotate(-model.getRotationX(), 1f, 0f, 0);
    real.rotate(-model.getRotationY(), 0f, 1f, 0);
    Log.d(TAG, "rotated V " + real.toString());

    real.add(model);
    Log.d(TAG, "added V " + real.toString());

    real.sub(model);
    Log.d(TAG, "subtracted V " + real.toString());
    real.rotate(model.getRotationX(), 1f, 0f, 0f);
    real.rotate(model.getRotationY(), 0f, 1f, 0f);

    Log.d(TAG, "backRotated V " + real.toString());

Это не так уж далеко, точка всегда где-то рядом, где должна быть, но все же ...

Я знаю, что это можетТрудно понять мою проблему, трудно объяснить.Я надеюсь, что кто-то увидит очевидную проблему.

1 Ответ

4 голосов
/ 26 декабря 2011

При матричных операциях порядок очень важен.Если вы вращаете отдельно вокруг каждой оси, для отмены этих операций вам потребуется выполнить обратные операции в обратном порядке, чтобы вернуть исходный вектор.

real.rotate(-model.getRotationX(), 1f, 0f, 0f);
real.rotate(-model.getRotationY(), 0f, 1f, 0f);
...
real.rotate(model.getRotationY(), 0f, 1f, 0f);
real.rotate(model.getRotationX(), 1f, 0f, 0f);

Математически: (где A иB - это матрицы, A-1 и B-1 - это соответствующие обратные матрицы, а I - единичная матрица)

A * B * B-1 * A-1 == I

однако

A * B * A-1 * B-1! = I

Я предлагаю немного изучить линейную алгебру, если вы еще этого не сделали, поскольку хорошее базовое понимание очень полезнопри выполнении графического программирования.

...