Skip to content

Commit 939c869

Browse files
author
root
committed
add whole homework
1 parent 73bd66a commit 939c869

File tree

579 files changed

+254588
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

579 files changed

+254588
-0
lines changed
File renamed without changes.

Assignment1/Assignment1.pdf

320 KB
Binary file not shown.
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
cmake_minimum_required(VERSION 3.10)
2+
project(Rasterizer)
3+
4+
find_package(OpenCV REQUIRED)
5+
6+
set(CMAKE_CXX_STANDARD 17)
7+
8+
include_directories(/usr/local/include)
9+
10+
add_executable(Rasterizer main.cpp rasterizer.hpp rasterizer.cpp Triangle.hpp Triangle.cpp)
11+
target_link_libraries(Rasterizer ${OpenCV_LIBRARIES})

Assignment1/Assignment1/Triangle.cpp

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//
2+
// Created by LEI XU on 4/11/19.
3+
//
4+
5+
#include "Triangle.hpp"
6+
#include <algorithm>
7+
#include <array>
8+
#include <stdexcept>
9+
10+
Triangle::Triangle()
11+
{
12+
v[0] << 0, 0, 0;
13+
v[1] << 0, 0, 0;
14+
v[2] << 0, 0, 0;
15+
16+
color[0] << 0.0, 0.0, 0.0;
17+
color[1] << 0.0, 0.0, 0.0;
18+
color[2] << 0.0, 0.0, 0.0;
19+
20+
tex_coords[0] << 0.0, 0.0;
21+
tex_coords[1] << 0.0, 0.0;
22+
tex_coords[2] << 0.0, 0.0;
23+
}
24+
25+
void Triangle::setVertex(int ind, Eigen::Vector3f ver) { v[ind] = ver; }
26+
27+
void Triangle::setNormal(int ind, Vector3f n) { normal[ind] = n; }
28+
29+
void Triangle::setColor(int ind, float r, float g, float b)
30+
{
31+
if ((r < 0.0) || (r > 255.) || (g < 0.0) || (g > 255.) || (b < 0.0) ||
32+
(b > 255.)) {
33+
throw std::runtime_error("Invalid color values");
34+
}
35+
36+
color[ind] = Vector3f((float)r / 255., (float)g / 255., (float)b / 255.);
37+
return;
38+
}
39+
void Triangle::setTexCoord(int ind, float s, float t)
40+
{
41+
tex_coords[ind] = Vector2f(s, t);
42+
}
43+
44+
std::array<Vector4f, 3> Triangle::toVector4() const
45+
{
46+
std::array<Vector4f, 3> res;
47+
std::transform(std::begin(v), std::end(v), res.begin(), [](auto& vec) {
48+
return Vector4f(vec.x(), vec.y(), vec.z(), 1.f);
49+
});
50+
return res;
51+
}

Assignment1/Assignment1/Triangle.hpp

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//
2+
// Created by LEI XU on 4/11/19.
3+
//
4+
5+
#ifndef RASTERIZER_TRIANGLE_H
6+
#define RASTERIZER_TRIANGLE_H
7+
8+
#include <eigen3/Eigen/Eigen>
9+
10+
using namespace Eigen;
11+
class Triangle
12+
{
13+
public:
14+
Vector3f v[3]; /*the original coordinates of the triangle, v0, v1, v2 in
15+
counter clockwise order*/
16+
/*Per vertex values*/
17+
Vector3f color[3]; // color at each vertex;
18+
Vector2f tex_coords[3]; // texture u,v
19+
Vector3f normal[3]; // normal vector for each vertex
20+
21+
// Texture *tex;
22+
Triangle();
23+
24+
Eigen::Vector3f a() const { return v[0]; }
25+
Eigen::Vector3f b() const { return v[1]; }
26+
Eigen::Vector3f c() const { return v[2]; }
27+
28+
void setVertex(int ind, Vector3f ver); /*set i-th vertex coordinates */
29+
void setNormal(int ind, Vector3f n); /*set i-th vertex normal vector*/
30+
void setColor(int ind, float r, float g, float b); /*set i-th vertex color*/
31+
void setTexCoord(int ind, float s,
32+
float t); /*set i-th vertex texture coordinate*/
33+
std::array<Vector4f, 3> toVector4() const;
34+
};
35+
36+
#endif // RASTERIZER_TRIANGLE_H

Assignment1/Assignment1/main.cpp

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#include "Triangle.hpp"
2+
#include "rasterizer.hpp"
3+
#include <eigen3/Eigen/Eigen>
4+
#include <iostream>
5+
#include <opencv2/opencv.hpp>
6+
7+
constexpr double MY_PI = 3.1415926;
8+
9+
Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos)
10+
{
11+
Eigen::Matrix4f view = Eigen::Matrix4f::Identity();
12+
13+
Eigen::Matrix4f translate;
14+
translate << 1, 0, 0, -eye_pos[0], 0, 1, 0, -eye_pos[1], 0, 0, 1,
15+
-eye_pos[2], 0, 0, 0, 1;
16+
17+
view = translate * view;
18+
19+
return view;
20+
}
21+
22+
Eigen::Matrix4f get_model_matrix(float rotation_angle)
23+
{
24+
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
25+
26+
// TODO: Implement this function
27+
// Create the model matrix for rotating the triangle around the Z axis.
28+
// Then return it.
29+
30+
return model;
31+
}
32+
33+
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
34+
float zNear, float zFar)
35+
{
36+
// Students will implement this function
37+
38+
Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
39+
40+
// TODO: Implement this function
41+
// Create the projection matrix for the given parameters.
42+
// Then return it.
43+
44+
return projection;
45+
}
46+
47+
int main(int argc, const char** argv)
48+
{
49+
float angle = 0;
50+
bool command_line = false;
51+
std::string filename = "output.png";
52+
53+
if (argc >= 3) {
54+
command_line = true;
55+
angle = std::stof(argv[2]); // -r by default
56+
if (argc == 4) {
57+
filename = std::string(argv[3]);
58+
}
59+
}
60+
61+
rst::rasterizer r(700, 700);
62+
63+
Eigen::Vector3f eye_pos = {0, 0, 5};
64+
65+
std::vector<Eigen::Vector3f> pos{{2, 0, -2}, {0, 2, -2}, {-2, 0, -2}};
66+
67+
std::vector<Eigen::Vector3i> ind{{0, 1, 2}};
68+
69+
auto pos_id = r.load_positions(pos);
70+
auto ind_id = r.load_indices(ind);
71+
72+
int key = 0;
73+
int frame_count = 0;
74+
75+
if (command_line) {
76+
r.clear(rst::Buffers::Color | rst::Buffers::Depth);
77+
78+
r.set_model(get_model_matrix(angle));
79+
r.set_view(get_view_matrix(eye_pos));
80+
r.set_projection(get_projection_matrix(45, 1, 0.1, 50));
81+
82+
r.draw(pos_id, ind_id, rst::Primitive::Triangle);
83+
cv::Mat image(700, 700, CV_32FC3, r.frame_buffer().data());
84+
image.convertTo(image, CV_8UC3, 1.0f);
85+
86+
cv::imwrite(filename, image);
87+
88+
return 0;
89+
}
90+
91+
while (key != 27) {
92+
r.clear(rst::Buffers::Color | rst::Buffers::Depth);
93+
94+
r.set_model(get_model_matrix(angle));
95+
r.set_view(get_view_matrix(eye_pos));
96+
r.set_projection(get_projection_matrix(45, 1, 0.1, 50));
97+
98+
r.draw(pos_id, ind_id, rst::Primitive::Triangle);
99+
100+
cv::Mat image(700, 700, CV_32FC3, r.frame_buffer().data());
101+
image.convertTo(image, CV_8UC3, 1.0f);
102+
cv::imshow("image", image);
103+
key = cv::waitKey(10);
104+
105+
std::cout << "frame count: " << frame_count++ << '\n';
106+
107+
if (key == 'a') {
108+
angle += 10;
109+
}
110+
else if (key == 'd') {
111+
angle -= 10;
112+
}
113+
}
114+
115+
return 0;
116+
}

0 commit comments

Comments
 (0)