Добавим Экранную матрицу.

Загрузить архив с примерами ЗДЕСЬ.

Что делает экранная матрица. Если раньше мы писали такой код:


	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.