Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164

Direct3D растянуть меш на весь экран

06.01.2017, 13:09. Показов 1789. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

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

Программирую на C++, использую DirectX 11 (Direct3D) API. Есть некоторое видео, которое должно отображаться на весь экран, видео накладывается на текстуру меша.

У меня есть только лишь одна модель (меш/сетка), которая создается процедурным путем, состоит из четырех точек, можно сказать, прямоугольник. Разрешение экрана - 1920x1080, но иногда может быть и 1920x1200. В идеале мне нужно рассчитать значения так, чтобы при любых разрешениях меш растягивался на весь экран. То есть первая точка в левом верхнем углу, вторая точка справа вверху и так далее. Я в DirectX'е не новичок, но все равно не хватает математической базы, путаюсь в таких понятиях как "перспектива", "проекция" и все такое в этом духе.

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

Подскажите, как можно рассчитать координаты камеры, ее угол обзора, высоту и прочие значения, чтобы меш пиксель-в-пиксель перекрывал весь экран.

Вот вертексы меша:

C++
1
2
3
4
pVertices[0].Pos = XMFLOAT3(0.0f, 0.0f, 0.0f);                  pVertices[0].Tex = XMFLOAT2(0.0f, 0.0f);
pVertices[1].Pos = XMFLOAT3(meshMaxX, 0.0f, 0.0f);              pVertices[1].Tex = XMFLOAT2(0.0f, 0.0f);
pVertices[2].Pos = XMFLOAT3(meshMaxX, 0.0f, meshMaxY);          pVertices[2].Tex = XMFLOAT2(0.0f, 1.0f);
pVertices[3].Pos = XMFLOAT3(0.0f, 0.0f, meshMaxY);              pVertices[3].Tex = XMFLOAT2(0.0f, 1.0f);
А вот как настраивается камера:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
X = 19.215715f;
Y = 14.345325f;
Z = 4.789997f;
 
viewAngleX = -(XM_PIDIV2 + XM_PI);
viewAngleY = XM_PIDIV2;
 
__width = 1920;
__height = 1200;
 
ConstantBuffer cb;
const float ratio = static_cast<float>(__width) / static_cast<float>(__height);
CB->p = XMMatrixPerspectiveFovLH(XM_PIDIV4, ratio, 0.01f, 100.0f);
 
XMVECTOR eye = XMVectorSet(X, Y, Z, 0.0f);
XMVECTOR at = XMVectorSet(X + 1.0f * cos(viewAngleX), Y + 1.0f * sin(viewAngleY) / cos(viewAngleY), Z + 1.0f * sin(viewAngleX), 0.0f);
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
 
CB->v = XMMatrixLookAtLH(eye, at, up);
Заранее большое спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.01.2017, 13:09
Ответы с готовыми решениями:

Как растянуть меш в directx 9
У меня есть меш круга, как можно растянуть его в эллипс методами directx 9?

Растянуть на весь экран
Всем привет. Создаю небольшую игру-стрелялку. Раньше игры создавал с настройкой расширения экрана и кидал в папки очень много картинок...

Растянуть svg на весь экран
Привет. Подскажите, пожалуйста, как растянуть svg на весь экран и возможно ли это вообще. Например, есть svg как в приложении (truba.txt,...

3
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
06.01.2017, 21:53
Лучший ответ Сообщение было отмечено igor_petrov как решение

Решение

Попробуйте поменять:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//pVertices[0].Pos = XMFLOAT3(0.0f, 0.0f, 0.0f);                  pVertices[0].Tex = XMFLOAT2(0.0f, 0.0f);
//pVertices[1].Pos = XMFLOAT3(meshMaxX, 0.0f, 0.0f);              pVertices[1].Tex = XMFLOAT2(0.0f, 0.0f);
//pVertices[2].Pos = XMFLOAT3(meshMaxX, 0.0f, meshMaxY);          pVertices[2].Tex = XMFLOAT2(0.0f, 1.0f);
//pVertices[3].Pos = XMFLOAT3(0.0f, 0.0f, meshMaxY);              pVertices[3].Tex = XMFLOAT2(0.0f, 1.0f); 
pVertices[0].Pos = XMFLOAT3(-0.5f, -0.5f, 0.0f);   pVertices[0].Tex = XMFLOAT2(0.0f, 1.0f);
pVertices[1].Pos = XMFLOAT3(0.5f, -0.5f, 0.0f);    pVertices[1].Tex = XMFLOAT2(1.0f, 1.0f);
pVertices[2].Pos = XMFLOAT3(0.5f, 0.5f, 0.0f);     pVertices[2].Tex = XMFLOAT2(1.0f, 0.0f);
pVertices[3].Pos = XMFLOAT3(-0.5f, 0.5f, 0.0f);    pVertices[3].Tex = XMFLOAT2(0.0f, 0.0f);
 
//CB->p = XMMatrixPerspectiveFovLH(XM_PIDIV4, ratio, 0.01f, 100.0f);
CB->p = XMMatrixOrthographicLH(1.0f, 1.0f, 0.01f, 100.0f);
 
//XMVECTOR eye = XMVectorSet(X, Y, Z, 0.0f);
XMVECTOR eye = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);
 
//XMVECTOR at = ...
XMVECTOR at = XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f);
1
 Аватар для Kabak
159 / 145 / 14
Регистрация: 03.02.2012
Сообщений: 788
Записей в блоге: 1
07.01.2017, 12:09
В чём проблема ? все 4-е точки ставите в координаты углов экрана и просто указываете шейдеру текстуру от 0 до 1 - всю. она натянется между 4-мя вашими точками = на весь экран. Если они у вас по углам расположены.
1
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
08.01.2017, 12:14  [ТС]
Все работает! Огромное спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2017, 12:14
Помогаю со студенческими работами здесь

Растянуть на весь экран линию hr
Нужно растянуть на весь экран линию hr, поставил свойство position: relative и ширину 100%, а не хочет, растягивается максимум до предела...

Растянуть форму на весь экран
Здравствуйте! Скажите как можно растянуть форму на весь экран. Только поймите меня правильно я не имею ввиду свойство формы Windows State...

Растянуть видео на весь экран
Как принудительно растянуть videoview на весь экран?

Растянуть изображение на весь экран
1) Как в проект загрузить изображение? 2) Как весь фон заполнить 1 картинкой и по верх него работать? Т.е растянуть ее на весь экран.

Растянуть блок на весь экран
Добрый день ув. пользователи! Подскажите пожалуйста, как сделать что бы &lt;div&gt; в котором лежит &lt;ul&gt; &lt;li&gt; &lt;a...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru