2016-06-22 2 views
2

Я пытаюсь узнать, как сделать некоторые преобразования в 3d-точках в OpenGL. Использование this cheat sheet Я считаю, что у меня есть правильная матрица для умножения на мой вектор, который я хочу повернуть. Однако, когда я умножаю и печатаю новую координацию, я считаю, что она неверна. (Вращение 1,0,0 90deg cc должно привести к 0,1,0 правильно?) Почему это не работает?Почему мой вектор не вращается правильно OpenGL/GLM?

Мой код:

glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f); 
glm::mat4 trans = { 
    1.0f, 0.0f, 0.0f, 0.0f, 
    0.0f, cos(glm::radians(90.0f)), -sin(glm::radians(90.0f)), 0.0f, 
    0.0f, sin(glm::radians(90.0f)), cos(glm::radians(90.0f)), 0, 
    0.0f, 0.0f, 0.0f, 1.0f 
}; 
vec = trans * vec; //I should get 0.0, 1.0, 0.0 right? 
std::cout << vec.x << ", " << vec.y << ", " << vec.z << std::endl; 

Вышеуказанные отпечатки 1.0, 0.0, 0.0, указывающие, что не было никаких изменений вообще?

Я также попытался использовать функцию rotate в GLM, чтобы сгенерировать свою матрицу, а не вручную указывать, но я все еще не понял, что, по моему мнению, должно быть правильным (у меня другой неправильный ответ).

glm::mat4 trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0)); //EDIT: my bad, should've been z axis not x, still not working 

Вышеприведенные печатает: -2.14..e+08, -2.14..e+08, -2.14..e+08

(PS: Я просто взял геометрии в предыдущем учебном году, мои извинения, если математика неправильно У меня есть общее представление матриц и умножения матриц, которые я выбрал. сегодня, чтобы изучить преобразования OpenGL, но другие, что я вроде как noob)

+0

Если вход (1,0,0,1) и выход должен быть (0,1,0,1), вы должны вращаться вокруг оси Z. –

+0

@HannesHauptmann ok, я попытался сделать это изменение, но он все равно не возвращает правильный ответ 'glm :: mat4 trans = glm :: rotate (trans, 90.0f, glm :: vec3 (0.0, 0.0, 1.0)) ; ' –

+0

С левой стороны вы видите, как OpenGL обрабатывает его. Я на 100% это вращение вокруг оси Z :) –

ответ

4

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

Чтобы добиться того, что вы раньше хотели, вы должны повернуть вектор вокруг оси с помощью матрицы так:

glm::mat4 trans = { 
    cos(glm::radians(90.0f)), -sin(glm::radians(90.0f)), 0.0f, 0.0f, 
    sin(glm::radians(90.0f)), cos(glm::radians(90.0f)), 0.0f, 0.0f, 
    0.0f, 0.0f, 1.0f, 0.0f, 
    0.0f, 0.0f, 0.0f, 1.0f 
}; 

Кроме того, glm::mat4 trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0)); не возвращает желаемый результат, потому что транс необходимости в инициализироваться перед передачей его в glm :: rotate. Попробуйте записать это так:

glm::mat4 trans; // Default constructor called, trans is an identity matrix 
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0)); 

Тем не менее, вы можете не получить ожидаемый вектор (0.0f, 1.0f, 0.0f) из-за потери точности при использовании GLM :: радиан и соз/SEN. В моем тесте я получил вектор (-4.37113883e-008f, 1.0f, 0.0f) и -4.37113883e-008 действительно -0.0000000437113883, который является числом, очень близким к ожидаемому результату 0.

+0

Ах, спасибо, Джин. Это то, о чем мне говорил @HannesHauptmann. –

+0

Я думаю, что причина, по которой я запутался в команде rotate(), - это то, что я привык к java. Я не понимал, что mat4 был obj (потому что он не начинается с w/capital), а также я никогда не понимал, что он был инициализирован конструктором (потому что в java вы будете использовать новый, а затем конструктор вызовов явно). Смотрите, вот почему C++ смущает меня LOL –

2

Причина, по которой ваша собственная матрица вращения не меняет вход, проста: ваше вращение влияет только на координаты y и z, и поскольку эти равны нулю, результат точно такой же, как и вход. Координата X имеет множитель 1 в выходной координате x, так что остается неизменной.

Например, вы можете сделать вектор 1.0, 2.0, 3.0, 1.0, а затем вы увидите изменения.

Что касается версии glm, не могу сказать, почему это принесло бы странный результат, у меня никогда не было проблем с ними, но они мало что использовали.

+0

Спасибо за быстрый ответ Сами. +1, потому что это помогло. Я принимаю Джин, но поскольку у него больше информации (объясняет, почему команда 'rotate()') не работает. Надеюсь, ты не против. –

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