-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2 from Hinageshi01/main
Upload assignment2.
- Loading branch information
Showing
7 changed files
with
499 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
// | ||
// Created by LEI XU on 4/11/19. | ||
// | ||
|
||
#include "Triangle.hpp" | ||
#include <algorithm> | ||
#include <array> | ||
|
||
|
||
Triangle::Triangle() { | ||
v[0] << 0,0,0; | ||
v[1] << 0,0,0; | ||
v[2] << 0,0,0; | ||
|
||
color[0] << 0.0, 0.0, 0.0; | ||
color[1] << 0.0, 0.0, 0.0; | ||
color[2] << 0.0, 0.0, 0.0; | ||
|
||
tex_coords[0] << 0.0, 0.0; | ||
tex_coords[1] << 0.0, 0.0; | ||
tex_coords[2] << 0.0, 0.0; | ||
} | ||
|
||
void Triangle::setVertex(int ind, Vector3f ver){ | ||
v[ind] = ver; | ||
} | ||
void Triangle::setNormal(int ind, Vector3f n){ | ||
normal[ind] = n; | ||
} | ||
void Triangle::setColor(int ind, float r, float g, float b) { | ||
if((r<0.0) || (r>255.) || | ||
(g<0.0) || (g>255.) || | ||
(b<0.0) || (b>255.)) { | ||
fprintf(stderr, "ERROR! Invalid color values"); | ||
fflush(stderr); | ||
exit(-1); | ||
} | ||
|
||
color[ind] = Vector3f((float)r/255.,(float)g/255.,(float)b/255.); | ||
return; | ||
} | ||
void Triangle::setTexCoord(int ind, float s, float t) { | ||
tex_coords[ind] = Vector2f(s,t); | ||
} | ||
|
||
std::array<Vector4f, 3> Triangle::toVector4() const | ||
{ | ||
std::array<Eigen::Vector4f, 3> res; | ||
std::transform(std::begin(v), std::end(v), res.begin(), [](auto& vec) { return Eigen::Vector4f(vec.x(), vec.y(), vec.z(), 1.f); }); | ||
return res; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// | ||
// Created by LEI XU on 4/11/19. | ||
// | ||
|
||
#ifndef RASTERIZER_TRIANGLE_H | ||
#define RASTERIZER_TRIANGLE_H | ||
|
||
#include <eigen3/Eigen/Eigen> | ||
|
||
|
||
using namespace Eigen; | ||
class Triangle{ | ||
|
||
public: | ||
Vector3f v[3]; /*the original coordinates of the triangle, v0, v1, v2 in counter clockwise order*/ | ||
/*Per vertex values*/ | ||
Vector3f color[3]; //color at each vertex; | ||
Vector2f tex_coords[3]; //texture u,v | ||
Vector3f normal[3]; //normal vector for each vertex | ||
|
||
//Texture *tex; | ||
Triangle(); | ||
|
||
void setVertex(int ind, Vector3f ver); /*set i-th vertex coordinates */ | ||
void setNormal(int ind, Vector3f n); /*set i-th vertex normal vector*/ | ||
void setColor(int ind, float r, float g, float b); /*set i-th vertex color*/ | ||
Vector3f getColor() const { return color[0]*255; } // Only one color per triangle. | ||
void setTexCoord(int ind, float s, float t); /*set i-th vertex texture coordinate*/ | ||
std::array<Vector4f, 3> toVector4() const; | ||
}; | ||
|
||
|
||
|
||
|
||
|
||
|
||
#endif //RASTERIZER_TRIANGLE_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
// | ||
// Created by LEI XU on 4/9/19. | ||
// | ||
|
||
#ifndef RASTERIZER_GLOBAL_H | ||
#define RASTERIZER_GLOBAL_H | ||
|
||
//#define MY_PI 3.1415926 | ||
//#define TWO_PI (2.0* MY_PI) | ||
|
||
|
||
#endif //RASTERIZER_GLOBAL_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
// clang-format off | ||
#include <iostream> | ||
#include <opencv2/opencv.hpp> | ||
#include "rasterizer.hpp" | ||
#include "global.hpp" | ||
#include "Triangle.hpp" | ||
|
||
constexpr double MY_PI = 3.1415926; | ||
|
||
Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos) | ||
{ | ||
Eigen::Matrix4f view = Eigen::Matrix4f::Identity(); | ||
|
||
Eigen::Matrix4f translate; | ||
translate << 1,0,0,-eye_pos[0], | ||
0,1,0,-eye_pos[1], | ||
0,0,1,-eye_pos[2], | ||
0,0,0,1; | ||
|
||
view = translate*view; | ||
|
||
return view; | ||
} | ||
|
||
Eigen::Matrix4f get_model_matrix(float rotation_angle) | ||
{ | ||
Eigen::Matrix4f model = Eigen::Matrix4f::Identity(); | ||
return model; | ||
} | ||
|
||
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar) | ||
{ | ||
// TODO: Copy-paste your implementation from the previous assignment. | ||
Eigen::Matrix4f projection; | ||
|
||
return projection; | ||
} | ||
|
||
int main(int argc, const char** argv) | ||
{ | ||
float angle = 0; | ||
bool command_line = false; | ||
std::string filename = "output.png"; | ||
|
||
if (argc == 2) | ||
{ | ||
command_line = true; | ||
filename = std::string(argv[1]); | ||
} | ||
|
||
rst::rasterizer r(700, 700); | ||
|
||
Eigen::Vector3f eye_pos = {0,0,5}; | ||
|
||
|
||
std::vector<Eigen::Vector3f> pos | ||
{ | ||
{2, 0, -2}, | ||
{0, 2, -2}, | ||
{-2, 0, -2}, | ||
{3.5, -1, -5}, | ||
{2.5, 1.5, -5}, | ||
{-1, 0.5, -5} | ||
}; | ||
|
||
std::vector<Eigen::Vector3i> ind | ||
{ | ||
{0, 1, 2}, | ||
{3, 4, 5} | ||
}; | ||
|
||
std::vector<Eigen::Vector3f> cols | ||
{ | ||
{217.0, 238.0, 185.0}, | ||
{217.0, 238.0, 185.0}, | ||
{217.0, 238.0, 185.0}, | ||
{185.0, 217.0, 238.0}, | ||
{185.0, 217.0, 238.0}, | ||
{185.0, 217.0, 238.0} | ||
}; | ||
|
||
auto pos_id = r.load_positions(pos); | ||
auto ind_id = r.load_indices(ind); | ||
auto col_id = r.load_colors(cols); | ||
|
||
int key = 0; | ||
int frame_count = 0; | ||
|
||
if (command_line) | ||
{ | ||
r.clear(rst::Buffers::Color | rst::Buffers::Depth); | ||
|
||
r.set_model(get_model_matrix(angle)); | ||
r.set_view(get_view_matrix(eye_pos)); | ||
r.set_projection(get_projection_matrix(45, 1, 0.1, 50)); | ||
|
||
r.draw(pos_id, ind_id, col_id, rst::Primitive::Triangle); | ||
cv::Mat image(700, 700, CV_32FC3, r.frame_buffer().data()); | ||
image.convertTo(image, CV_8UC3, 1.0f); | ||
cv::cvtColor(image, image, cv::COLOR_RGB2BGR); | ||
|
||
cv::imwrite(filename, image); | ||
|
||
return 0; | ||
} | ||
|
||
while(key != 27) | ||
{ | ||
r.clear(rst::Buffers::Color | rst::Buffers::Depth); | ||
|
||
r.set_model(get_model_matrix(angle)); | ||
r.set_view(get_view_matrix(eye_pos)); | ||
r.set_projection(get_projection_matrix(45, 1, 0.1, 50)); | ||
|
||
r.draw(pos_id, ind_id, col_id, rst::Primitive::Triangle); | ||
|
||
cv::Mat image(700, 700, CV_32FC3, r.frame_buffer().data()); | ||
image.convertTo(image, CV_8UC3, 1.0f); | ||
cv::cvtColor(image, image, cv::COLOR_RGB2BGR); | ||
cv::imshow("image", image); | ||
key = cv::waitKey(10); | ||
|
||
std::cout << "frame count: " << frame_count++ << '\n'; | ||
} | ||
|
||
return 0; | ||
} | ||
// clang-format on |
Oops, something went wrong.