Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.54 KB | None | 0 0
  1. #define OLC_PGE_APPLICATION
  2. #include "olcPixelGameEngine.h"
  3.  
  4.  
  5.  
  6. struct vec3d
  7. {
  8. float x = 0;
  9. float y = 0;
  10. float z = 0;
  11. };
  12.  
  13. struct LINE
  14. {
  15. vec3d start,end;
  16. };
  17.  
  18. struct triangle
  19. {
  20. vec3d p[3];
  21. vec3d normal()
  22. {
  23. vec3d o, A, B;
  24.  
  25. A = {p[1].x - p[0].x, p[1].y - p[0].y, p[1].z - p[0].z};
  26. B = {p[2].x - p[0].x, p[2].y - p[0].y, p[2].z - p[0].z};
  27.  
  28. o = {A.y * B.z - A.z * B.y, A.z * B.x - A.x * B.z, A.x * B.y - A.y * B.x};
  29.  
  30. float l = sqrtf(o.x*o.x + o.y*o.y + o.z*o.z);
  31. o.x /= l;
  32. o.y /= l;
  33. o.z /= l;
  34. return o;
  35. }
  36. };
  37.  
  38. struct mesh
  39. {
  40. std::vector<triangle> tris;
  41. };
  42.  
  43.  
  44. struct mat4x4
  45. {
  46. float m[4][4] = { 0.0 };
  47. };
  48.  
  49. class Example : public olc::PixelGameEngine
  50. {
  51. public:
  52. Example()
  53. {
  54. sAppName = "rotatinCube";
  55. }
  56. private:
  57. mesh meshCube;
  58. mat4x4 matProj;
  59. float fTheta=0;
  60. vec3d vCamera;
  61.  
  62. void MultiplyMatrxVector(const vec3d &i, vec3d &o, const mat4x4 &m)
  63. {
  64. o.x = i.x * m.m[0][0] + i.y * m.m[1][0] + i.z * m.m[2][0] + m.m[3][0];
  65. o.y = i.x * m.m[0][1] + i.y * m.m[1][1] + i.z * m.m[2][1] + m.m[3][1];
  66. o.z = i.x * m.m[0][2] + i.y * m.m[1][2] + i.z * m.m[2][2] + m.m[3][2];
  67. float w = i.x * m.m[0][3] + i.y * m.m[1][3] + i.z * m.m[2][3] + m.m[3][3];
  68.  
  69. if (w != 0.0f)
  70. {
  71. o.x /= w;
  72. o.y /= w;
  73. o.z /= w;
  74. }
  75. }
  76.  
  77. public:
  78.  
  79. float dotProduct(vec3d &A, vec3d &B)
  80. {
  81. return (float)(A.x*B.x + A.y*B.y + A.z*B.z);
  82. }
  83. bool OnUserCreate() override
  84. {
  85.  
  86. meshCube.tris = {
  87.  
  88. // SOUTH
  89. { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f },
  90. { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f },
  91.  
  92. // EAST
  93. { 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f },
  94. { 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f },
  95.  
  96. // NORTH
  97. { 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f },
  98. { 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f },
  99.  
  100. // WEST
  101. { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f },
  102. { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f },
  103.  
  104. // TOP
  105. { 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f },
  106. { 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f },
  107.  
  108. // BOTTOM
  109. { 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f },
  110. { 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f },
  111. };
  112.  
  113. float fNear = 0.1f;
  114. float fFar = 1000.0f;
  115. float fFov = 90.0f;
  116. float fAspectRatio = (float)ScreenHeight() / (float)ScreenWidth();
  117. float fFovRad = 1.0f / tanf(fFov * 0.5 / 180.0f * 3.141592f );
  118.  
  119. matProj.m[0][0] = fAspectRatio * fFovRad;
  120. matProj.m[1][1] = fFovRad;
  121. matProj.m[2][2] = fFar / (fFar - fNear);
  122. matProj.m[3][2] = (-fFar * fNear) / (fFar - fNear);
  123. matProj.m[2][3] = 1.0f;
  124. matProj.m[3][3] = 0.0f;
  125.  
  126. return true;
  127. }
  128.  
  129.  
  130. //vec3d matVecMult
  131. bool OnUserUpdate(float fElapsedTime) override
  132. {
  133. // called once per frame
  134.  
  135. FillRect(0,0,ScreenWidth(),ScreenHeight(),olc::BLACK);
  136.  
  137. mat4x4 matRotZ, matRotX;
  138. triangle triProjected, triTranslated,triRotatedZ, triRotatedZX;
  139. vec3d normal, eyeLine;
  140.  
  141. fTheta += 1.0f * fElapsedTime;
  142.  
  143. matRotZ.m[0][0] = cosf(fTheta);
  144. matRotZ.m[0][1] = sinf(fTheta);
  145. matRotZ.m[1][0] = -sinf(fTheta);
  146. matRotZ.m[1][1] = cosf(fTheta);
  147. matRotZ.m[2][2] = 1;
  148. matRotZ.m[3][3] = 1;
  149.  
  150. matRotX.m[0][0] = 1;
  151. matRotX.m[1][1] = cosf(fTheta);
  152. matRotX.m[1][2] = sinf(fTheta);
  153. matRotX.m[2][1] = -sinf(fTheta);
  154. matRotX.m[2][2] = cosf(fTheta);
  155. matRotX.m[3][3] = 1;
  156.  
  157. for (auto tri : meshCube.tris)
  158. {
  159. for (int i = 0; i < 3; i++)
  160. {
  161. MultiplyMatrxVector(tri.p[i], triRotatedZ.p[i],matRotZ);
  162. MultiplyMatrxVector(triRotatedZ.p[i], triRotatedZX.p[i],matRotX);
  163.  
  164. triTranslated = triRotatedZX;
  165. triTranslated.p[i].z = triRotatedZX.p[i].z + 3.0f;
  166.  
  167. MultiplyMatrxVector(triTranslated.p[i], triProjected.p[i], matProj);
  168. triProjected.p[i].x += 1.0f;
  169. triProjected.p[i].y += 1.0f;
  170. triProjected.p[i].x *= (0.5f * (float)ScreenWidth());
  171. triProjected.p[i].y *= (0.5f * (float)ScreenHeight());
  172. }
  173.  
  174. normal = triTranslated.normal();
  175.  
  176. eyeLine.x = triTranslated.p[1].x - vCamera.x;
  177. eyeLine.y = triTranslated.p[1].y - vCamera.y;
  178. eyeLine.z = triTranslated.p[1].z - vCamera.z;
  179.  
  180. if (dotProduct(normal,eyeLine) > 0.0f)
  181. {
  182. DrawTriangle(triProjected.p[0].x, triProjected.p[0].y,
  183. triProjected.p[1].x, triProjected.p[1].y,
  184. triProjected.p[2].x, triProjected.p[2].y, olc::WHITE);
  185. }
  186.  
  187. }
  188. return true;
  189. }
  190. };
  191.  
  192.  
  193. int main()
  194. {
  195. Example demo;
  196. if (demo.Construct(256*2, 240*2, 1, 1))
  197. {
  198. demo.Start();
  199. }
  200.  
  201. return 0;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement