Неправильное направление луча от обратной матрицы vp и положения камеры - PullRequest
0 голосов
/ 14 октября 2018

У меня проблема с генерацией лучей, которую я не понимаю.Направление для моего луча вычислено неправильно.Я перенес этот код из DirectX 11 в Vulkan, где он работает нормально, поэтому я был удивлен, что не смог заставить его работать:

vec4 farPos = inverseViewProj * vec4(screenPos, 1, 1);
farPos /= farPos.w;

r.Origin = camPos.xyz;
r.Direction = normalize(farPos.xyz - camPos.xyz); 

И все же этот код работает отлично:

vec4 nearPos = inverseViewProj * vec4(screenPos, 0, 1);
nearPos /= nearPos.w;
vec4 farPos = inverseViewProj * vec4(screenPos, 1, 1);
farPos /= farPos.w;

r.Origin = camPos.xyz;
r.Direction = normalize(farPos.xyz – nearPos.xyz);

[Правка] Матрица и положение камеры установлены следующим образом:

const glm::mat4 clip(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 1.0f);
projMatrix = clip * glm::perspectiveFov(FieldOfView, float(ViewWidth), float(ViewHeight), NearZ, FarZ);
viewMatrix = glm::inverse(glm::translate(glm::toMat4(Rotation), -Position));

buffer.inverseViewProjMatrix = glm::inverse(projMatrix * viewMatrix);
buffer.camPos = viewMatrix[3];

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

Я думаю, что я неправильно понимаю что-то базовое.Чего мне не хватает?

1 Ответ

0 голосов
/ 15 октября 2018

Благодаря комментариям я нашел проблему.Я неправильно строил свою матрицу вида, точно так же, как в этом посте :

glm::inverse(glm::translate(glm::toMat4(Rotation), -Position));

Это равносильно сначала переводу, а затем вращению, котороеконечно приводит к чему-то нежелательному.Кроме того, Position было отрицательным и camPos было получено с использованием последнего столбца матрицы просмотра вместо матрицы обратного просмотра, что неверно.

Это не было заметно с моим фрактальным Raycaster просто потому, чтоЯ никогда не уходил далеко от источника.Это и тот факт, что в такой среде нет точки отсчета.

...