Инициализируйте вашу матрицу перевода

л пример кода для проверки функции glm :: translate:

glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f);
glm::mat4 trans;
trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f));
vec = trans * vec;
std::cout << vec.x << ", " << vec.y << ", " << vec.z << std::endl;

Это выводит следующее:

-4.29497e+08, -4.29497e+08, -4.29497e+08

вместо ожидаемого2, 1, 0

Какова возможная причина и что я могу с этим поделать?

(Должен ли я искать недостаток снаружиэто кусок кода?)

 iksemyonov08 нояб. 2017 г., 12:16
Что заставляет вас думать, что правильный ответ2, 1, 0? Вы прошли через код с помощью отладчика? MS VS 2017 имеет отличный встроенный графический отладчик.
 BDL08 нояб. 2017 г., 12:21
Я не могу воспроизвести вашу проблему. С кодом выше, я получаю вывод2, 1, 0.
 G.M.08 нояб. 2017 г., 12:24
Не могу воспроизвести. Каковы компонентыtrans сразу после строительства? Кажется, я помню старую версиюglm чьяmat4 Конструктор по умолчанию оставил компоненты неинициализированными, а не как единичную матрицу.
 dziadek199008 нояб. 2017 г., 12:27
@ G.M. Да, это была проблема. Благодарю. Инициализация его как матрицы идентичности помогла.

Ответы на вопрос(2)

Решение Вопроса
-4.29497e+08

которое заставило бы меня поверить, что недостаток заключается в:

glm::mat4 trans;

Вы не инициализировали матрицу, но выполнили арифметическую операцию над ней. Вы не можете предполагать, что конструктор инициализирует свою память, поэтому измените на:

glm::mat4 trans(1.0f);

И это должно решить проблему.

Этотмай не отображается во всех средах разработки, поскольку, например, режим отладки в VS имеет некоторые меры предосторожности, чтобы предотвратить это, но он будет отображаться в режиме выпуска

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

 BDL08 нояб. 2017 г., 12:28
Только для записей: в более новых версиях glm конструктор по умолчанию всегда создает единичную матрицу.
 Ian Young08 нояб. 2017 г., 12:32
Может быть и так, но если вы следуете хорошим правилам программирования, вам также следует использовать RAII (Resource Acquisition Is Initialisation). неинициализированные вещи приводят к огромному количеству ошибок, поэтому использование этой привычки делает код более стабильным.
 Yuan Ma16 окт. 2018 г., 18:43
@BDL Я использовал последнюю версию glm, но у меня все та же проблема. Есть ли какая-либо конфигурация, которую мне нужно установить, чтобы включить конструкцию по умолчанию?
 BDL16 окт. 2018 г., 23:56
@YuanMa: Если у вас есть новый вопрос, не стесняйтесь задавать его (например: «У меня проблема X, и я нашел ответ Y. Но, к сожалению, это не работает для меня из-за Z.» Не забудьте упомянуть компилятор / ОС и приведите минимальный пример вашего неработающего кода). Вы можете тогда пинговать меня здесь, и я мог бы взглянуть на это.

Инициализируйте вашу матрицу перевода

glm::mat4 trans(1);

Ваш ответ на вопрос