У меня проблема, я не могу опустить голову.Вращение с векторами (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 рядом, где оно должно быть, но все-таки ...
Я знаю, что это может быть трудно понять мою проблему, довольно трудно объяснить. На что я надеюсь, кто-то видит какую-либо очевидную проблему.
Вы, мой друг, просто решили проблему, вызвавшую разочарование для меня последние 5 часов, теперь это работает, на месте. Благодаря! – Henrik
Я рад, что смогу помочь. – kappamaki