Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Не могу увидеть причину проблемы (Вопрос по матрицам: MVP)

Не могу увидеть причину проблемы (Вопрос по матрицам: MVP)

Страницы: 1 2 Следующая »
TargetПостоялецwww10 авг. 201814:21#0
Всем добрый день. В целях саморазвития решил не использовать готовое решение glm а разобраться в работе с матрицами изнутри.
Написал простой класс матрицы 4x4. И решил постепенно применять каждую из них к вершинам треугольника, передавая матрицу в шейдер.
Проблема кроется в том, что ничего не работает так как это по идее должно... я решил начать проверять с самого простого. Просто применяю обычную матрицу масштабирования к вершинам. Но вместо корректного уменьшения треугольника я вижу совсем другую картину.
+ Показать

В чем дело?

Класс матрицы:

+ Показать

Правка: 10 авг. 2018 14:26

Mr FПостоялецwww10 авг. 201814:25#1
Ну ты б матрицу например показал
TargetПостоялецwww10 авг. 201814:32#2
Передаю матрицу масштаба:
+ Показать
SuslikМодераторwww10 авг. 201814:43#3
Target
если тебе просто указать на ошибку, это ничем не поможет. гораздо полезнее научиться, как такие ошибки искать самостоятельно, потому что если ты дальше планируешь программировать, они неизбежно будут, сотни и тысячи. например, если ты не уверен, что матрицу правильно передал в шейдер, построй её прямо в шейдере. если заработает так, как ты ожидаешь, значит, ошибка в передаче. если нет, значит, ошибка в математике. если ошибка в передаче, то ставишь брейкпойнт на передачу матрицы и проверяешь, что матрица на стороне CPU действительно правильно построена. умение отлаживать шейдер — пожалуй, самый важный навык в работе с графикой, так как за ним всё остальное подтянется.

также если у тебя есть уже работающий код с glm, то это сильно облегчает ситуацию, так как ты можешь просто сравнить свою матрицу с их.

Правка: 10 авг. 2018 14:50

TargetПостоялецwww10 авг. 201814:55#4
Suslik
Как-то даже раздражать начало что пятый день переписываю заново класс матрицы и для гарантии смотрел имплементации на гитхабе, но все равно не работает должным образом. Если честно, как то уже подугас энтузиазм с идеей разобраться в матрицах, в теории все понятно и ничего сверхсложного но начал реализовывать - одно и тоже каждый раз. И в чем проблема не могу понять. Продолжу копать. Но я все же хотел услышать возможную проблему. Как передаю - я приложил скрин. Код класса матриц - тоже, тем более что он небольшой и в нем только базовые операции. А насчет того, что во всем разбираться самому нужно - я всегда так делаю. Но в этот раз потратить столько времени на одну вещь - это уже слишком. Либо я не вижу явной проблемы.
В передаче матрицы я уверен, ибо видел как передается на примере матрица в шейдер.

Правка: 10 авг. 2018 14:56

MarmiladПостоялецwww10 авг. 201815:03#5
Пробуй передавать в MVP только по 1-й матрице.
Сначало матрицу World, потом View и потом Projection.
Что бы понять где косяк ! В какой матрице.

Так же можно в шейдере создать матрицу и умножить на неё вершины, что бы увидить что она верно работает.
И если да, то точно проблема у тебя в коде.

Правка: 10 авг. 2018 15:07

eDmkУчастникwww10 авг. 201815:06#6
Вот перспективная матрица. OpenGL ею доволен.
Надеюсь на C++ переведете сами.
+ Показать

Купите себе книжку по OpenGL или движкам. Там матрицы описаны.
Или уроки ищите. Вот например: http://triplepointfive.github.io/ogltutor/tutorials/tutorial12.html
Но там матрица немного другая. Это все изучать подробно нужно.

Ваш класс матриц можно выкинуть. Там куча ошибок.

Правка: 10 авг. 2018 15:18

TargetПостоялецwww10 авг. 201815:26#7
Marmilad
> Пробуй передавать в MVP только по 1-й матрице.
В том и проблема... что я к самой простой матрице перешел... к единичной и не работает. Дело в коде.
eDmk
> Ваш класс матриц можно выкинуть. Там куча ошибок.
Я уже понял, за ссылку спасибо. Примеры реализаций смотрел на всяких гитхабах.
Будем исправляться.

Правка: 10 авг. 2018 15:26

AndreyПостоялецwww10 авг. 201815:39#8
Target
> Если честно, как то уже подугас энтузиазм с идеей разобраться в матрицах, в
> теории все понятно и ничего сверхсложного но начал реализовывать - одно и тоже
> каждый раз.
это нормально, когда на Vulkan(там другая система в NDC) портировал пришлось немного дописать построение матриц тоже посидел какоето время, и да сравнивал с glm.
>И в чем проблема не могу понять. Продолжу копать. Но я все же хотел
> услышать возможную проблему. Как передаю - я приложил скрин. Код класса матриц
> - тоже, тем более что он небольшой и в нем только базовые операции.
пробовал забить в коде готовую и передать ? ты сравнил значения своей матрицы с в отладчике glm ? Может нужно транспонировать?
TargetПостоялецwww10 авг. 201815:43#9
Andrey
Сейчас начну сверять все с результатами glm. Только класс подправлю. Результат скажу.
TargetПостоялецwww10 авг. 201819:07#10
Сейчас исправил матрицы... все как бы работает... но не совсем. Умножение матриц работает корректно, ибо когда мы вычисляем матрицу поворота сразу для трех осей - мы перемножаем каждую получившуюся матрицу для каждой из осей друг на друга. Я сверил с glm - все точно и верно. Ну, думаю я, хорошо, окей. Взял и попробовал перемножить матрицу масштабирования на матрицу поворота и сравнил - все хорошо и все окей. Ну я тут обрадовался, что снова начал силы и энтузиазм возвращаться (в голове уже картинки рисуются с шейдерами и отложенным рендером ну и тд). Тут я в последнюю очередь беру и перемножаю: матрицу трансляции * матрицу поворота * матрицу масштаба. Но нет... не правильно. Будто бы нижнюю строку не нужно перемножать...

Результат такой в общем:

+ Показать

Матрицу перемещения вычисляю так:

+ Показать

Умножаю как и нужно:

+ Показать

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

+ Показать

SuslikМодераторwww10 авг. 201819:17#11
Target
то есть ты решил переопределить операцию умножения матриц, чтобы подогнать ответ? :D

Target
> матрицу трансляции * матрицу поворота * матрицу масштаба
какого результата ты ожидаешь?

Target
> Матрицу перемещения вычисляю так:
ты не пробовал как-нибудь инициализировать все элементы матрицы, а не только те, которые тебе показались самыми интересными? у тебя в каждом втором методе эта ошибка.

PS я когда изучал графику, вообще матрицами не пользовался. вместо умножения матрицы на вектор использовал три скалярных произведения с векторами "вверх", "вправо" и "вперёд". однородные координаты не использовал вообще. проекцию осуществлял, просто через поиск пересечения луча с плоскостью изображения. в таком способе в принципе не может возникнуть вопросов вроде "а что мне писать в четвёртый столбец матрицы?", "а в каком порядке мне матрицы умножать?" или "почему у меня результат зависит от порядка применения поворотов?". да, потом пришлось немного переучиваться, чтобы можно было легко общаться со стандартным кодом на матрицах, но, понимая, что происходит внутри, это сделать было очень легко. вывод: пока учишься, осуществляй преобразования не так, как считается канонично, а так, как тебе более понятно.

Правка: 10 авг. 2018 19:17

TargetПостоялецwww10 авг. 201819:29#12
Suslik
> ты не пробовал как-нибудь инициализировать все элементы матрицы
Элементы матрицы инициализируются в единичную матрицу еще конструкторе при создании по дефолту в 1. Каков смысл заново задавать элементам матрицы повторно нули или единицы, если для каждого типа матрицы при вычислениях используются определенные элементы под определенными индексами, которые не повторяются в разных матрицах?

В матрице масштабирования используются элементы только по диагонали. В матрице масштабирования только крайние правые. А в матрице поворота и те и другие, вычисляет правильно... я сравнивал с результатами glm. Причем различные значения пробовал. Но я не понимаю, почему умножение не работает корректно именно с матрицей перемещения.

TargetПостоялецwww10 авг. 201819:59#13
Suslik
> > матрицу трансляции * матрицу поворота * матрицу масштаба
> какого результата ты ожидаешь?
Матрицу модели.
SuslikМодераторwww10 авг. 201820:01#14
Target
> Элементы матрицы инициализируются в единичную матрицу еще конструкторе при
> создании по дефолту в 1. Каков смысл заново задавать элементам матрицы повторно
> нули или единицы, если для каждого типа матрицы при вычислениях используются
> определенные элементы под определенными индексами, которые не повторяются в
> разных матрицах?
например, смысл такой, что у тебя сейчас метод SetIdentityMatrix(), например, устанавливает только диагональные элементы, поэтому недиагональные элементы вообще остаются неинициализированные. и если ты сделаешь, например, SetRotation().SetIdentity(), то у тебя останется каша, а не матрица. и рано или поздно этот момент обязательно настанет — не выстрелит сейчас, выстрелит завтра. если тебе так хочется мнить себя умнее оптимизатора, то сделай пустой конструктор без инициализации, хотя любой компилятор такое всегда задетектит и код лишней инициализации в любом случае выкинет.

и вот ты сам свой вопрос прочитай: "я умножаю три матрицы и результат получается не такой как в glm". боже мой, ну приложи минимальные усилия, чтобы найти ошибку, кто это может сделать за тебя?: перемножь не три матрицы, а две, чтобы найти минимальный воспроизводимый случай с ошибкой. уж две матрицы можно на листочке перемножить. ты, можно подумать, чёрный ящик с ядерным реактором внутри отлаживаешь — бери да сравнивай поэлементно, на каком этапе происходит ошибка.

> > > матрицу трансляции * матрицу поворота * матрицу масштаба
> > какого результата ты ожидаешь?
> Матрицу модели.
если у тебя матрица умножается на вектор слева, то вообще-то вектор переноса должен хранить в последнем столбце матрицы, а не строке. и, опять же, этой проблемы даже бы не существовало, если бы ты просто попробовал руками перемножить один вектор на одну матрицу на листочке.

Правка: 10 авг. 2018 20:03

Страницы: 1 2 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр