Всем привет! Ломаю голову уже пару дней, никак не могу придумать как лучше всего сделать такое -
Есть некое поле с плиткой и нужно анимировать определенные плитки (анимация - просто поворот по какой-то оси).
Я решил что тут делов на 5 минут - сделал одну ортогональную матрицу, масив из ModelView матриц, рисуется все за один драукол, все замечательно.
Начал делать анимацию, по оси Z, как и ожидалось - все нормально. Начал делать по X и Y - и тут я понял свою ошибку - ортогональная матрица.
Ок, сделал хак для проекции - m34 = -1 / 500, со спрайтами, расположенными в середине все нормально, но те, которые по бокам - искажаются. С перспективной матрицей тоже.
Я конечно понимаю что так и должно быть, но теперь не совсем понятно как сделать то, что мне нужно.
Тут скорее всего не обойтись без своей матрицы проекции на каждый спрайт и хотелось бы, для удобства, задавать координаты вершин в экранных координатах (то есть пользоваться ортогональной).
В общем вопрос к знатокам - кто как бы поступил ;)
rock88
Не понятно, что должно быть в итоге?
Executor
Спрайты должны вращаться и это должно выглядеть так, как будто они находятся в центре экрана. Сейчас же - чем дальше от центра, тем больше искажения.
rock88
>Спрайты должны вращаться и это должно выглядеть так, как будто они находятся в центре экрана.
Ты точно уверен что так должно быть?
Кому пришла в голову такая идиотская идея?
nes
Это все как 2д должно выглядеть. Хотя уже не уверен, смотрится, действительно, странновато...
rock88
Если как 2Д тогда делай ортогональную матрицу, иначе одну перспективную на все спрайты.
Хинт: Если нужно 2Д похожее на 3Д - попробуй поиграть с FOV.
rock88
> кто как бы поступил
по перспективной матрице с "центром" в цетре плитки rock88
rock88
честно, я так и не понял что ты хочешь сделать... у тебя на картинке установлена орто проеция и вращаешь в шахматном порядке спрайты по X? если да, то как у тебя появилось искажение перспективы?! может ты орто неправильно настроил?
nes
Сейчас так и сделано, поигрался с FOV
1. Хорошо видна перспектива, по идее все спрайты должны выглядеть как центральный.

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

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

rock88
>по идее все спрайты должны выглядеть как центральный.
Не должны, имхо вторая картинка выглядит вполне нормально.
Если уж нужно такое "2Д", то я бы порекомендовал заиметь для каждой плитки три матрицы - перспективную, модели-вида и результирующую.
Перемножать их софтварно а в шейдер передавать только результирующую.
rock88
Так если GL с шейдерами, просто в вершинном переноси квад в центр экрана, проецируй, а потом обратно на место
знакомые люди :D
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
rock88
> Тут скорее всего не обойтись без своей матрицы проекции на каждый спрайт
Да.
Ставь проекцию как для центрального, а для остальных затем догоняй её транслейтами в нужное место экрана, как обычный двухмерный объект.
rock88
> Тут скорее всего не обойтись без своей матрицы проекции на каждый спрайт и
> хотелось бы, для удобства, задавать координаты вершин в экранных координатах (то есть пользоваться ортогональной).
Ортогональная матрица для того, что ты хочешь, НЕ ПОДХОДИТ. Теряется "глубина", в-общем эффект просто кошмарно выглядит, уже пробовал.
> В общем вопрос к знатокам - кто как бы поступил ;)
А вариант аж один, "есть из чего выбирать" (из вменяемых и простых, конечно).
Проекционная матрица, точки на проекционной матрице довольно легко получить из экранных, не знаю, где ты там проблему увидел :)
матрица ортогональная должна быть, углы плитки при повороте надо самому посчитать для имитации пространственных искажений, формула простейшая - AddX = deltaZ * Koef
Тема в архиве.