Week5 [26/10]

Added the Z Access to the Matrix class
Added the Identity Matrix Method to the Matrix Class
Added MD2Loader Class
Added Model Class
Added Polygon Class
Added Clear Viewport Method to Rasterizer
Added Z Axis to the Vertex Class
Updated Transformation Matrices to pass a matrix back so that we can do the multiplication at once
This commit is contained in:
IDunnoDev
2021-12-11 13:24:09 +00:00
committed by iDunnoDev
parent 7c62126ede
commit 3b374c1e17
15 changed files with 432 additions and 52 deletions

View File

@ -7,58 +7,76 @@ Rasteriser app;
bool Rasteriser::Initialise()
{
//_vertexArray.push_back(Vertex(175, 175, 1));
//_vertexArray.push_back(Vertex(225, 175, 1));
//_vertexArray.push_back(Vertex(225, 225, 1));
//_vertexArray.push_back(Vertex(175, 225, 1));
//_initialVertexArray.push_back(Vertex(175, 175, 0, 1));
//_initialVertexArray.push_back(Vertex(225, 175, 0, 1));
//_initialVertexArray.push_back(Vertex(225, 225, 0, 1));
//_initialVertexArray.push_back(Vertex(175, 225, 0, 1));
_vertexArray.push_back(Vertex(150, 200, 1));
_vertexArray.push_back(Vertex(187.5f, 187.5f, 1));
_vertexArray.push_back(Vertex(200, 150, 1));
_vertexArray.push_back(Vertex(212.5f, 187.5f, 1));
_vertexArray.push_back(Vertex(250, 200, 1));
_vertexArray.push_back(Vertex(212.5f, 212.5f, 1));
_vertexArray.push_back(Vertex(200, 250, 1));
_vertexArray.push_back(Vertex(187.5, 212.5f, 1));
_initialVertexArray.push_back(Vertex(150, 200, 1));
_initialVertexArray.push_back(Vertex(187.5f, 187.5f, 1));
_initialVertexArray.push_back(Vertex(200, 150, 1));
_initialVertexArray.push_back(Vertex(212.5f, 187.5f, 1));
_initialVertexArray.push_back(Vertex(250, 200, 1));
_initialVertexArray.push_back(Vertex(212.5f, 212.5f, 1));
_initialVertexArray.push_back(Vertex(200, 250, 1));
_initialVertexArray.push_back(Vertex(187.5, 212.5f, 1));
_currentVertexArray = _initialVertexArray;
return true;
}
void Rasteriser::Update(const Bitmap& bitmap)
{
for (int i = 0; i < _vertexArray.size(); i++) {
_vertexArray[i] = Translate(_vertexArray[i], 2, 0);
_vertexArray[i] = Rotate(_vertexArray[i], 1);
_vertexArray[i] = Scale(_vertexArray[i], 1.001f, 1.001f);
{
int currentRot = (_rotation % 360);
for (int i = 0; i < _initialVertexArray.size(); i++) {
Matrix currentTransfomation = GetRotationMatrixFromPoint(Axis::Z, (float) currentRot, _initialVertexArray[0].GetX(), _initialVertexArray[0].GetY(), 0);
_currentVertexArray[i] = currentTransfomation * _initialVertexArray[i];
}
_rotation += 1;
}
void Rasteriser::Render(const Bitmap& bitmap)
{
bitmap.Clear(RGB(255, 255, 255));
ClearViewport(bitmap);
SelectObject(bitmap.GetDC(), GetStockObject(DC_BRUSH));
//DrawSquare(bitmap.GetDC(), _vertexArray);
DrawShape(bitmap.GetDC(), _vertexArray);
//DrawSquare(bitmap.GetDC(), _initialVertexArray);
DrawShape(bitmap.GetDC(), _currentVertexArray);
}
Vertex Rasteriser::Translate(const Vertex vertexIn, const float moveXBy, const float moveYBy)
void Rasteriser::ClearViewport(const Bitmap& bitmap)
{
bitmap.Clear(RGB(255, 255, 255));
}
Matrix Rasteriser::GetTranslateMatrix(const float x, const float y, const float z)
{
return Matrix({ 1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1 });
}
Matrix Rasteriser::GetScaleMatrix(const float x, const float y, const float z)
{
Matrix translationMatrix = Matrix({ 1, 0, moveXBy, 0, 1, moveYBy, 0, 0, 1 });
return translationMatrix * vertexIn;
return Matrix({ x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1 });
}
Vertex Rasteriser::Scale(const Vertex vertexIn, const float scaleXBy, const float scaleYBy)
Matrix Rasteriser::GetRotationMatrix(const Axis rotAxis, const float rotDegrees)
{
Matrix scaleFactorMatrix = Matrix({ scaleXBy, 0, 0, 0, scaleYBy, 0, 0, 0, 1 });
return scaleFactorMatrix * vertexIn;
float rotationRadian = DegreesToRadians(rotDegrees);
switch (rotAxis)
{
case (Axis::X):
return Matrix({ 1, 0, 0, 0, 0, cos(rotationRadian), -sin(rotationRadian), 0, 0, sin(rotationRadian), cos(rotationRadian), 0, 0, 0, 0, 1 });
case (Axis::Y):
return Matrix({ cos(rotationRadian), 0, sin(rotationRadian), 0, 0, 1, 0, 0, -sin(rotationRadian), 0, cos(rotationRadian), 0, 0, 0, 0, 1 });
default:
case (Axis::Z):
return Matrix({ cos(rotationRadian), -sin(rotationRadian), 0, 0, sin(rotationRadian), cos(rotationRadian), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 });
}
}
Vertex Rasteriser::Rotate(const Vertex vertexIn, const float rotationDegrees)
Matrix Rasteriser::GetRotationMatrixFromPoint(const Axis rotAxis, const float rotDegrees, const float x, const float y, const float z)
{
float rotationRadian = DegreesToRadians(rotationDegrees);
Matrix rotationFactorMatrix = Matrix({ cos(rotationRadian), -sin(rotationRadian), 0, sin(rotationRadian), cos(rotationRadian), 0, 0, 0, 1});
return rotationFactorMatrix * vertexIn;
return GetTranslateMatrix(x, y, z) * GetRotationMatrix(rotAxis, rotDegrees) * GetTranslateMatrix(-x, -y, -z);
}
float Rasteriser::DegreesToRadians(const float degrees)