Opracowuję prosty silnik 3D (bez użycia API), z powodzeniem zmieniłem moją scenę w świat i wyświetlam przestrzeń, ale mam problem z rzutowaniem mojej sceny (z przestrzeni widoku) za pomocą perspektywy macierz projekcji (styl OpenGL). Nie jestem pewien co do wartości fov, bliskich i dalekich, a scena, którą widzę, jest zniekształcona. Mam nadzieję, że jeśli ktoś może skierowad mnie, jak poprawnie zbudować i wykorzystać matrycę projekcji perspektywicznej za pomocą przykładowych kodów. Z góry dziękuję za pomoc.Jak zbudować matrycę z rzutowaniem perspektywicznym (bez interfejsu API)
Powstawanie matrix
double f = 1/Math.Tan(fovy/2);
return new double[,] {
{ f/Aspect, 0, 0, 0 },
{ 0, f, 0, 0 },
{ 0, 0, (Far + Near)/(Near - Far), (2 * Far * Near)/(Near - Far) },
{ 0, 0, -1, 0 }
};
Zastosowanie matrycy:
foreach (Point P in T.Points)
{
.
. // Transforming the point to homogen point matrix, to world space, and to view space (works fine)
.
// projecting the point with getProjectionMatrix() specified in the previous code :
double[,] matrix = MatrixMultiply(GetProjectionMatrix(Fovy, Width/Height, Near, Far) , viewSpacePointMatrix);
// translating to Cartesian coordinates (from homogen):
matrix [0, 0] /= matrix [3, 0];
matrix [1, 0] /= matrix [3, 0];
matrix [2, 0] /= matrix [3, 0];
matrix [3, 0] = 1;
P = MatrixToPoint(matrix);
// adjusting to the screen Y axis:
P.y = this.Height - P.y;
// Printing...
}
http://www.scratchapixel.com/lessons/3d-basic-rendering/perspektywa-i-ortograficzna-macierz-projekcja Polecam również poprzednie lekcje (rzutowanie punktów i oglądanie 3D). – user18490