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

Масштабирование вида

Страницы: 1 2 Следующая »
#0
12:33, 8 дек. 2011

Сформулирую ка я по другому, а то видать запутанно получилось.
Есть модель, есть фото, которое в полупрозрачном режиме накладывается на модель. Нужна возможность масштабирования и сдвига фото (zoom, pane). При масштабировании и перемещении картинки, модель под ним должна масштабироваться и смещаться синхронно. То есть точки модели должны проецироваться в те же точки изображения.  С фото проблем нет, прямоугольник в экранных координатах, натягивай текстуру, и двигай как хочешь. А вот с моделью уже все не так просто. Ее двигать нельзя, иначе помимо масштабирования будет еще меняться и ракурс. Извиняюсь за эту мозголомную простыню :)


#1
13:10, 8 дек. 2011

Tolanay
> Пытался добавить смещение в проекционную матрицу

А надо в мировую.

#2
13:24, 8 дек. 2011

Проекция перспективная, поэтому добавлять смещение ни в мировую ни в видовую матрицы нельзя. Будут перспективные искажения.

#3
14:02, 8 дек. 2011

Tolanay
> Проекция перспективная, поэтому добавлять смещение ни в мировую ни в видовую
> матрицы нельзя. Будут перспективные искажения.

Бред какой.
С утра выучил термины "перспектива", "матрица", "проекция"?
В мировую матрицу добавляй смещение в направлении камеры - будет тебе "масштабирование".
В мировую матрицу добавляй смещение перпендикулярно направлении на камеру - будет тебе "движение".
Попробуй и убедись.

#4
14:21, 8 дек. 2011

Moondark, он наверно имел ввиду реализацию зума, тогда правильно говорит, менять надо матрицу проекции...

#5
14:55, 8 дек. 2011

Igor'
> Moondark, он наверно имел ввиду реализацию зума, тогда правильно говорит,
> менять надо матрицу проекции...

А, наверное, чото он так смутно написал, меня "ракурс не должен меняться" вместе с "нужно двигать и масштабировать уже саму картинку" в голове плохо укладывается.

Tolanay
Если ты уже понял как "делать зум" корректируя матрицу проекции, то поворот (я правильно понимаю - что тебе нужно поворачивать камеру вокруг своей оси?), то вот поворот надо делать через матрицу мировую. Не смещение, заметь, а поворот. (подобновил свои знания по количеству и видам матриц в API в гугле) И если речь про DX, а судя по твоей терминлогии - речь именно о нём - то там для этого специально есть матрица вида. Ею можешь повращать. А OGL матриц две - та что комбинирует мировую и видовую из DX и проекции, я с GL больше работал, так что по памяти и вспоминал.

#6
16:29, 8 дек. 2011

Igor'
> тогда правильно говорит, менять надо матрицу проекции...
а что там менять?  znear, zfar, fovx, fovy ?  какой зум можно этим сделать то?    Поидее (поидее! Я не делал както зум) ведь достаточно просто подвинутькамеру вдоль вектора взгляда вперёд от игрока да и всё! А вращать её не относительно её новой позиции а относительно старой (та, что к игроку привязана).  Просто скорость вращения делать в несколько раз  меньше.  (хотя будет не кошерно смотреться, когда zNear будет резать объекты >_<). Т.е. получается надо просто fov делать меньше & zFar дальше.

#7
16:50, 8 дек. 2011

To All
Да я наверно не очень понятно описал задачу. Просто она несколько необычная. Чтоб было понятнее лучше опишу исходную задачу.
Есть модель, есть фото, которое в полупрозрачном режиме накладывается на модель. Масштаб и сдвиг, нужен для просмотра фото в увеличенном режиме. При масштабировании и перемещении картинки, модель под ним должна масштабироваться и смещаться синхронно. То есть точки модели должны проецироваться в те же точки изображения.  С фото проблем нет, прямоугольник в экранных координатах, натягивай текстуру, и двигай как хочешь. А вот с моделью уже все не так просто. Ее двигать нельзя, иначе помимо масштабирования будет еще меняться и ракурс. Извиняюсь за эту мозголомную простыню :) Но, может кому-то будет интересно проверить свои знания, и решить эту задачку.
У меня есть способ ее решения, но он мне не нравиться, так как нужно создавать здоровенный backbuffer :). Все было бы шоколадно, если бы функция SetViewport работала с отрицательными значениями x, y (левый верхний угол). Но Direct3d9 на это пойти не могет, зараза.

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

To .L
Масштабировать вид можно масштабируя fovx, fovy. Правда в самой матрице не углы, пропорции frusum view. И движение камеры вдоль оси это не zoom, это просто приближение :)

#8
16:53, 8 дек. 2011

Tolanay
> Масштабировать вид можно масштабируя fovx, fovy.
.L
> Т.е. получается надо просто fov делать меньше & zFar дальше.

#9
16:56, 8 дек. 2011

Tolanay
ты можешь двигать viewport да и всё

#10
17:00, 8 дек. 2011

L.
Все просто. Делается примерно так (direct3d):

Mproj._11 *= zoom;
MProj._22 *= zoom;
device->SetTransform(D3DTS_PROJECTION, &Mproj);

#11
17:09, 8 дек. 2011

L.
Как оказалось это очевидное и простое решение почему-то не работает. Точнее работает ограниченно. Нельзя задать viewport так, чтоб он выходил за пределы backbuffer. Отрицательные координаты верхнего левого угла структуры D3DVIEWPORT9 (а при увеличении и сдвиге они обязательно появятся) приводят к тому, что просто ничего не рисуется. Может я что-то не так делаю, или версия d3d старовата :)
Посмотрев матрицу проекции я нашел куда там можно было бы добавить смещение. И если d3d по честному умножает точку на эту матрицу все должно получиться, но почему-то не выходит каменный цветок. Работает совсем не так как ожидалось.

#12
17:15, 8 дек. 2011

Tolanay
> Нельзя задать viewport так, чтоб он выходил за пределы backbuffer.
конечно. Это я ляпнул не подумав )  При рендеринге юзается viewport для записи в задний буфер. Т.е. viewport-ом ты указываешь регион в заднем буфере куда нужно рендерить твою сцену.  Т.е. он тут вообще не решает и должен быть на весь экран.

пока кроме "отрендери всё в большую текстуру, выводи нужный её регион" в голову ничего не лезет. Надо подумать...

#13
17:34, 8 дек. 2011

L.
Нет, идею ты как раз предложил правильную :) И все было бы ок, если бы для нее существовала реализация средствами d3d. При масштабировании viewport растет, пока не достигнет размеров backbuffer. Дальше microsoft показывает фигу. А вот если бы они сделали так, чтобы сцена продолжала рисоваться в это viewport переросток, но с отсечением по краям backbuffer'а, то у нас была бы возможность и увеличивать и двигать увеличенную картинку.

Насчет большой текстуры. Я примерно так делал. Создавал RenderTarget и рисовал туда с помощью ID3DXRenderToSurface.
Создавать и рендерить в здоровенный surface, чтоб потом скопировать небольшой кусочек не комильфо. В принципе в моей задаче производительность не так важна, в разумных пределах конечно, и я бы мог на это пойти. Но тут всплыл еще странный момент - не удается создать RenderTarget с multisampling режимом. А это мне нужно :)

#14
18:40, 8 дек. 2011

Верный ответ в посте #1

Правка:
Понял, что надо. Смещения надо в матрице проекции ставить в (3,1) и (3,2) или (1,3) и (2,3) если по буржуйски. Я начинаю индексы с 1, если что. Возможно, еще на константы, связанные с шириной и высотой экрана надо домножить, разберешься.

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

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