Vector3d nearC(0,0,0 -w);
Vector3d farC(0,0,0-x);
double width = y/2;
double height = z/2;
double angleOfHeight = atan(height/w);
double angleOfWidth = atan(width/w);
double adjustedHeight = tan(angleOfHeight) * x;
double adjustedWidth = tan(angleOfWidth) * x;
nearC[0] - width, nearC[1] - height, nearC[2]
nearC[0] - width, nearC[1] + height, nearC[2]
nearC[0] + width, nearC[1] + height, nearC[2]
nearC[0] + width, nearC[1] - height, nearC[2]
farC[0] - adjustedWidth, farC[1] - adjustedHeight, farC[2]
farC[0] - adjustedWidth, farC[1] + adjustedHeight, farC[2]
farC[0] + adjustedWidth, farC[1] + adjustedHeight, farC[2]
farC[0] + adjustedWidth, farC[1] - adjustedHeight, farC[2]
Выше моя усеченная пирамида в координатах обзора. Матрица просмотра:
0 0 -1 0
0 1 0 -1
1 0 0 -10
0 0 0 1
Все правильно, у нас есть лист.
Да хоть убей я не могу понять, как получить эту усеченную пирамиду в каноническом объеме просмотра. Я просмотрел все перспективные проекции, которые смог найти. Текущий следующий:
s, 0, 0, 0,
0, s, 0, 0,
0, 0, -(f+ne)/(f-ne), 2*f*ne/(f-ne),
0, 0, 1, 0;
double s = 1 / tan (angleOfView * 0.5 * M_PI / 180);
Мне не хватает шага или чего-то, верно? Или несколько шагов?
Извини за то, что сейчас звучит так безнадежно, какое-то время крутит колеса над этим.
Любая помощь приветствуется.