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

OGL::Беда с матрицами

Страницы: 1 2 Следующая »
#0
16:35, 17 июня 2014

Всем привет! Ломаю голову уже пару дней, никак не могу придумать как лучше всего сделать такое -
Изображение
Есть некое поле с плиткой и нужно анимировать определенные плитки (анимация - просто поворот по какой-то оси).
Я решил что тут делов на 5 минут - сделал одну ортогональную матрицу, масив из ModelView матриц, рисуется все за один драукол, все замечательно.
Начал делать анимацию, по оси Z, как и ожидалось - все нормально. Начал делать по X и Y - и тут я понял свою ошибку - ортогональная матрица.
Ок, сделал хак для проекции - m34 = -1 / 500, со спрайтами, расположенными в середине все нормально, но те, которые по бокам - искажаются. С перспективной матрицей тоже.
Я конечно понимаю что так и должно быть, но теперь не совсем понятно как сделать то, что мне нужно.

Тут скорее всего не обойтись без своей матрицы проекции на каждый спрайт и хотелось бы, для удобства, задавать координаты вершин в экранных координатах (то есть пользоваться ортогональной).
В общем вопрос к знатокам - кто как бы поступил ;)

#1
16:39, 17 июня 2014

rock88
Не понятно, что должно быть в итоге?

#2
16:41, 17 июня 2014

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

#3
16:51, 17 июня 2014

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

#4
16:59, 17 июня 2014

nes
Это все как 2д должно выглядеть. Хотя уже не уверен, смотрится, действительно, странновато...

#5
17:01, 17 июня 2014

rock88
Если как 2Д тогда делай ортогональную матрицу, иначе одну перспективную на все спрайты.
Хинт: Если нужно 2Д похожее на 3Д - попробуй поиграть с FOV.

#6
17:07, 17 июня 2014

rock88
> кто как бы поступил
по перспективной матрице с "центром" в цетре плитки rock88

#7
17:13, 17 июня 2014

rock88
честно, я так и не понял что ты хочешь сделать... у тебя на картинке установлена орто проеция и вращаешь в шахматном порядке спрайты по X? если да, то как у тебя появилось искажение перспективы?! может ты орто неправильно настроил?

#8
17:17, 17 июня 2014

nes
Сейчас так и сделано, поигрался с FOV

1. Хорошо видна перспектива, по идее все спрайты должны выглядеть как центральный.
Изображение

2. На центральном уже еле заметно.
Изображение

3. Перспективы все меньше, почти чистое 2д вращение.
Изображение

#9
17:24, 17 июня 2014

rock88
>по идее все спрайты должны выглядеть как центральный.
Не должны, имхо вторая картинка выглядит вполне нормально.
Если уж нужно такое "2Д", то я бы порекомендовал заиметь для каждой плитки три матрицы - перспективную, модели-вида и результирующую.
Перемножать их софтварно а в шейдер передавать только результирующую.

#10
18:19, 17 июня 2014

rock88
Так если GL с шейдерами, просто в вершинном переноси квад в центр экрана, проецируй, а потом обратно на место

знакомые люди :D

#11
19:36, 17 июня 2014

Andy51
У меня позиция в моделВью матрице, пробую сделать так -

 
attribute vec4 position;
attribute vec2 inputTextureCoordinate;
 
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix[16];
 
varying vec2 textureCoordinate;
 
void main()
{
     int i = int(position.w);
     mat4 matrixMV = modelViewMatrix[i];
     vec4 translation = vec4(matrixMV[3][0], matrixMV[3][1], matrixMV[3][2], 0.0); // сохраняем позицию, пока обратно не восстанавливаю
     
     matrixMV[3][0] = matrixMV[3][1] = matrixMV[3][2] = 0.0; // сбрасываем позицию
     
     gl_Position = projectionMatrix * matrixMV * vec4(position.xyz, 1.0) + vec4(0.5,0.5,0.0,0.0); // двигаем, что-бы по-быстрому посмотреть что получится
     textureCoordinate = inputTextureCoordinate;
 }

В результате получаю такие же искажения.

Может лучше позицию не через матрицу устанавливать?

сто лет не виделись, рад встрече :D

#12
5:19, 18 июня 2014

rock88
> Тут скорее всего не обойтись без своей матрицы проекции на каждый спрайт
Да.
Ставь проекцию как для центрального, а для остальных затем догоняй её транслейтами в нужное место экрана, как обычный двухмерный объект.

#13
9:46, 18 июня 2014

rock88
> Тут скорее всего не обойтись без своей матрицы проекции на каждый спрайт и
> хотелось бы, для удобства, задавать координаты вершин в экранных координатах (то есть пользоваться ортогональной).

Ортогональная матрица для того, что ты хочешь, НЕ ПОДХОДИТ. Теряется "глубина", в-общем эффект просто кошмарно выглядит, уже пробовал.

> В общем вопрос к знатокам - кто как бы поступил ;)
А вариант аж один, "есть из чего выбирать" (из вменяемых и простых, конечно).
Проекционная матрица, точки на проекционной матрице довольно легко получить из экранных, не знаю, где ты там проблему увидел :)

#14
10:13, 18 июня 2014

матрица ортогональная должна быть, углы плитки при повороте надо самому посчитать для имитации пространственных искажений, формула простейшая - AddX = deltaZ * Koef

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.