webgl_loader_vrml.html 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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/loaders/VRMLLoader.js"></script>
  56. <script src="js/renderers/Projector.js"></script>
  57. <script src="js/controls/OrbitControls.js"></script>
  58. <script src="js/controls/FlyControls.js"></script>
  59. <script src="js/controls/FirstPersonControls.js"></script>
  60. <script src="js/controls/TrackballControls.js"></script>
  61. <script>
  62. var container;
  63. var camera, controls, scene, renderer, dirLight;
  64. var animation;
  65. // setup a clock
  66. var clock = new THREE.Clock();
  67. init();
  68. animate();
  69. function resetControls() {
  70. controls = new THREE.FlyControls(camera);
  71. controls.rotateSpeed = 1;
  72. controls.zoomSpeed = 0.2;
  73. controls.panSpeed = 0.2;
  74. controls.enableZoom = true;
  75. controls.enablePan = true;
  76. }
  77. function setupLight() {
  78. if ( ! dirLight ) {
  79. dirLight = new THREE.DirectionalLight(0xaaaaaa);
  80. dirLight.position.set(500, 500, 1000).normalize();
  81. dirLight.castShadow = false;
  82. }
  83. camera.add(dirLight);
  84. camera.add(dirLight.target);
  85. }
  86. function selectViewpoint(event, vrmlConverter) {
  87. var viewpoint = event.target.dataset.name;
  88. console.log('clicked ' + viewpoint);
  89. camera = vrmlConverter.viewpoints[ viewpoint ].getCamera();
  90. setupLight();
  91. resetControls();
  92. animation.addClickSupport(camera, renderer);
  93. }
  94. function init() {
  95. camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.01, 1e5);
  96. camera.position.z = 4;
  97. camera.position.y = 3;
  98. camera.position.x = 0;
  99. scene = new THREE.Scene();
  100. scene.fog = new THREE.Fog(0xffffff, 1, 5000);
  101. scene.fog.color.setHSL(0.6, 0, 1);
  102. scene.add(camera);
  103. setupLight();
  104. resetControls();
  105. var debug = true;
  106. var vrmlConverter = new VrmlParser.Renderer.ThreeJs(debug);
  107. // renderer
  108. renderer = new THREE.WebGLRenderer({ antialias: true });
  109. renderer.shadowMap.enabled = true;
  110. renderer.setClearColor(0x000000, 1);
  111. renderer.setSize(window.innerWidth, window.innerHeight);
  112. // add support for animation and interaction
  113. animation = new VrmlParser.Renderer.ThreeJs.Animation(debug);
  114. animation.addClickSupport(camera, renderer);
  115. // initialize the viewpoinst with the camera from the global scope
  116. vrmlConverter.viewpoints = {
  117. reset: {
  118. getCamera: function () {
  119. return this.camera;
  120. }, name: 'surrounding_reset', camera: camera
  121. }
  122. }; // key value store of cameras based on VRML viewpoint nodes, stored by their name.
  123. var vrmlLoader = new THREE.VRMLLoader(vrmlParser, new THREE.LoadingManager(), true);
  124. var onLoad = function (vrmlTree) {
  125. vrmlConverter.render(vrmlTree, scene);
  126. var viewpointSelector = document.getElementById('viewpoints');
  127. for ( a in vrmlConverter.viewpoints ) {
  128. if ( typeof a === 'string' ) {
  129. var option = document.createElement('div');
  130. option.innerHTML = a;
  131. option.setAttribute('data-name', a);
  132. viewpointSelector.appendChild(option);
  133. option.addEventListener('click', function (event) {
  134. selectViewpoint(event, vrmlConverter);
  135. });
  136. }
  137. }
  138. };
  139. var onError = function (error) {
  140. var request = error.target;
  141. if ( 404 === request.status ) {
  142. console.log('VRML Document not found at ' + request.responseURL);
  143. }
  144. console.log(error);
  145. }
  146. var onProgress = function () {
  147. }
  148. vrmlLoader.load('models/vrml/house.wrl', onLoad, onProgress, onError);
  149. container = document.createElement('div');
  150. document.body.appendChild(container);
  151. container.appendChild(renderer.domElement);
  152. //
  153. window.addEventListener('resize', onWindowResize, false);
  154. }
  155. function onWindowResize() {
  156. camera.aspect = window.innerWidth / window.innerHeight;
  157. camera.updateProjectionMatrix();
  158. renderer.setSize(window.innerWidth, window.innerHeight);
  159. }
  160. function animate() {
  161. requestAnimationFrame(animate);
  162. var delta = clock.getDelta();
  163. if ( undefined !== controls ) {
  164. controls.update(delta);
  165. }
  166. animation.update(delta);
  167. renderer.render(scene, camera);
  168. }
  169. </script>
  170. </body>
  171. </html>