UnrealKaraulov / newbspguy

Goldsrc map viewer/editor without decompiling. Also can view .MDL models.
The Unlicense
70 stars 14 forks source link

Broken Pitch rendering #36

Closed Qwertyus3D closed 1 year ago

Qwertyus3D commented 2 years ago

Программа некорректно отрисовывает angles. А именно, поворот по Pitch не учитывает значения Yaw. Независимо от поворота по Yaw Pitch всегда наклоняет энтить в одном направлении. Т. е., например, при Yaw 90 поворот по Pitch визуально суммируется со значением Roll (т. е. как бы тоже крутит по оси Roll). При Yaw 180 поворот по Pitch наклоняет объект в противоположном направлении относительно правильного. При Yaw 270 значение Pitch визуально вычитается из значения Roll (т. е. как бы крутит по той же оси, но в противоположном направлении). Т. е. только когда Yaw = 0, тогда поворот по Pitch корректный.

Qwertyus3D commented 2 years ago

Баг присутствовал и в старых версиях программы (когда ещё только angles поддерживалось, и отрисовка углов работала только при выделении энтити).

UnrealKaraulov commented 2 years ago

@Qwertyus3D можно пример ?

Я когда делал, есть различные ентити у которых некоторые значения тупо не поддерживаются, их игнорит поворот или частично игнорит. Надо смотреть совпадает ли координаты и визуально в игре.

Qwertyus3D commented 2 years ago

Согласен, есть энтити, поворот которых по определённой оси не поддерживается. Но тогда они и не должны поворачиваться по указанной оси совсем. А если поворот действует, то он должен работать корректно. А он работает, но некорректно. Можно просто любую энтить с angles посмотреть и убедиться в этом. Если нужен конкретный пример, то я обнаружил это на примере трупа учёного на с2а5, который лежит на камне под дамбой. В игре указанные значения поворачивают энтить так, как нужно (-8 по Y выравнивает положение тела относительно склона камня, подошвами ног вниз). А в BSPGuy отображается неверное направление (выглядит так, как будто левая сторона модели будет задрана вверх). При значениях -8 90 0 визуально происходит вращение по Х, а не по Y, из-за того, что модель развёрнута на 90 градусов по Z. Но по оси X модель продолжает поворачиваться так, как если бы поворота по Z не было.

UnrealKaraulov commented 2 years ago

@Qwertyus3D В движке может быть жестко закодированные значения типа -1 -2 (повернут вверх, повернут вниз), это зависит от движка, я не знаю всех вариантов

Qwertyus3D commented 2 years ago

Это не то. Там именно угол. И это происходит с любой энтитью. Любая энтить даёт наклон по Y в фиксированном направлении. Вокруг своей оси разрешено поворачивать все энтити, кроме спрайтов (для них не актуален поворот вокруг вертикальной оси, т. к. спрайт всегда смотрит на игрока). Pitch должен раскачивать модель влево-вправо в зависимости от того, какой поворот модель получает вокруг своей оси. А в программе поворот по Pitch имеет строго фиксированное направление, как ни крути модель вокруг оси. Просто всегда в одну и ту же сторону наклон.

Qwertyus3D commented 2 years ago

Если совсем тупо объяснять, то Pitch в программе визуально наклоняет любую модель относительно глобальной оси координат. Как если бы был предусмотрен наклон только в одном направлении.

UnrealKaraulov commented 2 years ago

@Qwertyus3D я не знаю где на каких картах кто находится тем более трупы ученых каких-то)

можно конкретный пример на какой карте, какая entity работает не так как должна?

Qwertyus3D commented 2 years ago

@UnrealKaraulov Да я же писал выше:

  1. Если нужен конкретный пример, то я обнаружил это на примере трупа учёного на с2а5, который лежит на камне под дамбой.
  2. И это происходит с любой энтитью. Любая энтить даёт наклон по Y в фиксированном направлении.

Т. е. любую энтить можно взять и попробовать прописать ей разные значения angles. Первое значение из трёх 0 0 0 - это и есть Pitch. И он любую энтить в редакторе наклонит строго в одном и том же направлении, какие значения не задавай для Yaw и Roll.

Я себе сделал FGD, который учитывает реальные размеры моделей в игре, с ним тело учёного в редакторе выглядит так: c2guy

Там угол по Pitch -8 задан, а в редакторе это выглядит, как будто модель приподнята по Roll. Левая сторона приподнята вверх, вместо того, что должна быть нижняя часть (со стороны направляющей) опущена вниз.

В игре всё выглядит, как положено (немного не идеально, но правильно в целом): c2map Тело лежит вдоль склона, левая сторона не задрана.

Повторюсь, дело вообще не в этой модели. Любую энтить можно попробовать крутить в редакторе, и с любой энтитью будет то же самое. Pitch будет игнорировать то, на какой угол энтить повёрнута по Yaw и Roll. И будет наклонять всегда в одну и ту же сторону.

UnrealKaraulov commented 2 years ago

Понятно просто я вроде как проверял с брашевыми ентити проблем не было. Ну попробую изменить вариант поворота матрицы, взял щас несколько из GLM исходникам

UnrealKaraulov commented 2 years ago

image image

Вот пример func_breakable почти 100% совпадение.

Qwertyus3D commented 2 years ago

Чтобы увидеть проблему, нужно задать более выраженное значение Yaw. 20 - это маленький угол, из-за чего и возникает иллюзия, что всё нормально. Нужно ставить 90/180/270, тогда будет видно различие. Когда мы поворачиваем энтить на прямой угол, наклон по Pitch должен очевидно происходить в другом направлении. Но этого не происходит. Независимо от Yaw, наклон по Pitch будет в одну и ту же сторону. Я уже не знаю, как ещё объяснить.

Qwertyus3D commented 2 years ago

И вообще, зачем вращать то, что вращать не требуется? Зачем вращать func_breakable? У этой энтити вообще не поддерживается angles. Надо вращать те энтити, у которых angles предусмотрены.

UnrealKaraulov commented 2 years ago

И вообще, зачем вращать то, что вращать не требуется? Зачем вращать func_breakable? У этой энтити вообще не поддерживается angles. Надо вращать те энтити, у которых angles предусмотрены.

ну как видно на скрине, поддерживаются

Qwertyus3D commented 2 years ago

На скрине видно ANGLES NOT SUPPORTED :D

UnrealKaraulov commented 2 years ago

Только Y не поддерживается в breakable

UnrealKaraulov commented 2 years ago

@Qwertyus3D вот например значения angles для игрока: image image

UnrealKaraulov commented 2 years ago

@Qwertyus3D это значит что не работает что ли?)

UnrealKaraulov commented 2 years ago

@Qwertyus3D вот все 3 YAW PITCH ROLL выставил

и практически 100% совпадает

image image

Qwertyus3D commented 2 years ago

"Работает" и "работает правильно" - это 2 разные вещи. Проверить на энтите, которая полноценно поддерживает angles, что мешает? И задать угол 90/180/270 по Yaw? А по Pitch 45. Я пытаюсь объяснить, как проверять, это же не просто так я писал. Смотреть надо не на то, наклоняется энтить или нет, а как она наклоняется в зависимости от заданного значения Yaw.

Qwertyus3D commented 2 years ago

Для этого даже в игру не нужно лезть. Прямо в самой программе видно, что наклон по Pitch относительно выбранного значения Yaw неверный.

UnrealKaraulov commented 2 years ago

@Qwertyus3D так я же кидаю скрины, info_player_start, все значения ставлю и в игре сущность наклонена именно под таким углом как и в редакторе.

почему-то в rotate надо -pitch тогда работает как на скрине

Qwertyus3D commented 2 years ago

Вот энтить лежит без поворотов 0 0 0: 0 0 0 Вот мы наклоняем её по Pitch на 45 0 0: 45 0 0 При этом видно, что вниз наклоняется та сторона, на которой расположена направляющая. Вот мы повернули энтить по Yaw на 0 90 0: 0 90 0 Вот мы к повороту по Yaw добавляем наклон по Pitch: 45 90 0: 45 90 0 Что получилось? Энтить наклонилась тупо в ту же сторону. Вместо того, чтобы ушла под землю та сторона, на которой была направляющая, а противоположная сторона поднялась, мы видим, что энтить завалилась на бок в том же направлении, без учёта поворота модели по Yaw.

UnrealKaraulov commented 2 years ago

@Qwertyus3D так, я изменил что-то и кажется это заработало... :)

Причем я уже раз 20 пытался так сделать и никак не работало, перебрал может 10 функций rotate matrix )

UnrealKaraulov commented 2 years ago

@Qwertyus3D https://github.com/UnrealKaraulov/newbspguy/commit/bd13889c0962f8a7d29597ec0293459a09a7f008

тут проблема решена или я опять глюк словил?))

тут еще какие-то косяки с func_ сущностями, у них или PITCH или YAW , одновременно и то и то не работает. не могу понять в чем дело :) причем редактор поддерживает, а в игре нет.

Qwertyus3D commented 2 years ago

Да не важно сейчас, что в игре. Важно, что сам редактор какую-то ересь показывает, это же очевидно.

UnrealKaraulov commented 2 years ago

Да не важно сейчас, что в игре. Важно, что сам редактор какую-то ересь показывает, это же очевидно.

зачем вообще отображать в редакторе то что не будет соответствовать увиденному в игре?

мне нужно что бы объекты располагались так как будут в игре

но что-то все равно не так, не понимаю что

Qwertyus3D commented 2 years ago

Я продемонстрировал сейчас скринами в точности то, что я показывал скринами из игры. В игре правильно всё, как должно быть по логике, а редактор показывает неправильное положение.

UnrealKaraulov commented 2 years ago

image

image раньше работало правильно в игре, теперь игрок смотрит вниз, а в редакторе нет

Qwertyus3D commented 2 years ago

Модель должна вращаться вокруг своей оси координат. А она вместо этого по Pitch вращается тупо в одном направлении. Вот что неправильно.

Qwertyus3D commented 2 years ago

Для редактора Pitch - это наклон в одну конкретную сторону. Точка.

UnrealKaraulov commented 2 years ago

@Qwertyus3D мне надо что бы соответствовало игре, иначе если в редакторе изменишь углы модельки, а в игре она окажется в е@#$нях то что это за редактор?)

Qwertyus3D commented 2 years ago

Так это и не соответствует игре вообще.

Qwertyus3D commented 2 years ago

Для игры вращение относительно центра энтити либо разрешено, либо нет. Но нет такого, чтобы энтити наклонялись в одну конкретную сторону. Такого в игре не происходит никогда.

Qwertyus3D commented 2 years ago

Как если бы Pitch был условно наклоном на север, и всё. На север можно наклонять, а на юг, запад и восток - нельзя. Вот как это "работает" в редакторе.

Qwertyus3D commented 2 years ago

Попробовал последний билд Update BspRenderer.cpp. Нет, ерунда там. Всё также заваливает модель в одном направлении, не учитывая того, повёрнута она или нет.

Qwertyus3D commented 2 years ago

Только крутит теперь в противоположную сторону, что вообще неверно.

Qwertyus3D commented 2 years ago

Хотя, если судить по игре, то без разворота энтити по Yaw "ноги" модели уходят вниз при отрицательном значении. Вообще-то это правильно, по идее. Т. к. в игре наблюдается такой же эффект. Проблема только, что Pitch продолжает наклонять модели только в одном направлении.

UnrealKaraulov commented 2 years ago

Первое значение из трёх 0 0 0 - это и есть Pitch.

Это с сайта Valve "angles are X, Y and Z also known as Roll, Pitch and Yaw."

UnrealKaraulov commented 2 years ago

@Qwertyus3D с последним обновлением https://github.com/UnrealKaraulov/newbspguy/commit/4d70f5663df25bdcb1b38343893251564ead2508 у меня адекватно работают брашевые entity как в редакторе так и в игре, info_player_start тоже адекватно стало показывать направление взгляда игрока, как в редакторе так и в игре одинаковые углы.

https://youtu.be/7v4NLwFlB4Q

Но тот мертвый ученый наклонен не под тем углом все равно :) может у него правила наклона другие и отличаются от других сущностей... ?:)

Qwertyus3D commented 2 years ago

Это с сайта Valve "angles are X, Y and Z also known as Roll, Pitch and Yaw."

OMG, ну а FGD что показывает на любой энтите с поддержкой angles??? X, Y и Z это безусловно Roll, Pitch и Yaw. Только порядок значений такой: Pitch Yaw Roll (Y Z X) (angles) Это в любой справке по энтитям прописано... https://twhl.info/wiki/page/monster_barney https://simple.wikipedia.org/wiki/Pitch,_yaw,_and_roll

Qwertyus3D commented 2 years ago

Pitch - наклон, Yaw - поворот, Roll - вращение. Я всю дорогу толкую о том, что энтить наклоняется строго в определённом направлении, независимо от угла поворота или вращения. Последний апдейт частично исправил ситуацию, но поломал поддержку angle, потому что для angle берётся значение Z, среднее из трёх, но редактор теперь думает иначе и не поворачивает энтить на указанный угол вообще.

Qwertyus3D commented 2 years ago

Ещё раз. У энтити есть направляющая. Yaw (Z) вращает энтить вокруг вертикальной оси, меняя её расположение, как по компасу. Pitch (Y) производит наклон энтити. При правильной механике, если значение Pitch отрицательное, направляющая должна наклониться вниз, а при положительном значении - подняться вверх. И это должно работать с учётом того, как энтить повернулась по Yaw (Z). Но! Для модели игрока в Голдсорсе имеется баг, и отрицательное значение, наоборот, разворачивает модель игрока взглядом вверх. Называется это Stupid Quake Bug: https://www.reddit.com/r/HalfLife/comments/6jjhbd/xash_guy_on_stupid_quake_bug/

Дядя Миша в Ксаше это исправил. Но в случае с моделью учёного как раз проблема в том, что в последнем билде наклон производится в противоположную сторону. А так, действительно, углы сейчас работают корректно. Pitch наконец-то учитывает положение модели по Yaw. Но поломалась поддержка angle. В общем, сейчас исправить нужно:

  1. Инвертировать Pitch
  2. Вернуть Yaw для angle
Qwertyus3D commented 2 years ago

Revert engine "hardcoded" angles for bspmodels Angle заработал, но направление Pitch осталось тем же, фикса не было? Или только для браш-моделей что-то изменилось?

UnrealKaraulov commented 2 years ago

Revert engine "hardcoded" angles for bspmodels Angle заработал, но направление Pitch осталось тем же, фикса не было? Или только для браш-моделей что-то изменилось?

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

пока ничего сделать лучше чем есть не могу :)

Qwertyus3D commented 2 years ago

Есть предложение добавить опцию инверсии Pitch, подобно опциям оптимизации. Чтобы можно было самому указывать, каким энтитям нужна инверсия. Хотя, по моему мнению, правило общее, и должно применяться к любой студиомодели. Потому что учёный - это частный случай студиомодели.

Qwertyus3D commented 2 years ago

Вот я задал углы в редакторе моделям солдат: PitGuy

А в игре строго наоборот: PitGam

Qwertyus3D commented 2 years ago

Вот задал противоположный угол Pitch для двух func_door: DoorGuy В игре эти углы влияют на то в какую сторону смещается дверь при открывании.

Вот что в игре: DoorGam При положительном значении дверь уезжает вниз (ближняя), а при отрицательном - поднимается вверх (дальняя).

Qwertyus3D commented 2 years ago

Я так понимаю, проблема в том, что брашевые энтити следуют одним принципам наклона (положительное значение задаёт направление вниз), а студиомодели / точечные энтити - другим (положительное значение задаёт направление вверх).

UnrealKaraulov commented 2 years ago

@Qwertyus3D как на счет infoplayer ?

@Qwertyus3D func_door не поддерживает angles d

Qwertyus3D commented 2 years ago

Вот подтверждение, энтитя func_door_rotating (с официальной поддержкой angles) в редакторе: RotGuy

Вот она же в игре: RotGam Углы совпадают. А для студиомоделей - нет. Это и есть Stupid Quake Bug.