webgl_loader_vrml.html 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>VRML loading with ThreeJs and VrmlParser</title>
  5. <meta charset="utf-8">
  6. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  7. <style>
  8. body {
  9. font-family: Monospace;
  10. background-color: #000;
  11. color: #fff;
  12. margin: 0px;
  13. overflow: hidden;
  14. }
  15. #info {
  16. color: #fff;
  17. position: absolute;
  18. top: 10px;
  19. width: 100%;
  20. text-align: center;
  21. z-index: 100;
  22. display: block;
  23. }
  24. #info a, .button {
  25. color: #f00;
  26. font-weight: bold;
  27. text-decoration: underline;
  28. cursor: pointer
  29. }
  30. #viewpoints {
  31. background-color: gray;
  32. z-index: 101;
  33. position: absolute;
  34. width: 140px;
  35. top: 10px;
  36. left: 10px;
  37. padding: 2px;
  38. border: 1px solid white;
  39. }
  40. #viewpoints div {
  41. width: inherit;
  42. }
  43. </style>
  44. </head>
  45. <body>
  46. <div id="info">
  47. <a href="http://threejs.org" target="_blank">three.js / VrmlParser</a> -
  48. vrml format loader test using VrmlParser -
  49. </div>
  50. <div id="viewpoints">
  51. <h4>Viewpoints from the VRML file</h4>
  52. </div>
  53. <script src="../build/three.min.js"></script>
  54. <script src="js/libs/vrml.min.js"></script>
  55. <script src="js/renderers/Projector.js"></script>
  56. <script src="js/controls/OrbitControls.js"></script>
  57. <script src="js/controls/FlyControls.js"></script>
  58. <script src="js/controls/FirstPersonControls.js"></script>
  59. <script src="js/controls/TrackballControls.js"></script>
  60. <script>
  61. var container;
  62. var camera, controls, scene, renderer, dirLight;
  63. var animation;
  64. // setup a clock
  65. var clock = new THREE.Clock();
  66. init();
  67. animate();
  68. function resetControls() {
  69. controls = new THREE.FlyControls(camera);
  70. controls.rotateSpeed = 1;
  71. controls.zoomSpeed = 0.2;
  72. controls.panSpeed = 0.2;
  73. controls.enableZoom = true;
  74. controls.enablePan = true;
  75. }
  76. function setupLight() {
  77. if ( ! dirLight ) {
  78. dirLight = new THREE.DirectionalLight(0xaaaaaa);
  79. dirLight.position.set(500, 500, 1000).normalize();
  80. dirLight.castShadow = false;
  81. }
  82. camera.add(dirLight);
  83. camera.add(dirLight.target);
  84. }
  85. function selectViewpoint(event, vrmlConverter) {
  86. var viewpoint = event.target.dataset.name;
  87. console.log('clicked ' + viewpoint);
  88. camera = vrmlConverter.viewpoints[ viewpoint ].getCamera();
  89. setupLight();
  90. resetControls();
  91. animation.addClickSupport(camera, renderer);
  92. }
  93. function init() {
  94. camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.01, 1e5);
  95. camera.position.z = 4;
  96. camera.position.y = 3;
  97. camera.position.x = 0;
  98. scene = new THREE.Scene();
  99. scene.fog = new THREE.Fog(0xffffff, 1, 5000);
  100. scene.fog.color.setHSL(0.6, 0, 1);
  101. scene.add(camera);
  102. setupLight();
  103. resetControls();
  104. var debug = true;
  105. var vrmlConverter = new VrmlParser.Renderer.ThreeJs(debug);
  106. // renderer
  107. renderer = new THREE.WebGLRenderer({ antialias: true });
  108. renderer.shadowMap.enabled = true;
  109. renderer.setClearColor(0x000000, 1);
  110. renderer.setSize(window.innerWidth, window.innerHeight);
  111. // add support for animation and interaction
  112. animation = new VrmlParser.Renderer.ThreeJs.Animation(debug);
  113. animation.addClickSupport(camera, renderer);
  114. // initialize the viewpoinst with the camera from the global scope
  115. vrmlConverter.viewpoints = {
  116. reset: {
  117. getCamera: function () {
  118. return this.camera;
  119. }, name: 'surrounding_reset', camera: camera
  120. }
  121. }; // key value store of cameras based on VRML viewpoint nodes, stored by their name.
  122. // VRML parser example:
  123. var fileLoader = new THREE.FileLoader();
  124. // onLoad, onProgress, onError
  125. fileLoader.load('models/vrml/house.wrl', function (data) {
  126. try {
  127. var tree = vrmlParser.parse(data);
  128. } catch ( e ) {
  129. console.log('Exception with message ' + e.message);
  130. if ( undefined !== e.location ) {
  131. console.log('Exception at location start: offset: ' + e.location.start.offset + ' line: ' + e.location.start.line + ' column: ' + e.location.start.column);
  132. console.log('Exception at location end: offset: ' + e.location.end.offset + ' line: ' + e.location.end.line + ' column: ' + e.location.end.column);
  133. }
  134. return;
  135. }
  136. console.log(tree);
  137. vrmlConverter.render(tree, scene);
  138. // @todo: move viewpointSelector to its own class
  139. var viewpointSelector = document.getElementById('viewpoints');
  140. for ( a in vrmlConverter.viewpoints ) {
  141. if ( typeof a === 'string' ) {
  142. var option = document.createElement('div');
  143. option.innerHTML = a;
  144. option.setAttribute('data-name', a);
  145. viewpointSelector.appendChild(option);
  146. option.addEventListener('click', function (event) {
  147. selectViewpoint(event, vrmlConverter);
  148. });
  149. }
  150. }
  151. }, function () {
  152. }, function (error) {
  153. var request = error.target;
  154. if ( 404 === request.status ) {
  155. console.log('VRML Document not found at ' + request.responseURL);
  156. }
  157. console.log(error);
  158. });
  159. container = document.createElement('div');
  160. document.body.appendChild(container);
  161. container.appendChild(renderer.domElement);
  162. //
  163. window.addEventListener('resize', onWindowResize, false);
  164. }
  165. function onWindowResize() {
  166. camera.aspect = window.innerWidth / window.innerHeight;
  167. camera.updateProjectionMatrix();
  168. renderer.setSize(window.innerWidth, window.innerHeight);
  169. }
  170. function animate() {
  171. requestAnimationFrame(animate);
  172. var delta = clock.getDelta();
  173. if ( undefined !== controls ) {
  174. controls.update(delta);
  175. }
  176. animation.update(delta);
  177. renderer.render(scene, camera);
  178. }
  179. </script>
  180. </body>
  181. </html>