diff --git a/Skeleton.cpp b/Skeleton.cpp index 22b9db3ed4351cef9cb1fcf6f0a9e1ca5fab5354..44c178d6e4fefeee33133fc90131626b7f3fc82a 100644 --- a/Skeleton.cpp +++ b/Skeleton.cpp @@ -3,6 +3,45 @@ //============================================================================================= #include "framework.h" + +vec3 objPoints[20] = { + vec3(0, 0.618, 1.618), + vec3(0, -0.618, 1.618), + vec3(0, -0.618, -1.618), + vec3(0, 0.618, -1.618), + vec3(1.618, 0, 0.618), + vec3(-1.618, 0, 0.618), + vec3(-1.618, 0, -0.618), + vec3(1.618, 0, -0.618), + vec3(0.618, 1.618, 0), + vec3(-0.618, 1.618, 0), + vec3(-0.618, -1.618, 0), + vec3(0.618, -1.618, 0), + vec3(1, 1, 1), + vec3(-1, 1, 1), + vec3(-1, -1, 1), + vec3(1, -1, 1), + vec3(1, -1, -1), + vec3(1, 1, -1), + vec3(-1, 1, -1), + vec3(-1, -1, -1) +}; + +int objIndex[12][5]{ + {0, 1, 15, 4, 12}, + {0, 12, 8, 9, 13}, + {0, 13, 5, 14, 1}, + {1, 14, 10, 11, 15}, + {2, 3, 17, 7, 16}, + {2, 16, 11, 10, 19}, + {2, 19, 6, 18, 3}, + {18, 9, 8, 17, 3}, + {15, 11, 16, 7, 4}, + {4, 7, 17, 8, 12}, + {13, 9, 18, 6, 5}, + {5, 6, 19, 10, 14} +}; + struct Material { vec3 ka, kd, ks; float shininess; @@ -58,16 +97,20 @@ struct Sphere : public Intersectable { } }; -struct Triangle : public Intersectable { +struct Pentagon : public Intersectable { vec3 r1; vec3 r2; vec3 r3; + vec3 r4; + vec3 r5; Material* material; - Triangle(const vec3& _r1, const vec3& _r2, const vec3& _r3, Material* _material) { + Pentagon(const vec3& _r1, const vec3& _r2, const vec3& _r3, const vec3& _r4, const vec3& _r5, Material* _material) { r1 = _r1; r2 = _r2; r3 = _r3; + r4 = _r4; + r5 = _r5; material = _material; } @@ -85,7 +128,9 @@ struct Triangle : public Intersectable { if ( dot(cross(r2-r1, p-r1), n) > 0 && dot(cross(r3-r2, p-r2), n) > 0 && - dot(cross(r1-r3, p-r3), n) > 0 + dot(cross(r4-r3, p-r3), n) > 0 && + dot(cross(r5-r4, p-r4), n) > 0 && + dot(cross(r1-r5, p-r5), n) > 0 ){ hit.t = t; hit.normal = n; @@ -140,7 +185,7 @@ class Scene { vec3 La; public: void build() { - vec3 eye = vec3(0, 0, 2), vup = vec3(0, 1, 0), lookat = vec3(0, 0, 0); + vec3 eye = vec3(10, 0, 20), vup = vec3(0, 1, 0), lookat = vec3(0, 0, 0); float fov = 45 * M_PI / 180; camera.set(eye, lookat, vup, fov); @@ -152,7 +197,18 @@ public: Material * material = new Material(kd, ks, 50); //objects.push_back(new Sphere(vec3(0, 0, 0), .25f, material)); - objects.push_back(new Triangle(vec3(0.1, 0, 0), vec3(0,0,.1), vec3(0, .1, .1), material)); + //objects.push_back(new Pentagon(vec3(0.03, -.01, 0), vec3(0, .37, 0), vec3(-.47, .49, 0), vec3(-.73, .08, 0), vec3(-.414, -0.288, 0), material)); + + for (int i = 0; i < 12; i++) { + auto indexRow = objIndex[i]; + auto p1 = objPoints[indexRow[0]]; + auto p2 = objPoints[indexRow[1]]; + auto p3 = objPoints[indexRow[2]]; + auto p4 = objPoints[indexRow[3]]; + auto p5 = objPoints[indexRow[4]]; + + objects.push_back(new Pentagon(p1, p2, p3, p4, p5, material)); + } } void render(std::vector<vec4>& image) {