ObJS.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. var backColor = "rgba(200, 200, 200, 1)";
  2. var vertColor = "rgba(10, 10, 10, 1)";
  3. var edgeColor = "rgba(200, 0, 0, 1)";
  4. var faceColor = "rgba(180, 180, 255, .5)";
  5. var textColor = "rgba(0, 0, 0, 1)";
  6. var vertSize = 6; //Make it even
  7. var scale = 50;
  8. var mDown = false;
  9. var canvas;
  10. var ctx;
  11. var obj;
  12. var vert;
  13. var face;
  14. var pX = null;
  15. var pY = null;
  16. function loadModel(val){
  17. //Get file
  18. xmlhttp = new XMLHttpRequest();
  19. xmlhttp.open("GET","/obj/" + val.value + ".obj", false);
  20. xmlhttp.send();
  21. var fileContent = xmlhttp.responseText;
  22. initArrays();
  23. readVerts(fileContent);
  24. readFaces(fileContent);
  25. initCanvas();
  26. drawFaces();
  27. drawVerts();
  28. writeCredits();
  29. }
  30. function initArrays(){
  31. obj = null;
  32. vert = null;
  33. face = null;
  34. obj = new Array();
  35. vert = new Array();
  36. face = new Array();
  37. }
  38. function readVerts(text){
  39. var line;
  40. var i = 0;
  41. while (text.indexOf("v ") != -1){
  42. line = text.substring(text.indexOf("v "), text.indexOf("\n", text.indexOf("v ")));
  43. vert[i] = new Array(3);
  44. line = line.substring(2);
  45. vert[i][0] = scale * Math.round(line.substring(0, line.indexOf(" ")));
  46. line = line.substring(line.indexOf(" ") + 1);
  47. vert[i][1] = scale * Math.round(line.substring(0, line.indexOf(" ")));
  48. line = line.substring(line.indexOf(" ") + 1);
  49. vert[i][2] = scale * Math.round(line);
  50. i = i + 1;
  51. text = text.substring(text.indexOf("v ") + 1)
  52. }
  53. }
  54. function readFaces(text){
  55. var finish = false;
  56. var line;
  57. var i = 0;
  58. var j;
  59. while (text.indexOf("f ") != -1){
  60. line = text.substring(text.indexOf("f "), text.indexOf("\n", text.indexOf("f ")));
  61. line = line.substring(2);
  62. face[i] = new Array();
  63. j = 0;
  64. while(line.indexOf(" ") != -1){
  65. face[i][j] = line.substring(0, line.indexOf(" ")) - 1;
  66. line = line.substring(line.indexOf(" ") + 1);
  67. j = j + 1;
  68. }
  69. face[i][j] = line - 1;
  70. i = i + 1;
  71. text = text.substring(text.indexOf("f ") + 1)
  72. }
  73. }
  74. function drawVerts(){
  75. ctx.fillStyle = vertColor;
  76. var x;
  77. var y;
  78. var w;
  79. var h;
  80. for (var i = 0; i < vert.length; i++) {
  81. x = vert[i][0] - (vertSize / 2);
  82. w = vertSize;
  83. y = vert[i][1] - (vertSize / 2);
  84. h = vertSize;
  85. ctx.fillRect(x, y, w, h);
  86. }
  87. }
  88. function drawFaces(){
  89. for (var i = 0; i < face.length; i++){
  90. ctx.fillStyle = edgeColor;
  91. ctx.beginPath();
  92. ctx.moveTo(vert[face[i][0]][0], vert[face[i][0]][1]);
  93. for (var j = 1; j < face[i].length; j++) {
  94. ctx.lineTo(vert[face[i][j]][0], vert[face[i][j]][1]);
  95. ctx.stroke();
  96. }
  97. ctx.closePath();
  98. ctx.fillStyle = faceColor;
  99. ctx.fill();
  100. }
  101. }
  102. function rotateY(theta) {
  103. var sin_t = Math.sin(theta / 100);
  104. var cos_t = Math.cos(theta / 100);
  105. for (var i=0; i<vert.length; i++) {
  106. var x = vert[i][0];
  107. var z = vert[i][2];
  108. vert[i][0] = x * cos_t - z * sin_t;
  109. vert[i][2] = z * cos_t + x * sin_t;
  110. }
  111. };
  112. function rotateX(theta) {
  113. var sin_t = Math.sin(theta / 100);
  114. var cos_t = Math.cos(theta / 100);
  115. for (var i=0; i<vert.length; i++) {
  116. var y = vert[i][1];
  117. var z = vert[i][2];
  118. vert[i][1] = y * cos_t - z * sin_t;
  119. vert[i][2] = z * cos_t + y * sin_t;
  120. }
  121. };
  122. function initCanvas(){
  123. if (canvas == null){
  124. canvas = document.getElementById("ObJSCanvas");
  125. ctx = canvas.getContext("2d");
  126. ctx.translate(canvas.width / 2, canvas.height / 2);
  127. canvas.onmousedown = function(e){
  128. pX = e.offsetX==undefined?e.layerX:e.offsetX;
  129. pY = e.offsetY==undefined?e.layerY:e.offsetY;
  130. mDown = true;
  131. }
  132. canvas.onmouseup = function(e){
  133. if(mDown) mouseClick(e);
  134. pX = null;
  135. pY = null;
  136. mDown = false;
  137. }
  138. canvas.onmousemove = function(e){
  139. if(!mDown) return;
  140. var x = e.offsetX==undefined?e.layerX:e.offsetX;
  141. var y = e.offsetY==undefined?e.layerY:e.offsetY;
  142. rotateY(x - pX);
  143. rotateX(y - pY);
  144. pX = x;
  145. pY = y;
  146. initCanvas();
  147. drawFaces();
  148. drawVerts();
  149. return false;
  150. }
  151. }
  152. ctx.clearRect(0, 0, canvas.width, canvas.height);
  153. ctx.fillStyle = backColor;
  154. ctx.fillRect(-canvas.width / 2, -canvas.height / 2, canvas.width, canvas.height);
  155. }
  156. function mouseClick(){
  157. //TODO: Element clicked
  158. }
  159. function writeCredits(){
  160. ctx.fillStyle = textColor;
  161. ctx.font = "12px Arial";
  162. var h = canvas.height / 2 - 14;
  163. var w = canvas.width / 2 - 45;
  164. ctx.fillText("ObJS", w, h);
  165. }