Добавим Экранную матрицу.
Загрузить архив с примерами ЗДЕСЬ.
Что делает экранная матрица. Если раньше мы писали такой код:
for ( int i = 0; i < 8; i++ ) { matrix4x4 m = Mat4x4_Mat4x4_Mul(mxRotateX, mxRotateY); vertex v = Vec3_Mat4x4_Mul(vert_buff[i], m); v.z = v.z + 15.0f; v.x = v.x / v.z; v.y = v.y / v.z; v.x = v.x / ((float)rc.right / (float)rc.bottom); //обратите внимание на этот момент //преобразование в экранные координаты v.x = v.x * rc.right / 2.0f + rc.right / 2.0f; v.y =-v.y * rc.bottom / 2.0f + rc.bottom / 2.0f; vert_buff_res[i] = v; }
То теперь мы его заменили на такой код преобразования в экранные координаты:
float alpha = (0.5f*m_nViewWidth); float beta = (0.5f*m_nViewHeight); matrix4x4 mScreen = { alpha, 0, 0, 0, 0, -beta, 0, 0, 0, 0, 1, 0, alpha, beta, 0, 1}; for (UINT i = 0; i < m_nVertCount; i++) { vector3 v; matrix4x4 t; t = Mat4x4_Mat4x4_Mul(mxRotateX, mxRotateY); t = Mat4x4_Mat4x4_Mul(t, mxRotateZ); t = Mat4x4_Mat4x4_Mul(t, mWorld); t = Mat4x4_Mat4x4_Mul(t, mView); t = Mat4x4_Mat4x4_Mul(t, mProj); v = Vec3_Mat4x4_Mul(t, m_vert_buff[i]); v.x = v.x / v.z; v.y = v.y / v.z; //преобразование в экранные координаты //умножение вершины на экранную матрицу v = Vec3_Mat4x4_Mul(mScreen, v); m_vert_buff_transformed[i] = v; }
Как видите все как раньше- умножение вершин на матрицы, деление на Z, а потом умножение на экранную матрицу, вместо преобразования в экранные координаты.
Загрузить проект /src/01.001-soft_rend_main/Cube_RotateY_mxScreen.