Directx 3d почему переворачивается матрица просмотра экрана

[Решено] Всё вверх ногами (DirectX 11)

В общем такая проблема. Вроде делаю всё правильно, но правильно не работает.
Если рисую тупо без трансформаций, то всё нормально, но когда применяю трансформации, то всё вверх ногами.
Код камеры:

На выходе вот (две модели из .obj файла) (как включить глубину так и не понял. Вроде включил, но ничего не работает):
Изображение

Что я делаю не так?

output.position = mul(input.position, objMat);
output.position = mul(output.position, worldMat);
output.position = mul(output.position, viewMat);
output.position = mul(output.position, projMat);

Обычно хватает :

output.position = mul(output.position, worldMat);
output.position = mul(output.position, viewMat);
output.position = mul(output.position, projMat);

Или вообще одной матрицы общей(посчитанной на CPU).

output.position = mul(output.position, worldViewProj);

ronniko
> Обычно хватает :
Без матрицы модели ничего не трансформируется :/

Directx 3d почему переворачивается матрица просмотра экрана

1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе — 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь! .

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ — "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.

Определение положения в матрице просмотра Direct3D при постоянном движении камеры

В моем приложении Direct3D камеру можно перемещать с помощью мыши или клавиш со стрелками. Но если я жестко запрограммировал (0,1,0) в качестве вектора направления вверх в LookAtLH , кадр станет пустым при некоторых ориентациях камеры.

Я только что на собственном опыте узнал, что при взгляде по оси Y (0,1,0) больше не работает как направление вверх (кажется очевидным?). Я подумываю переключить свое направление на что-то другое для каждого из этих особых случаев. Есть ли более изящный способ справиться с этим?

3 метода стилизации элементов HTML

Формы c голосовым вводом в React с помощью Speechly

Flatpickr: простой модуль календаря для вашего приложения на React

Что такое cURL в PHP? Встроенные функции и пример GET запроса

Ответы 2

Предполагая, что вы можете вычислить вектор, указывающий вперед (то, на что вы смотрите — ваше положение), и вектор, указывающий вправо (всегда в плоскости XZ, если вы не можете катиться). Нормализуйте оба этих вектора, затем вверх — вперед x вправо (где x — это перекрестное произведение).

В общем, вы можете подключить свои рыскание, тангаж и крен в матрицу вращения и вращать векторы осей, чтобы двигаться вправо, вверх и вперед, но я думаю, это то, чего вы используете LookAtLH, чтобы избежать.

Изящный способ справиться с этим — использовать Unit Quaternions. Кватернион — это вектор из 4 значений, который кодирует ориентацию в трехмерном пространстве (а не поворот, как утверждают некоторые статьи), а единичный кватернион — это тот, в котором длина вектора sqrt (x ^ 2 + y ^ 2 + z ^ 2 + w ^ 2) составляет 1,0. Существует набор математических операций для работы с кватернионами, аналогичных использованию матриц для кодирования поворотов, с дополнительным бонусом, заключающимся в том, что кватернионы никогда не могут представлять вырожденную ориентацию. Вы можете свободно конвертировать кватернионы в матрицу 3×3 или 4×4, когда вам нужно передать результат в графический процессор.

Ваша проблема в том, что, перемещая камеру, вы немного повернете камеру вверх. Заставляя камеру повторно центрироваться по вектору (0,1,0) на каждой итерации, вы фактически поворачиваете камеру, а затем фиксируете ориентацию камеры, чтобы она оставалась на поверхности сферы, но когда ваша камера попадает в На полюсе этой сферы нет хорошего направления для вызова «вверх», и ваша матрица становится сингулярной и дает вам многоугольники нулевого размера (отсюда черный экран). Кватернионы имеют возможность интерполировать через эти полюса и выходить с другой стороны без проблем, оставляя вас всегда с действующей матрицей. все, что вам нужно сделать, это контролировать «поворот».

Чтобы измерить это скручивание, вам следует прочитать статью Кена Шумейка «Снижение скручивания пучка волокон» в книге «Самоцветы графики» 4. Он показывает хороший способ измерения накопленного скручивания и того, как его убрать, когда это оскорбительно.

Решение, которое я использую в настоящее время, таково: i) изначально определить как (0,1,0) или что-то подходящее и сохранить это в векторе ii) когда пользователь изменяет ориентацию камеры, соответственно повернуть сохраненный вектор и установить его как новый вектор

Матрица просмотра в DirectX 11 – странные преобразования

Я пишу плагин визуализации для 3ds max, основанный на DirectX 11.

Я получаю фактическую матрицу видового экрана от 3ds max, которая после инвертирования выглядит: [Rx Ry Rz] [Ux Uy Uz] [Dx Dy Dz] [Px Py Pz]

  • где R – правое, U для Up, D id direction и P – Position.

Я применяю эту матрицу представлений к DirectX (я основываюсь на rastertek tutorials: http://www.rastertek.com/dx11tut04.html), но вместо создания самой матрицы просмотра я использую эту матрицу вида из 3ds max, которая имеет в основном та же структура: [Rx Ry Rz 0] [Ux Uy Uz 0] [Dx Dy Dz 0] [Px Py Pz 1]

Сначала все выглядит нормально, потому что представление в max viewport и визуализированное представление в окне DirectX выглядят почти одинаково. Но преобразования в окне просмотра max и DirectX не совпадают. Кажется, что: когда я перемещаю позицию камеры в макс, цель камеры в DirectX движется вместо этого, и когда я перемещаю цель камеры (или вращающуюся камеру), максимальная позиция камеры в DirectX перемещается.

спасибо за помощь… Я не могу понять это в течение 3 дней…

Я финналы нашел решение…

Во-первых, я взял Up, Direction and Position из матрицы 3ds max и вручную создал матрицу вида, но используя D3DXMatrixLookAtRH и D3DXMatrixPerspectiveFovRH (для матрицы прогноза) вместо D3DXMatrixPerspectiveFovLH и D3DXMatrixLookAtLH, которые решили большинство проблем…

Затем я заметил, что матрица 3ds max не обновляется во время панорамирования камеры (обновлено только положение), поэтому для просмотра векторной матрицы просмотра я использовал “положение-направление”…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *