Так что я был здесь прежде, чем задавать вопросы по этому вопросу, но никто до сих пор не смог ответить на мой вопрос. Поэтому я сделал видео, которое демонстрирует проблему.
До сих пор я проверял и перепроверял свои математические файлы, так же как и два моих профессора из колледжа, я проверял свои шейдеры, и я просто использую простой проход через шейдер.
У меня есть видео о происходящем, я опишу немного моего процесса.
Я установил начальные значения своих вращений на, это подталкивает его к точке, где возникает проблема.
rotX = 0.0f;
rotY = -22.0f;
rotZ = -62.0f;
Эти значения гарантируют, что мне не нужно вращать объект во время выполнения, именно в этих значениях возникает проблема. Как вы можете видеть из видео, корова начнет вращаться без какого-либо места в коде, фактически сообщающего об этом. Я выводил матрицы вращений и значения вращений в мой файл журнала, и все они нормальные.
http://www.youtube.com/watch?v=LB7_zftalT8
Так что я никогда не видел этого раньше никогда. Если кто-нибудь видел что-то подобное, дайте мне знать. Я не опубликовал никакого кода, потому что существует много возможных проблем, однако я могу предоставить фрагменты кода по требованию или предоставить доступ к моему исходному svn.
Я потратил три недели на отладку этой проблемы, у меня есть как минимум 10 других взглядов на эту проблему и просмотр моего кода.
Единственная проблема, которую я не смог устранить, это проблема с повреждением памяти, надеюсь, вам повезет больше.
Редактировать:
Образцы кода:
http://pastebin.com/hRSvEYAZ
Я использую кватернионы для своих вращений, я создаю их с углами оси. Затем я делаю несколько вращений вместе и создаю свой 4х4.
Редактировать:
Я попробовал ответ, предоставленный MadCoreTom, это не помогло, я также продолжал смотреть на память, и я не вижу никаких проблем.
Редактировать:
Поэтому я удалил вызовы нормализации из моих кватернионов, теперь я нормализую ось только тогда, когда создаю свой кватернион под углом оси. Я также переписал свой toMatrix3 для моего кватерниона, чтобы посмотреть, помогает ли это, но не помогает.
Я также перенес свое обновление ротации внутрь нажатия клавиш, и я намерен в ближайшее время также предоставить больше кода.
Возможно, что ошибки округления во время .normalize()
вызывают незначительное изменение значений, и это продолжает накапливаться, пока корова не сходит с ума.
Вы можете попробовать что-то вроде следующего, и использовать rx
на месте rotationX
в методе обновления:
rx = rotationX.normalized();
Вместо того, чтобы изменять значение каждый раз, когда вы проходите цикл.
Хорошо, поэтому я решил свою проблему. Произошла ошибка с плавающей запятой, скрывающая фактическую проблему.
Поэтому, как только я это исправил, не используя метод, предоставленный MadcoreTom. В итоге я только нормализовал ось и никогда не нормализовал мой кватернион во время вращения.
Реальная проблема заключалась в том, что я хранил свой угол и накапливал его, это вызывало проблему.
Теперь я просто передаю изменение поворота, создаю свой кватернион из изменения оси / угла, а затем умножаю его на свой кватернион F.