Попробовал сделать перспективную проекцию по мотивам этого, но получается какая-то лажа: пирамида сплющивается.
Для матриц используется glm - такой порт glsl на С++, для создания окна - SDL, есть файл с проектом для QtCreator(просто привык к этой IDE, хотя здесь без Qt).
Матрица создается следующей функцией:
mat4 mPerspective(float ratio, float zNear, float zFar, float fov)
{
const float f = 1.0f/tan(radians(fov)/2.0f);
mat4 mat = mat4(1.0f);
mat[0][0]=f/ratio;
mat[1][1]=f;
mat[2][2]=(zFar+zNear)/(zFar-zNear);
mat[2][3]=(2.0f*zFar*zNear)/(zNear-zFar);
mat[3][2]=1.0f;
mat[3][3]=0.0f;
return mat;
}
После всех инициализаций, каждый кадр с матрицей модели происходит следующее:
void initWindow()
{
//...
pers = mPerspective(ar,1.0f,100.0f,30.0f);
}
void drawScene()
{
//...
unifScale+=0.1f;
vec4 rotVec(0.3f,unifScale,0.3f,1.0f);
vec4 trVec(0.0f,0.0f,15.0f,1.0f);
vec4 scVec(0.1f);
tr = mat4(1.0f);
tr = mScale(scVec,tr);
tr = mRotate(rotVec,tr);
tr = mTransform(trVec,tr);
tr*=pers;
//...
}