vindast
> MikeNew, и возьми ты мой класс как базу наконец, убедишься точно что дело в
> поворотах или же нет.
Сначала правильный расчет масс и инерций. Если после правильного расчета массы и инерции не заработает (это нужно первым делом, поскольку с неправильной инерции в принципе ничего работать нормально не будет, как я уже убедился.) - попробую твой класс.
MikeNew
float compMass1; compMass1 = glm::dot(l.n1, l.n1 * models[c.body1_N].invMass); compMass1 += glm::dot( l.w1, l.w1 * models[c.body1_N].invInertia); float compMass2; compMass2 = glm::dot( l.n2, l.n2 * models[c.body2_N].invMass); compMass2 += glm::dot( l.w2, l.w2 * models[c.body2_N].invInertia);
Самый просто способ отладить это явно задать их значения, вставь такой костыль для отладки:
models[c.body1_N].invMass = 1.0f / 100.0f; models[c.body2_N].invMass = 1.0f / 100.0f; models[c.body1_N].invInertia= 1.0f / 10.0f; models[c.body2_N].invInertia= 1.0f / 10.0f; compMass1 = glm::dot(l.n1, l.n1 * models[c.body1_N].invMass); compMass1 += glm::dot( l.w1, l.w1 * models[c.body1_N].invInertia); float compMass2; compMass2 = glm::dot( l.n2, l.n2 * models[c.body2_N].invMass); compMass2 += glm::dot( l.w2, l.w2 * models[c.body2_N].invInertia);
У тебя будут заведомо правильные значения, которые попадут в джоинт.
vindast
> У тебя будут заведомо правильные значения, которые попадут в джоинт.
Ну если ты уверен что это так, тогда пробую твой класс и смотрю что получится, о результатах отпишусь.
vindast
> MikeNew, и возьми ты мой класс как базу наконец, убедишься точно что дело в
> поворотах или же нет.
Посмотрел твой класс. Так им пользоватся?:
rotate(glm::lenght(angularVel), glm::normalize(angularVel));
MikeNew
> Так им пользоватся?:
Да, смотри что бы вектор точно был нормализован.
MikeNew
> Ну если ты уверен что это так, тогда пробую твой класс и смотрю что получится,
> о результатах отпишусь.
Имею в виду именно корректные значения массы и инерции.
MikeNew
Осторожней с этим классом, он не поддерживает ортонормированность базиса.
vindast
> Имею в виду именно корректные значения массы и инерции.
Наконец дошли руки и сделал интеграцию угловой скорости как у тебя. Поставил как ты советовал массы 1/100 и моменты инерции 1/10 для отладки. Получилось то же, что и с умножением кватернионов, одинаковое поведение.
Выглядит как-то так, не дает покоя то, что видно как правый (зеленый) куб самую малость вращается быстрее (при столкновении в самом начале). Где-то недоработка или это нормальное поведение из-за погрешностей?:
MikeNew
> Где-то недоработка или это нормальное поведение из-за погрешностей?
это точно не нормальное поведение. Сравни с тем что в physx.
samrrr
> Осторожней с этим классом, он не поддерживает ортонормированность базиса.
Я сделал так:
inline void physics::matrixIntegrateAngularVelocity(Model& model, glm::vec3& angVel) { float len = glm::length(angVel); if (len == 0.0f) return; glm::mat4 m = glm::rotate(glm::mat4(1.0f), len, glm::normalize(angVel)); model.xAxis = glm::vec3(m * glm::vec4(model.xAxis, 1.0f)); model.yAxis = glm::vec3(m * glm::vec4(model.yAxis, 1.0f)); model.zAxis = glm::vec3(m * glm::vec4(model.zAxis, 1.0f)); model.matRotate = glm::mat3(model.xAxis, model.yAxis, model.zAxis); }
Сойдет? (это неоптимизированный вариант)
samrrr
> это точно не нормальное поведение. Сравни с тем что в physx.
Ок, сделаю по-новой на основе того когда из физикс-а, который ты тут запостил. Но, чувствую, будет то же самое.
MikeNew
Мне кажется что вообще какой-то бред получается. В инете вообще рассказывается какбудто вектор скорости поворота это скорости поворотов относительно осей x y z в локальном пространстве тела... Тут же ты просто крутишь вокруг оси...
попробуй повернуть 3 раза по осям x y z на соответствующие компоненты вектора. может лучше будет результат...
MikeNew
> glm::vec3
напиши неконец юзинг вектора от глм
samrrr
> В инете вообще рассказывается какбудто вектор скорости поворота это скорости
> поворотов относительно осей x y z в локальном пространстве тела... Тут же ты
> просто крутишь вокруг оси...
А разве в итоге получается не одно и то же?
samrrr
> напиши неконец юзинг вектора от глм
Здесь не понял про что ты.
samrrr
> попробуй повернуть 3 раза по осям x y z на соответствующие компоненты вектора.
> может лучше будет результат...
Ок, посмотрю. Но что-то мне подсказывает, все же, что это одно и то же.
MikeNew
> Здесь не понял про что ты.
юзинг глм::вец3;
погугли юзинги
MikeNew
> Но что-то мне подсказывает, все же, что это одно и то же.
а формула степеней свободы тройной молекулы...
Тема в архиве.