Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: DirectX: Как правильно создавать матрицы проекции и вида?  (Прочитано 21707 раз)
0 Пользователей и 1 Гость смотрят эту тему.
jur
Помогающий

lt
Offline Offline

« : 18-09-2008 17:46 » 

Привет!

Я так понял, что матрицы проекции и вида - это "штука конисская" :-)

Расскажу, что мне непонятно. В своем проекте я оперирую данными, которые представляют собой лучи длиной ровно 512 точек. Я их закладываю в текстуру, которая отображается на прямоугольнике. Высота прямоугольника ровно 512 пикселей, а ширина может варьироваться. Рендеринг осуществляется в квадратное окно размером 512 на 512 пикселей. Половину угла перспективы, в отличие от повсеместно приводимого бессмертного D3DX_PI / 4, я устанавливаю порядка 11 с лишним градусов, иначе проекция безобразно искажается (естественно). Матрицу перспективы я вычисляю вот так:

Код:
  angle = D3DX_PI / 16;  // Half of 22.5 deg
  // Use D3DX to create a left handed cartesian Field Of View transform
  D3DXMatrixPerspectiveFovLH( &mProj, angle, 1.0f, 1.0f, 1000.0f );

А затем рассчитываю матрицу вида исходя из того факта, что у меня размер окна вывода 512 пикселей:

Код:
  dist = FLOAT((512.0/2.0) / tan(angle/2.0));
  // Use D3DX to create a Look At matrix from eye, lookat and up vectors
  D3DXMatrixLookAtLH(
    &mView,                           // D3DXMATRIX * pOut
    &D3DXVECTOR3(0.0f, 0.0f, -dist),  // CONST D3DXVECTOR3 * pEye
    &D3DXVECTOR3(0.0f, 0.0f, 0.0f),   // CONST D3DXVECTOR3 * pAt
    &D3DXVECTOR3(0.0f, 1.0f, 0.0f));  // CONST D3DXVECTOR3 * pUp

Однако, в этом случае возникают искажения рендеринга: неправильно показываются следующие друг за другом прямоугольники (пример искажения можно посмотреть здесь). Если же уменьшить значение Y в пикселях (как в примере: с 445.0f до 44.50f, т.е. просто в 10 раз), то искажения пропадают.

Что бы это значило и почему такое происходит?

Как правильно выбирать размерность координат своих объектов? Сейчас я задаю вершинные координаты по Y в диапазоне от -255.5f до 255.5f (т.е. из расчета, что окно по вертикали 512 пикселов). По-видимому следует оперировать числами от -1.0f до 1.0f? А почему?
Записан

MPEG-4 - в массы!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 18-09-2008 17:55 » 

(как предположение с возможностью натолкнуть на мысль Улыбаюсь ) : может где то задаётся размер мира, и при пересечении полигона с плоскостью границы, видюха делает "перенос" - то есть отражает (или просто переносит линейно) полигон ?
Записан

jur
Помогающий

lt
Offline Offline

« Ответ #2 : 18-09-2008 19:32 » 

(как предположение с возможностью натолкнуть на мысль :) )

Большое спасибо на добром слове! :-) Очень бы хотелось натолкнуться на какую-нить мысль...

может где то задаётся размер мира, и при пересечении полигона с плоскостью границы, видюха делает "перенос" - то есть отражает (или просто переносит линейно) полигон ?

Увы... Там размер Мира - простой как дверь: сначала Identity, потом повороты (если есть) и все. Так вот, при повороте по оси Y эта фигня и вылезает...

И, черт подери!, пропадает, если размеры уменьшить в 10 раз... Почему?! Ведь и при Y = 445.0f значения чисел в матрицах вполне адекватные, переполнений не происходит. Так какого ...?...
Записан

MPEG-4 - в массы!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 18-09-2008 19:40 » 

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

зы Мечта - найти время тоже поразбираться с 3D Улыбаюсь. Пока никак всё
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 18-09-2008 19:49 » 

а вот ещё: в теме по ссылке есть
Код:
if(angle_Y >= 360) angle_Y = 0;
по идее, надо так

Код:
angle_Y%=360;

может тут искажение то
Записан

jur
Помогающий

lt
Offline Offline

« Ответ #5 : 18-09-2008 19:52 » 

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

Совершенно верно! У меня тоже что-то похожее в мозгах возникает... Но, спрашивается, почему?! Почему корежится?! Ладно бы я взял размерность в десятки или сотни тысяч единиц. Так ведь нет, простые несколько сотен...

зы Мечта - найти время тоже поразбираться с 3D :). Пока никак всё

// OFFTOPIC ON

Это точно, коллега! Я тоже относительно недавно (пару-тройку лет всего, на ремесленническом уровне) занимаюсь Direct3D. До этого пользовал DirectDraw, пока не понадобилось трехмерности. Причем, в прикладных целях, а не в глубИнных. Наверное поэтому у меня и трудности возникают... А с другой стороны, а в этих матрицах - хуже, чем свинья в апельсинах... ;-)

// OFFTOPIC OFF

а вот ещё: в теме по ссылке есть
Код:
if(angle_Y >= 360) angle_Y = 0;
по идее, надо так

Код:
angle_Y%=360;

может тут искажение то

Не-а. Искажение возникает пока угол поворота еще далек от 360 градусов. Всего несколько десятков. Да и без разницы, как ограничивать угол-то :-) Ведь это то же самое, что "if(angle_Y >= 360) angle_Y = 0;", что "angle_Y%=360;". Все равно угол всегда будет в диапазоне 0 - 359 градусов.
« Последнее редактирование: 18-09-2008 19:56 от jur » Записан

MPEG-4 - в массы!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 18-09-2008 20:01 » 

к углу всегда можно спокойно прибавить/отнять 360 (или 2пи , если в радианах). А у тебя станет, скажем, 370 и после коррекции вместо правильных 10 будет 0.

а по теме - не знаю, что сказать...
Записан

jur
Помогающий

lt
Offline Offline

« Ответ #7 : 18-09-2008 20:14 » 

к углу всегда можно спокойно прибавить/отнять 360 (или 2пи , если в радианах). А у тебя станет, скажем, 370 и после коррекции вместо правильных 10 будет 0.

Совершенно справедливо. Я так написал для простоты, потому что в цикле прибавляю по одному градусу :-) Поэтому после 359 будет именно 360, а не что-то другое.

а по теме - не знаю, что сказать...

Я так полагаю, коллега, что когда твоя мечта осуществится, и найдется время поразбираться с 3D, обсуждаемая нынче тема будет весьма кстати :-)
Записан

MPEG-4 - в массы!
jur
Помогающий

lt
Offline Offline

« Ответ #8 : 20-09-2008 15:25 » 

Черт его знает... Начал подозревать буфер глубины...

Хочу спросить: какие размерности для объектов вы применяете? (В смысле, в диапазоне -1 1, -10 10, -100 100 и т.п.)
Записан

MPEG-4 - в массы!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 20-09-2008 16:06 » 

jur, а какая размерность у z-буфера? Может действительно ты вышел за пределы...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
jur
Помогающий

lt
Offline Offline

« Ответ #10 : 26-09-2008 04:33 » 

RXL, формат буфера 16 бит. Может действительно вышел... Большое спасибо за подсказку! Попытаюсь каким-то образом это выяснить.
Записан

MPEG-4 - в массы!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines