2011-12-26 4 views
2

У меня проблема, я не могу опустить голову.Вращение с векторами (OpenGL ES)

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

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

Например:

реальная V х: -0,2881811, у: 0,25460157, г: 0,9231087

Где "реальный V", это точка, определенная для начала. (Сфера имеет readius 1,0)

После того, как я повернул сферу с помощью gl.glRotatef, я хочу вывести новую точку с помощью координат OpenGL «реального 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; 
} 

Когда делать это, а также перевод вектор «реальный (V)», добавив происхождения-вектор spehere к «real (V)» vector я бы поверил, что получаю правильную новую точку в той сфере, где я мог бы, например, установить флаг или аналогичный.

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

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

Ниже приведен контур из LogCat:

реальная V х: -0,2881811, у: 0,25460157, г: 0,9231087
повернуты V X: 0.10823092, у: 0,79800075, г: 0,5928582
добавлен V х : 0.10823092, у: 0.79800075, г: -3,4071417
вычитают В х: 0.10823092, у: 0.79800075, г: 0,5928583
backRotated В х: -0,5257477, у: 0,21287462, г: 0,8235738

Как вы можете se, когда backrot По какой-то причине это не то же самое, что оригинал.

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()); 

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

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

ответ

4

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

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); 

Выражаясь математически: (где А и В являются матрицами, А-1 и В-1 есть соответствующие обратные матрицы, и я единичная матрица)

A * B * B -1 * A-1 == я

однако

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

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

+0

Вы, мой друг, просто решили проблему, вызвавшую разочарование для меня последние 5 часов, теперь это работает, на месте. Благодаря! – Henrik

+0

Я рад, что смогу помочь. – kappamaki

Смежные вопросы