Advertisement
Guest User

Untitled

a guest
Jun 30th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.62 KB | None | 0 0
  1.  
  2. public class Matrix4 {
  3. private double[][] internalMatrix = new double[4][4];
  4. boolean lefthanded = false;
  5.  
  6. Matrix4() {
  7. identity();
  8. }
  9.  
  10. Matrix4(double a00, double a01, double a02, double a03, double a10, double a11, double a12, double a13, double a20, double a21, double a22, double a23, double a30, double a31, double a32, double a33) {
  11. this.internalMatrix[0][0] = a00;
  12. this.internalMatrix[0][1] = a01;
  13. this.internalMatrix[0][2] = a02;
  14. this.internalMatrix[0][3] = a03;
  15. this.internalMatrix[1][0] = a10;
  16. this.internalMatrix[1][1] = a11;
  17. this.internalMatrix[1][2] = a12;
  18. this.internalMatrix[1][3] = a13;
  19. this.internalMatrix[2][0] = a20;
  20. this.internalMatrix[2][1] = a21;
  21. this.internalMatrix[2][2] = a22;
  22. this.internalMatrix[2][3] = a23;
  23. this.internalMatrix[3][0] = a30;
  24. this.internalMatrix[3][1] = a31;
  25. this.internalMatrix[3][2] = a32;
  26. this.internalMatrix[3][3] = a33;
  27. }
  28.  
  29. Matrix4(double[][] input) {
  30. this.internalMatrix = input;
  31. }
  32.  
  33. public Matrix4 identity() {
  34. for (int i = 0; i < 4; i++) {
  35. for (int j = 0; j < 4; j++) {
  36. this.internalMatrix[i][j] = _identitydiagonal(i, j);
  37. }
  38. }
  39. return this;
  40. }
  41.  
  42. private static double _identitydiagonal(int row, int column) {
  43. return row == column ? 1.0 : 0.0;
  44. }
  45.  
  46. /*
  47. * General form of the Projection Matrix
  48. *
  49. * uh = Cot( fov/2 ) == 1/Tan(fov/2) uw / uh = 1/aspect
  50. *
  51. * uw 0 0 0 0 uh 0 0 0 0 f/(f-n) 1 0 0 -fn/(f-n) 0
  52. *
  53. * Make result to be identity first
  54. *
  55. * check for bad parameters to avoid divide by zero: if found, assert and
  56. * return an identity matrix.
  57. *
  58. * @Source:
  59. * https://stackoverflow.com/questions/18404890/how-to-build-perspective-
  60. * projection-matrix-no-api
  61. */
  62.  
  63. public Matrix4 perspective(float fov, float aspectRatio, float zNear, float zFar) {
  64. if (fov <= 0 || aspectRatio == 0) {
  65. return identity();
  66. }
  67. float frustumDepth = zFar - zNear;
  68. float oneOverDepth = 1 / frustumDepth;
  69. this.internalMatrix[1][1] = 1 / Math.tan(0.5D * fov);
  70. this.internalMatrix[0][0] = (this.lefthanded ? 1 : -1) * this.internalMatrix[1][1] / aspectRatio;
  71. this.internalMatrix[2][2] = zFar * oneOverDepth;
  72. this.internalMatrix[3][2] = (-zFar * zNear) * oneOverDepth;
  73. this.internalMatrix[2][3] = 1;
  74. this.internalMatrix[3][3] = 0;
  75. return this;
  76. }
  77.  
  78. public Matrix4 rotate(float radians, Vertex vertex) {
  79. float temp1 = (float) vertex.getX();
  80. float temp2 = (float) vertex.getY();
  81. float temp3 = (float) vertex.getZ();
  82.  
  83. if (temp1 != 0 && temp2 == 0 && temp3 == 0) {
  84. rotateX(radians);
  85. }
  86. if (temp1 == 0 && temp2 != 0 && temp3 == 0) {
  87. rotateY(radians);
  88. }
  89. if (temp1 == 0 && temp2 == 0 && temp3 != 0) {
  90. rotateZ(radians);
  91. }
  92.  
  93. return rotation(radians, temp1, temp2, temp3);
  94. }
  95.  
  96. /*
  97. * @Source:
  98. * http://www.codinglabs.net/article_world_view_projection_matrix.aspx
  99. */
  100. public Matrix4 rotateX(float theta) {
  101. this.internalMatrix[0][0] = 1.0;
  102. this.internalMatrix[0][1] = 0.0;
  103. this.internalMatrix[0][2] = 0.0;
  104. this.internalMatrix[0][3] = 0.0;
  105. this.internalMatrix[1][0] = 0.0;
  106. this.internalMatrix[1][1] = Math.cos(theta);
  107. this.internalMatrix[1][2] = Math.sin(theta);
  108. this.internalMatrix[1][3] = 0.0;
  109. this.internalMatrix[2][0] = 0.0;
  110. this.internalMatrix[2][1] = -Math.sin(theta);
  111. this.internalMatrix[2][2] = Math.cos(theta);
  112. this.internalMatrix[2][3] = 0.0;
  113. this.internalMatrix[3][0] = 0.0;
  114. this.internalMatrix[3][1] = 0.0;
  115. this.internalMatrix[3][2] = 0.0;
  116. this.internalMatrix[3][3] = 1.0;
  117. return this;
  118. }
  119.  
  120. /*
  121. * @Source:
  122. * http://www.codinglabs.net/article_world_view_projection_matrix.aspx
  123. */
  124. public Matrix4 rotateY(float theta) {
  125. this.internalMatrix[0][0] = Math.cos(theta);
  126. this.internalMatrix[0][1] = 0.0;
  127. this.internalMatrix[0][2] = Math.sin(theta);
  128. this.internalMatrix[0][3] = 0.0;
  129. this.internalMatrix[1][0] = 0.0;
  130. this.internalMatrix[1][1] = 1.0;
  131. this.internalMatrix[1][2] = 0.0;
  132. this.internalMatrix[1][3] = 0.0;
  133. this.internalMatrix[2][0] = -Math.sin(theta);
  134. this.internalMatrix[2][1] = 0.0;
  135. this.internalMatrix[2][2] = Math.cos(theta);
  136. this.internalMatrix[2][3] = 0.0;
  137. this.internalMatrix[3][0] = 0.0;
  138. this.internalMatrix[3][1] = 0.0;
  139. this.internalMatrix[3][2] = 0.0;
  140. this.internalMatrix[3][3] = 1.0;
  141. return this;
  142. }
  143.  
  144. /*
  145. * @Source:
  146. * http://www.codinglabs.net/article_world_view_projection_matrix.aspx
  147. */
  148. public Matrix4 rotateZ(float theta) {
  149. this.internalMatrix[0][0] = Math.cos(theta);
  150. this.internalMatrix[0][1] = -Math.sin(theta);
  151. this.internalMatrix[0][2] = 0.0;
  152. this.internalMatrix[0][3] = 0.0;
  153. this.internalMatrix[1][0] = 0.0;
  154. this.internalMatrix[1][1] = Math.sin(theta);
  155. this.internalMatrix[1][2] = Math.cos(theta);
  156. this.internalMatrix[1][3] = 0.0;
  157. this.internalMatrix[2][0] = 0.0;
  158. this.internalMatrix[2][1] = 0.0;
  159. this.internalMatrix[2][2] = 1.0;
  160. this.internalMatrix[2][3] = 0.0;
  161. this.internalMatrix[3][0] = 0.0;
  162. this.internalMatrix[3][1] = 0.0;
  163. this.internalMatrix[3][2] = 0.0;
  164. this.internalMatrix[3][3] = 1.0;
  165. return this;
  166. }
  167.  
  168. /*
  169. * @Title: 5.2 The normalized matrix for rotations about the origin
  170. *
  171. * @Source:
  172. * https://sites.google.com/site/glennmurray/Home/rotation-matrices-
  173. * and-formulas/rotation-about-an-arbitrary-axis-in-3-dimensions
  174. */
  175. public Matrix4 rotation(float radians, float x, float y, float z) {
  176. this.internalMatrix[0][0] = Math.pow(x, 2.0) + (((1.0D - Math.pow(x, 2.0)) * Math.cos(radians)));
  177. this.internalMatrix[0][1] = ((x * y) * (1.0D - Math.cos(radians))) - (z * Math.sin(radians));
  178. this.internalMatrix[0][2] = (x * z * (1.0D - Math.cos(radians))) + y * Math.sin(radians);
  179. this.internalMatrix[0][3] = 0.0;
  180. this.internalMatrix[1][0] = (x * y * (1.0D - Math.cos(radians))) + z * Math.sin(radians);
  181. this.internalMatrix[1][1] = Math.pow(y, 2) + ((1.0D - Math.pow(y, 2.0)) * Math.cos(radians));
  182. this.internalMatrix[1][2] = (y * z * (1.0D - Math.cos(radians))) - (x * Math.sin(radians));
  183. this.internalMatrix[1][3] = 0.0;
  184. this.internalMatrix[2][0] = (x * z * (1.0D - Math.cos(radians))) - y * Math.sin(radians);
  185. this.internalMatrix[2][1] = ((y * z) * (1.0D - Math.cos(radians))) + (x * Math.sin(radians));
  186. this.internalMatrix[2][2] = Math.pow(z, 2.0) + (((1.0D - Math.pow(z, 2.0)) * Math.cos(radians)));
  187. this.internalMatrix[2][3] = 0.0;
  188. this.internalMatrix[3][0] = 0.0;
  189. this.internalMatrix[3][1] = 0.0;
  190. this.internalMatrix[3][2] = 0.0;
  191. this.internalMatrix[3][3] = 1.0;
  192. return this;
  193. }
  194.  
  195. /*
  196. * 3D Coordinate axes rotation matrices Source:
  197. * https://sites.google.com/site/glennmurray/Home/rotation-matrices-and-
  198. * formulas/rotation-about-an-arbitrary-axis-in-3-dimensions
  199. */
  200. public Matrix4 rotateXYZ(float alpha, float beta, float gamma) {
  201. this.internalMatrix[0][0] = Math.cos(beta) * Math.cos(gamma);
  202. this.internalMatrix[0][1] = -Math.cos(beta) * Math.sin(gamma);
  203. this.internalMatrix[0][2] = Math.sin(beta);
  204. this.internalMatrix[0][3] = 0.0;
  205. this.internalMatrix[1][0] = (Math.cos(alpha) * Math.sin(gamma)) + (Math.sin(alpha) * Math.sin(beta) * Math.cos(gamma));
  206. this.internalMatrix[1][1] = (Math.cos(alpha) * Math.cos(gamma)) - (Math.sin(alpha) * Math.sin(beta) * Math.sin(gamma));
  207. this.internalMatrix[1][2] = -(Math.sin(alpha) * Math.cos(beta));
  208. this.internalMatrix[1][3] = 0.0;
  209. this.internalMatrix[2][0] = (Math.sin(alpha) * Math.sin(gamma)) - (Math.cos(alpha) * Math.sin(beta) * Math.cos(gamma));
  210. this.internalMatrix[2][1] = (Math.sin(alpha) * Math.cos(gamma)) + (Math.cos(alpha) * Math.sin(beta) * Math.sin(gamma));
  211. this.internalMatrix[2][2] = Math.cos(alpha) * Math.cos(beta);
  212. this.internalMatrix[2][3] = 0.0;
  213. this.internalMatrix[3][0] = 0.0;
  214. this.internalMatrix[3][1] = 0.0;
  215. this.internalMatrix[3][2] = 0.0;
  216. this.internalMatrix[3][3] = 1.0;
  217. return this;
  218. }
  219.  
  220. /*
  221. * 3D Coordinate axes rotation matrices Source:
  222. * https://sites.google.com/site/glennmurray/Home/rotation-matrices-and-
  223. * formulas/rotation-about-an-arbitrary-axis-in-3-dimensions
  224. */
  225. public Matrix4 rotateZYX(float alpha, float beta, float gamma) {
  226. this.internalMatrix[0][0] = Math.cos(beta) * Math.cos(gamma);
  227. this.internalMatrix[0][1] = (Math.cos(gamma) * Math.sin(alpha) * Math.sin(beta)) - (Math.cos(alpha) * Math.sin(gamma));
  228. this.internalMatrix[0][2] = (Math.cos(alpha) * Math.cos(gamma) * Math.sin(beta)) + (Math.sin(alpha) * Math.sin(gamma));
  229. this.internalMatrix[0][3] = 0.0;
  230. this.internalMatrix[1][0] = Math.cos(beta) * Math.sin(gamma);
  231. this.internalMatrix[1][1] = (Math.cos(alpha) * Math.cos(gamma)) - (Math.sin(alpha) * Math.sin(beta) * Math.sin(gamma));
  232. this.internalMatrix[1][2] = (-Math.cos(gamma) * Math.sin(alpha)) + (Math.cos(alpha) * Math.sin(beta) * Math.sin(gamma));
  233. this.internalMatrix[1][3] = 0.0;
  234. this.internalMatrix[2][0] = -Math.sin(beta);
  235. this.internalMatrix[2][1] = Math.cos(beta) * Math.sin(alpha);
  236. this.internalMatrix[2][2] = Math.cos(alpha) * Math.cos(beta);
  237. this.internalMatrix[2][3] = 0.0;
  238. this.internalMatrix[3][0] = 0.0;
  239. this.internalMatrix[3][1] = 0.0;
  240. this.internalMatrix[3][2] = 0.0;
  241. this.internalMatrix[3][3] = 1.0;
  242. return this;
  243. }
  244.  
  245. /*
  246. * @Source:
  247. * http://www.codinglabs.net/article_world_view_projection_matrix.aspx
  248. */
  249. public Matrix4 translate(double x, double y, double z) {
  250. this.internalMatrix[3][0] = (this.internalMatrix[0][0] * x + this.internalMatrix[1][0] * y + this.internalMatrix[2][0] * z + this.internalMatrix[3][0]);
  251. this.internalMatrix[3][1] = (this.internalMatrix[0][1] * x + this.internalMatrix[1][1] * y + this.internalMatrix[2][1] * z + this.internalMatrix[3][1]);
  252. this.internalMatrix[3][2] = (this.internalMatrix[0][2] * x + this.internalMatrix[1][2] * y + this.internalMatrix[2][2] * z + this.internalMatrix[3][2]);
  253. this.internalMatrix[3][3] = (this.internalMatrix[0][3] * x + this.internalMatrix[1][3] * y + this.internalMatrix[2][3] * z + this.internalMatrix[3][3]);
  254. return this;
  255. }
  256.  
  257. public Matrix4 scale(Vertex v) {
  258. this.identity();
  259. this.internalMatrix[0][0] = v.getX();
  260. this.internalMatrix[1][1] = v.getY();
  261. this.internalMatrix[2][2] = v.getZ();
  262. this.internalMatrix[3][3] = 1.0D;
  263. return this;
  264. }
  265.  
  266. public Matrix4 scale(double x, double y, double z) {
  267. this.identity();
  268. this.internalMatrix[0][0] = x;
  269. this.internalMatrix[1][1] = y;
  270. this.internalMatrix[2][2] = z;
  271. this.internalMatrix[3][3] = 1.0D;
  272. return this;
  273.  
  274. }
  275.  
  276. public double[][] to2DArray() {
  277. return this.internalMatrix;
  278. }
  279.  
  280. public double[] toArray() {
  281. double[] temp = new double[16];
  282. for (int i = 0; i < 4; i++) {
  283. for (int j = 0; j < 4; j++) {
  284. temp[(i * 4) + j] = this.internalMatrix[i][j];
  285. }
  286. }
  287. return temp;
  288. }
  289. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement