>>1092274 (OP) >последний видос Это уже старенький билд хомяков, я в субшоте свежее на прошолой неделе выкладывал: >>1091761 → Но спасибо, второй раз в шапке, приятно
Как думаете, нормально ли костыльнуть моё личное неудобство с матрицами и векторами банальнейшим размещением пустых Node3D в сцене? Уже делал так несколько раз, но боюсь, что это слишком "не труъ"...
Пример (не уверен пока, как лучше): >Player: CharacterBody3D >— Yaw: Node3D >— — Pitch: Node3D >— — — Roll: Node3D >— — — — Vector: MeshInstance3D Player - то, к чему нужно применить силу. Yaw, Pitch, Roll - для вращения вектора... Vector - debug-репрезентация вектора.
Так я хотя бы визуально буду видеть, что я делаю... Реально тяжело представить вектор мысленно...
>>1092345 Нормально. Я так делал. Многие так делали. Я так делал, когда не понимал в матане, и сейчас, когда понимаю в матане, тоже так сделаю при случае.
>>1092345 >нужно применить силу Вообще, ещё непонятно, возможно ли и как вращать CharacterBody3D. Т.к. у него отсуствуют методы для физического поворота (в отличие от RigidBody3D), то остаётся только вращение через Transform3D, но для персонажа не идеально сферической формы такое вращение грозит попаданием в чужие коллизии... Я склоняюсь к тому, что CharacterBody3D невозможно безопасно вращать (кроме оси Y, если используется цилиндр или капсула без коллизий рук-ног), так что приходится вращать только визуальную модельку. Сложности с трансформацией векторов растут.
Я подумывал/пробовал использовать вращение визуализации персонажа в расчётах физики, но мне кажется, что такая лапша взаимосвязей в будущем усложняет... да всё усложняет. Поэтому хочу такую отдельную ветку из нод чисто под физику, чтобы абстрагироваться от реальной 3D модельки...
>>1092346 >Многие так делали Что-то нигде такого не видел/не слышал. Зато много рассказов о том, как плохо иметь избыточные ноды. Видел, как визуально простые игры использовали оптимизацию через серверы Godot, лишь бы на количестве нод сэкономить. Дерево с тех пор вроде оптимизировали, но всё равно не всё идеально... >понимаю в матане, тоже так сделаю при случае Почему? Не получается удержать все векторы?
>>1092347 > Почему? Не получается удержать все векторы? Потому что комбинацией нод по факту все эти векторные операции делаются в кишках движка на сишном ядре. Векторов лучше обмазать поверх композиции нод.
>>1092349 Так ты в любом случае вызовы API делаешь - те же Vector3, Basis, Transform3D и т.д. С нодами суть в их визуализации на экране, т.к. без нод эти классы - абстрактные массивы чисел без какого-то значения.
Тип, мне нужно такое: >velocity += force Я мог бы сделать это так: >force = vector.rotate...rotate...rotate... # wtf Но мне было бы удобнее так: >$Helper1.rotate... >$Helper2.rotate... >velocity += $Helper3.global_basis.Y Т.е. Basis.Y можно увидеть прям в окне редактора.
Выходит, этот способ в разы затратнее по ресурсам.
>>1092352 А, и да, я много слышал, что нужны Quaternions, тип выгоднее по сравнению с вращением векторов, но я вообще не понимаю их. Смотрел визуализации и не разобрался. Обычно, когда игрок жмёт кнопки, тут понятно - влево-вправо, вверх-вниз, и т.д. А вот как превращать нажатия в Quaternion и обратно неясно. С gymbal lock ещё не сталкивался на практике...
>>1092354 Потому что кватернионы про другое. Они не про векторы движения, а про вращение. Незаменимы при создании анимаций. Почему так? Вот представь себе самолет, давай просто выключим физику и он в воздухе висит всё время, но вращаться может. Ты берешь и вводишь его в штопор, то есть он тупо смотрит вниз. У тебя из трех осей наклона лишь одна не в нуле, она 90 градусов, две оставшиеся в нуле, а потому тупо параллельны. И теперь ты хочешь его вынести его из штопора. Для этого что надо сделать? Два оставшихся угла из нуля вытащить. Однако проблема в том, что если ты начнешь одновременно их выводить, то они начнут друг друга "отменять", потому что они хоть и параллельны, но у них вращение обратное друг другу. И если ты внезапно дашь обоим нулевым углам наклон в 45 градусов, то они вычтутся друг из друга, и опять будут нулевые.
Вот у тебя такая же херня может быть в блендере при создании анимаций, или в годоте когда ты её запускаешь. Если бы ты использовал простые матрицы углов, у тебя бы либо анимации постоянно ломались в пограничных случаях, либо были бы неестественными.
Кватернионы избавляют от подобных проблем, потому что считаются не как матрицы углов наклона, а как матрицы непосредственно вращения объекта. Звучит странно, но это немного разные вещи.
>>1092402 Попробуй скачать с GitHub и распаковать.
>>1092406 >Два оставшихся угла из нуля вытащить Почему два? Если смотришь вниз, то у тебя 90° по горизонтальной оси (X - тангаж). Чтобы посмотреть наверх, уменьшаешь этот угол... Нет необходимости трогать два других угла (Y/Z), вне зависимости от их текущих значений (Y - рысканье, Z - крен). Как-то так: >yaw += Input.get_axis("A", "D") # рысканье >pitch += Input.get_axis("W", "S") # тангаж >roll += Input.get_axis("Q", "E") # крен >var gp := global_position >global_transform = Transform3D.IDENTITY\ >.rotated_local(Vector3.UP, yaw)\ >.rotated_local(Vector3.LEFT, pitch)\ >.rotated_local(Vector3.BACK, roll) >global_position = gp Т.е. рысканье -> тангаж -> крен. В чём проблема?..
>>1092345 Осознал, что дело не столько в векторах, сколько в применяемых формулах, а их никакими нодами не заменишь... Пытался гуглить формулы в интернете, спрашивать нейронку - на практике фигня, Vector3 стремится улететь в inf или ВНЕЗАПНО обнуляется... Другими словами, получить векторы - легко, а что вычислять с их помощью - это нужно думать. Так я несколько часов промучился, потом открыл свой предыдущий проект и обнаружил, что переизобрёл собственный велосипед с квадратными колёсами, который тогда не нравился. Что делать - не знаю...
В itch summer sale кто участвует? Оно почему-то не все мои проекты показывает как подходящие для распродажи, хотя цены стоят одинаковые, и методы монетизации тоже, и все проекты скачиваемые, не веб.