> Ну если бы ты предложил триллион, то я просто расщепил бы вселенные и создал новые, где у тебя нет триллиона.
а ещё говорит что не царь, вот почему у меня нет триллиона, ловите его!
}:+()___ [Smile]
Как ты уже понял, я спорить с тобой не хочу. Я хочу только спросить две вещи, которые как мне кажется, будут более интересны в диалоге, чем слушать попытки твои унизить меня за мои формулировки.
Итак вопросы.
1. Ты называешь векторы камеры front, pos, и up матрицей. Скажи мне пожалуйста, ты эти вектора хранишь в матрице или тоже заувалировал их под вектора, но считаешь это матрицей? Это просто вопросы. Если ты называешь её матрицей, значит она поддается матричным умножениям и сложениям. Хорошо, видимо ты знаешь как взять мой код и переделать под матричные операции, потому что тебе не нравиться почему-то векторная алгебра.
2. Второй вопрос тоже матрицах. Я тебе не стараюсь что-то доказать, я просто хочу понять почему ты так мыслишь, потому что в любом случае я беру более авторитетное мнение из книг, так что твои объяснения всего лишь дадут представления о тебе. Итак, вопрос. Отличаются ли векторное умножение от матричного? Просто там у меня вектора надо перемножать. Возможно ты сделаешь из матрицы единичную, а потому поменяешь на эти значения. В любом случае матричное мышление мне бы мешало в расчетах, так как векторное здесь подходит больше. В любом случае ты же наверное очень крутой и для тебя легче считать матрицами. Можешь поменять мой код так, чтобы я понимал как ты мыслишь? Я имею ввиду поменять, чтобы всё матрицами считалось как ты это называешь и отбросишь векторную алгебру.
xverizex
Мне конечно до Смайла далеко, но насколько я вижу потому как устроены некоторые библиотеки для алгебры, вектор - это просто частный случай матрицы.
kkolyan
Тогда мне также интересно как и ты мыслишь. Расскажи. Вот я беру чистые вектора камеры. Ты из них создаешь матрицу, причём в том виде как они лежат векториально. На что ты будешь умножать матрицу или складывать, чтобы получить нужные две точки начала и конца луча? Мне сложно понять и поэтому я не верю, что это матрицы. То что их так называют это некорректно, пока не доказано, что эти с этими же векторами можно работать как с матрицами и получить результат.
Но думаю, если ты видишь в смайле крутого разраба, то он докажет и я пойму как он мыслит и почему я так слаб ещё в линейной алгебре. В принципе мне не страшно, что я слаб в линейной алгебре, я это признаю. Я пока занимался только по одной книге линейной алгебры и сейчас читаю по аналитической геометрии и векторному анализу.
Думаю, что смайл сможет показать, но только без обратных матриц (то-есть не используя классический способ), как это с помощью камеры, которой он написал, cam->pos, cam->front, cam->up, можно используя матричные преобразования получить желаемый результат. Просто видимо я ещё плохо понимаю насколько крутые матрицы и что они могут заменить векторную алгебру.
xverizex
У нас есть сцена, на сцене есть объекты. Есть экран.
На основе pos/rot/scale каждого видимого объекта формируется его world matrix. На основе pos/rot/scale камеры формируется view matrix, причем так же, как world matrix, но инвертированно.
На основе fov и far/near формируется projection matrix.
Умножение вершины модели на world matrix переносит ее из пространства модели (то с чем роаботает моделлер) в пространство игрового мира.
Затем, ее умножение на view matrix переносит эту вершину во фрустум камеры.
Затем, ее умножение на projection matrix переносит эту вершину в пространство экрана (вернее, в clip space).
Задача при рендеринге - преобразовать точку сэмодели в точку экрана, а при рэйкастинге задача в точности наоборот.
Соответственно, используем одни и те же матрицы, но в случае рэйкастинга инвертируем их.
kkolyan
> У нас есть сцена, на сцене есть объекты. Есть экран.
>
> На основе pos/rot/scale каждого видимого объекта формируется его world matrix. На основе pos/rot/scale камеры формируется view matrix, причем так же, как world matrix, но инвертированно.
> На основе fov и far/near формируется projection matrix.
>
> Умножение вершины модели на world matrix переносит ее из пространства модели (то с чем роаботает моделлер) в пространство игрового мира.
>
> Затем, ее умножение на view matrix переносит эту вершину во фрустум камеры.
>
> Затем, ее умножение на projection matrix переносит эту вершину в пространство экрана (вернее, в clip space).
>
> Задача при рендеринге - преобразовать точку сцены в точку экрана, а при рэйкастинге задача в точности наоборот.
>
> Соответственно, используем одни и те же матрицы, но в случае рэйкастинга инвертируем их.
Да, но ты видел к чему смайл придрался. Он пишет, что я скрыл матрицы и говорю, что использую вектора без матриц, хотя по факту, как он пишет, я использую матрицы. В твоем примере видно, что используются матрицы, но до них надо дойти. Мне же интересен способ смайла, который утверждает, что я не хочу признавать вектора матрицами и что с этими векторами можно также работать как с матрицами.
Ты же видел мой код? Видел где-нибудь обратные матрицы? Я нашел взаимосвязь между экранным масштабированием и смог придумать формулу, которая можно пулять луч на любое расстояние. Я даже видео приложил где видно этот луч. Он пишет, что это матрицы, а не вектора. Вот я и хочу посмотреть как он это понимает, чтобы разобраться что он имеет ввиду.
Чтобы тебе было понятно, я приведу видео https://vk.com/video583070625_456239119 . А это код, который в видео применяется https://gitverse.ru/xverizex/monus-engine/content/3c69d27da181cf3… ry.c?line=175
xverizex
> Просто видимо я ещё плохо понимаю насколько крутые матрицы и что они могут заменить векторную алгебру.
Мне лень работать репетирором и, тем более, разбирать чужой код, поэтому просто намекну. У объектов сцены есть матрицы — преобразования из локальной системы координат в глобальную. У камеры тоже есть такая матрица — с точностью до нормировки это набор {side, up, front}. Для целей отображения необходимо переводить координаты из мировой в локальную систему координат камеры. Матрица этого преобразования — это обратная матрица камеры, обычно называется видовой. Для целей генерации лучей надо, наоборот, переводить лучи из локальной системы координат камеры в глобальную. Собственно, исходная матрица камеры делает именно это.
}:+()___ [Smile]
Я так и думал что по моему примеру ты не придумаешь ничего и сослешься на классический способ. Ну то-есть я не то, чтобы так думал, я просто верил, что ты не правильно сформулировал, что я сделал. Я применил векторную алгебру для пускания луча, ты сказал, что я использую матрицы. Докажи, что я использую матрицы. Сейчас ты мне привел классический способ с помощью матриц, который не похож на мой способ из-за обилия операций. Ты написал, что мои вектора камеры это матрица, а теперь пишешь, что матрица камеры это матрица, которая сделалась с помощью lookat. То-есть получается, что то, что ты приводил пример с векторами cam->pos, cam->eye, cam->up уже не канает, так как это вектора. Я нашел способ использовать векторную алгебру, а ты знал только как это делается с помощью матриц. Я тебя понимаю, тебе наверное завидно, что ты человек с таким опытом и не смог найти способ, который нашел я.
}:+()___ [Smile]
Опять же, вот код lookat. Как по нему видно, вектора приводятся по определенному алгоритму к матрице. В моём случае я не привожу к этому алгоритму, чтобы решить проблему. Значит я не использую матрицы. С lookat можно построить обратную матрицу, но только если вектора приобразовать по такому алгоритму.
void lookat (float *e, float *ex, float *r, float *up) { memset ( e, 0, sizeof ( float) * 16); float cam_forward[3]; float cam_forward_t[3]; float cam_right[3]; float cam_right_t[3]; float cam_up[3]; vec3_sub ( cam_forward_t, r, ex); vec3_norm ( cam_forward, cam_forward_t); vec3_cross ( cam_right_t, cam_forward, up); vec3_norm ( cam_right, cam_right_t); vec3_cross ( cam_up, cam_right, cam_forward); e[0] = cam_right[0]; e[1] = cam_up[0]; e[2] = -cam_forward[0]; e[3] = 0.f; e[4] = cam_right[1]; e[5] = cam_up[1]; e[6] = -cam_forward[1]; e[7] = 0.f; e[8] = cam_right[2]; e[9] = cam_up[2]; e[10] = -cam_forward[2]; e[11] = 0.f; e[12] = -vec3_dot ( cam_right, ex); e[13] = -vec3_dot ( cam_up, ex); e[14] = vec3_dot ( cam_forward, ex); e[15] = 1.f; }
}:+()___ [Smile]
И я не спрашивал у тебя как у репетитора. Ты докопался до меня из-за того, что мол я использую матрицы и теперь когда мы подходим к вопросу доказательства ты говоришь, что не хочешь быть репетитором и приводишь не мой код в пример, а классический, который я и так знаю. Как будто ты даже читать не умеешь что я тебе пишу. Либо ты не понимаешь что я тебе пишу. У тебя может инвалидность есть? У меня например есть. Просто ты объясни где я использую матрицы в своих алгоритмах, а если ты не хочешь вчитываться в код, то зачем пишешь тогда несуразицу?
xverizex
Короче смайл, ты меня вывел из себя. Мне не нравиться такое пофигистическое отношение к своим словам. Ты говорил одно и говорил, что решить можно только с помощью матриц, хотя мой вариант сделать с помощью векторов. Теперь не хочешь это доказывать, а те намеки что приводишь, пишешь только о том, что знаешь сам и знают все, кто знаком с пусканием луча. Я придумал новый способ пускания использовав векторную алгебру, а ты пишешь что это невозможно. Я привел код как доказательство, привел видео как это работает, а от тебя в итоге ничего не получил. Так как я разозлился и наш разговор не приведет к моему удовлетворению, потому что ты не умеешь даже общаться, не то что доказывать. Если бы умел общаться, то я был бы рад общению с тобой.
В любом случае здесь на форуме я не найду нормального общения, так как вижу, что здесь некоторые даже давят других только за то, что они когда-то там что-то не осилили сделать. Ты пишешь что-то нелогичное на мои доводы. Как общаться в таком круге социума я не знаю. Так что я не буду больше посещать этот сайт за то, что здесь некомфортно.
Можешь короче считать, что я тебе поверил и ты меня убедил, что я использую матрицы и что я понял, что с помощью векторной алгебры решить задачу невозможно. Это я написал, чтобы тебя успокоить, так как я не желаю общаться больше с тобой.
Тема закрыта.