Matrix and Vector classes/templates
from programming assignment 2
and your 2-D rasterizer from
programming assignment 3
in a rudimentary 3-D rasterizer. Specifically, you must write
some utility functions for working with triangular meshes
and a Rasterizer3D class that can render wireframes.
This assignment is about 3-D computer graphics. The only new
aspect of C++ that you need to use is a list.
#include them
from the appropriate directory/folder.
struct that encapsulates a triangle
has already been created for you. It should be self-explanatory.
Triangle ( Header )
meshUtilities and
Rasterizer3D class are available on-line:
meshUtilities ( Header , Implementation )
Rasterizer3D ( Header )
Rasterizer3D object will need to construct and
use (and then destruct) a Rasterizer2D object.
drawTriangle method in the Rasterizer2D
class must be passed a 2x3 matrix. The triangular mesh contains
4x3 triangles. So, they will need to be pre-multiplied by a
2x4 matrix before being passed. (You should be able to figure
out what the 2x4 matrix must look like.)
The output from these tests should look like the following (when not rotated):
Your driver should be something like the following:
#define PI 3.14159265358979323846
Color GRAY = {102,102,102};
Color WHITE = {255,255,255};
Color YELLOW = {255,255,0};
int view;
list<Triangle*> triangles;
Rasterizer3D* rasterizer;
int main(int argc, char* argv[])
{
FrameBuffer* frameBuffer;
GraphicsWindow* window;
int depth, height, width;
view = 0;
width = 801;
height = 801;
depth = 801;
window = new GraphicsWindow(width, height);
frameBuffer = window->getFrameBuffer();
rasterizer = new Rasterizer3D(frameBuffer);
// Read and scale the triangular mesh
// (In an IDE you may need to hard-code the path to the file)
if (argc == 1) read("teapot.txt", triangles);
else read(argv[1], triangles);
scaleAndTranslate(triangles, width, height, depth);
// Setup the rasterizer
rasterizer->useTrimetricView(-view*(PI/4.0),0.0);
rasterizer->clear(GRAY);
// Draw the triangles
rasterizer->draw(triangles);
frameBuffer->show();
// Delete the triangles pointed to by the elements of the list
for (list<Triangle*>::iterator i=triangles.begin(); i!=triangles.end(); i++)
{
delete (*i);
}
delete rasterizer;
delete window; // The window will delete the FrameBuffer
}
Remember to test different projections and different rotations.
Copyright 2014