Advertisement
Guest User

Untitled

a guest
May 24th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.02 KB | None | 0 0
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <title>Repeating Textures (Three.js)</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. <link rel=stylesheet href="css/base.css"/>
  8. </head>
  9. <body>
  10.  
  11. <script src="js/Three.js"></script>
  12. <script src="js/Detector.js"></script>
  13. <script src="js/Stats.js"></script>
  14. <script src="js/OrbitControls.js"></script>
  15. <script src="js/THREEx.KeyboardState.js"></script>
  16. <script src="js/THREEx.FullScreen.js"></script>
  17. <script src="js/THREEx.WindowResize.js"></script>
  18.  
  19. <!-- jQuery code to display an information button and box when clicked. -->
  20. <script src="js/jquery-1.9.1.js"></script>
  21. <script src="js/jquery-ui.js"></script>
  22. <link rel=stylesheet href="css/jquery-ui.css" />
  23. <link rel=stylesheet href="css/info.css"/>
  24. <script src="js/info.js"></script>
  25. <div id="infoButton"></div>
  26. <div id="infoBox" title="Demo Information">
  27. This three.js demo is part of a collection at
  28. <a href="http://stemkoski.github.io/Three.js/">http://stemkoski.github.io/Three.js/</a>
  29. </div>
  30. <!-- ------------------------------------------------------------ -->
  31.  
  32. <div id="ThreeJS" style="position: absolute; left:0px; top:0px"></div>
  33. <script>
  34.  
  35.  
  36. // MAIN
  37.  
  38. // standard global variables
  39. var container, scene, camera, renderer, controls, stats;
  40. var keyboard = new THREEx.KeyboardState();
  41. var clock = new THREE.Clock();
  42. // custom global variables
  43. var lamp;
  44. var targetList = [];
  45. var cube;
  46. var crate;
  47. var projector, mouse = { x: 0, y: 0 }, INTERSECTED;
  48.  
  49. var animOffset = 0, // starting frame of animation
  50. walking = false,
  51. duration = 1000, // milliseconds to complete animation
  52. keyframes = 20, // total number of animation frames
  53. interpolation = duration / keyframes, // milliseconds per frame
  54. lastKeyframe = 0, // previous keyframe
  55. currentKeyframe = 0;
  56. init();
  57. animate();
  58.  
  59. // FUNCTIONS
  60. function init()
  61. {
  62. // SCENE
  63. scene = new THREE.Scene();
  64. // CAMERA
  65. var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
  66. var VIEW_ANGLE = 45, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000;
  67. camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR);
  68. scene.add(camera);
  69. camera.position.set(0,150,400);
  70. camera.lookAt(scene.position);
  71. // RENDERER
  72. if ( Detector.webgl )
  73. renderer = new THREE.WebGLRenderer( {antialias:true} );
  74. else
  75. renderer = new THREE.CanvasRenderer();
  76. renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
  77. container = document.getElementById( 'ThreeJS' );
  78. container.appendChild( renderer.domElement );
  79. // EVENTS
  80. THREEx.WindowResize(renderer, camera);
  81. THREEx.FullScreen.bindKey({ charCode : 'm'.charCodeAt(0) });
  82. // CONTROLS
  83. controls = new THREE.OrbitControls( camera, renderer.domElement );
  84. // STATS
  85. stats = new Stats();
  86. stats.domElement.style.position = 'absolute';
  87. stats.domElement.style.bottom = '0px';
  88. stats.domElement.style.zIndex = 100;
  89. container.appendChild( stats.domElement );
  90. // LIGHT
  91. var light = new THREE.PointLight(0xffffff);
  92. light.position.set(0,150,100);
  93. scene.add(light);
  94. // FLOOR
  95. var floorTexture = new THREE.ImageUtils.loadTexture( 'images/checkerboard.jpg' ); // floor teksturos
  96. floorTexture.wrapS = floorTexture.wrapT = THREE.RepeatWrapping;
  97. // THREE.MirrorWrapping
  98. // THREE.ClampToEdgeWrapping
  99. // THREE.ClampToBoderWrapping
  100. // THREE.MirroredRepeatWrapping
  101. floorTexture.repeat.set( 5, 5 );
  102. var floorMaterial = new THREE.MeshBasicMaterial( { map: floorTexture, side: THREE.DoubleSide } );
  103. var floorGeometry = new THREE.PlaneGeometry(1000, 1000, 10, 10);
  104. var floor = new THREE.Mesh(floorGeometry, floorMaterial);
  105. floor.position.y = -0.5;
  106. floor.rotation.x = Math.PI / 2;
  107. scene.add(floor);
  108. // SKYBOX/FOG
  109. var skyBoxGeometry = new THREE.CubeGeometry( 10000, 10000, 10000 );
  110. var skyBoxMaterial = new THREE.MeshBasicMaterial( { color: 0x9999ff, side: THREE.BackSide } );
  111. var skyBox = new THREE.Mesh( skyBoxGeometry, skyBoxMaterial );
  112. scene.add(skyBox);
  113. scene.fog = new THREE.FogExp2( 0x9999ff, 0.00025 );
  114.  
  115. ////////////
  116. // CUSTOM OBJEKTAI//
  117. ////////////
  118.  
  119. // LEMPA
  120. // Note: a standard flat rectangular image will look distorted,
  121. // a "spherical projection" image will look "normal".
  122.  
  123. var jsonLoader = new THREE.JSONLoader();
  124. jsonLoader.load( "models/lamp_animated.js", addModelToScene ); // lempos padejimas
  125. //jsonLoader.load( "models/lamp_animated.js", addModelToScene );
  126. // addModelToScene function is called back after model has loaded
  127.  
  128. var ambientLight = new THREE.AmbientLight(0x111111);
  129. scene.add(ambientLight);
  130.  
  131.  
  132. // radius, segmentsWidth, segmentsHeight
  133. var sphereGeom = new THREE.SphereGeometry( 40, 32, 16 );
  134.  
  135. var light2 = new THREE.AmbientLight(0x444444);
  136. scene.add(light2);
  137.  
  138.  
  139.  
  140. // Using wireframe materials to illustrate shape details.
  141. var darkMaterial = new THREE.MeshBasicMaterial( { color: 0xaa0000 } );
  142. var wireframeMaterial = new THREE.MeshBasicMaterial( { color: 0x000000, wireframe: true, transparent: true } );
  143. var multiMaterial = [ darkMaterial, wireframeMaterial ];
  144.  
  145.  
  146. // cube
  147. var shape = THREE.SceneUtils.createMultiMaterialObject(
  148. new THREE.CubeGeometry(50, 50, 50, 5, 5, 5),
  149. multiMaterial );
  150. shape.position.set(-200, 175, 0);
  151. scene.add( shape );
  152.  
  153.  
  154. // pyramid - truncated
  155. var shape = THREE.SceneUtils.createMultiMaterialObject(
  156. // radiusAtTop, radiusAtBottom, height, segmentsAroundRadius, segmentsAlongHeight,
  157. new THREE.CylinderGeometry( 15, 30, 100, 6, 4 ),
  158. multiMaterial );
  159. shape.position.set(-200, 100, 0);
  160. scene.add( shape );
  161.  
  162. // cube
  163. var shape = THREE.SceneUtils.createMultiMaterialObject(
  164. new THREE.CubeGeometry(50, 50, 50, 2, 2, 2),
  165. multiMaterial );
  166. shape.position.set(-200, 50, 0);
  167. scene.add( shape );
  168.  
  169. // cone
  170. var shape = THREE.SceneUtils.createMultiMaterialObject(
  171. // radiusAtTop, radiusAtBottom, height, segmentsAroundRadius, segmentsAlongHeight,
  172. new THREE.CylinderGeometry( 0, 30, 70, 20, 4 ),
  173. multiMaterial );
  174. shape.position.set(-142, 110, 0);
  175. scene.add( shape );
  176. shape.rotation.set(100, 50, 11)
  177. // cone
  178. var shape = THREE.SceneUtils.createMultiMaterialObject(
  179. // radiusAtTop, radiusAtBottom, height, segmentsAroundRadius, segmentsAlongHeight,
  180. new THREE.CylinderGeometry( 0, 30, 70, 20, 4 ),
  181. multiMaterial );
  182. shape.position.set(-200, 235, 0);
  183. scene.add( shape );
  184. // Cubes
  185. // Note: when using a single image, it will appear on each of the faces.
  186.  
  187. var cubeGeometry = new THREE.CubeGeometry( 85, 85, 85 );
  188.  
  189. var crateTexture = new THREE.ImageUtils.loadTexture( 'images/crate.gif' ); // teksturos dezes
  190. var crateMaterial = new THREE.MeshBasicMaterial( { map: crateTexture } );
  191. crate = new THREE.Mesh( cubeGeometry.clone(), crateMaterial );
  192. crate.position.set(-100, 40, 300);
  193. scene.add( crate );
  194.  
  195.  
  196. var faceColorMaterial = new THREE.MeshBasicMaterial(
  197. { color: 0xffffff, vertexColors: THREE.FaceColors } );
  198.  
  199. var cubeGeometry = new THREE.CubeGeometry( 100, 100, 100 );
  200. for ( var i = 0; i < cubeGeometry.faces.length; i++ )
  201. {
  202. face = cubeGeometry.faces[ i ];
  203. face.color.setRGB( 0, 0, 0.9 * Math.random() + 0.3 );
  204. }
  205. var cube = new THREE.Mesh( cubeGeometry, faceColorMaterial );
  206. cube.position.set(70, 50, 300);
  207. scene.add(cube);
  208.  
  209. targetList.push(cube);
  210.  
  211. // initialize object to perform world/screen calculations
  212. projector = new THREE.Projector();
  213.  
  214. // when the mouse moves, call the given function
  215. document.addEventListener( 'mousedown', onDocumentMouseDown, false );
  216.  
  217.  
  218.  
  219.  
  220.  
  221. }
  222.  
  223. function addModelToScene( geometry, materials )
  224. {
  225. // for preparing animation
  226. for (var i = 0; i < materials.length; i++)
  227. materials[i].morphTargets = true;
  228.  
  229. var material = new THREE.MeshFaceMaterial( materials );
  230. lamp = new THREE.Mesh( geometry, material );
  231. lamp.scale.set(10,10,10);
  232. lamp.position.set(150,5,300);
  233. scene.add( lamp );
  234. }
  235.  
  236. function onDocumentMouseDown( event )
  237. {
  238. // the following line would stop any other event handler from firing
  239. // (such as the mouse's TrackballControls)
  240. // event.preventDefault();
  241. console.log("Click.");
  242.  
  243. // update the mouse variable PELES KOORDINATES UPDEITINA
  244. mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
  245. mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
  246.  
  247. // find intersections
  248.  
  249. // create a Ray with origin at the mouse position
  250. // and direction into the scene (camera direction)
  251. var vector = new THREE.Vector3( mouse.x, mouse.y, 1 );
  252. projector.unprojectVector( vector, camera );
  253. var ray = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );
  254.  
  255. // create an array containing all objects in the scene with which the ray intersects
  256. var intersects = ray.intersectObjects( targetList );
  257.  
  258. // if there is one (or more) intersections
  259. if ( intersects.length > 0 )
  260. {
  261. console.log("Hit @ " + toString( intersects[0].point ) );
  262. // change the color of the closest face.
  263. intersects[ 0 ].face.color.setRGB( 0.8 * Math.random() + 0.2, 0, 0 );
  264. intersects[ 0 ].object.geometry.colorsNeedUpdate = true;
  265. }
  266. // update sprite position
  267. //crate.position.set( event.clientX, event.clientY, 0 );
  268. }
  269.  
  270. function toString(v) { return "[ " + v.x + ", " + v.y + ", " + v.z + " ]"; }
  271.  
  272.  
  273. function animate()
  274. {
  275. requestAnimationFrame( animate );
  276. render();
  277. update();
  278. }
  279.  
  280. function update()
  281. {
  282. if ( keyboard.pressed("left") )
  283. {
  284. crate.translateX( -20);
  285.  
  286. }
  287. if ( keyboard.pressed("right") )
  288. crate.translateX( 20 );
  289.  
  290. if ( keyboard.pressed("up") )
  291. crate.translateZ( -20 );
  292.  
  293. if ( keyboard.pressed("down") )
  294. crate.translateZ( 20 );
  295.  
  296.  
  297. if ( keyboard.pressed("W") )
  298. crate.translateY( 20 );
  299.  
  300. if ( keyboard.pressed("S") )
  301. crate.translateY( -20 );
  302.  
  303. if ( keyboard.pressed("A") )
  304. crate.translateX( -20 );
  305.  
  306. if ( keyboard.pressed("D") )
  307. crate.translateX( 20 );
  308.  
  309.  
  310. controls.update();
  311. stats.update();
  312. }
  313.  
  314. function render()
  315. {
  316. if ( lamp ) // exists / is loaded
  317. {
  318.  
  319. // Calculate interpolation - how long a single frame is shown for:
  320. // Determine the current frame (keyframe) by calculating how much
  321. // more time of our animation cycle remains to be played thru.
  322.  
  323. // Alternate morph targets
  324. time = new Date().getTime() % duration;
  325. keyframe = Math.floor( time / interpolation ) + animOffset;
  326.  
  327. // Update the frame details if the keyframe just calculated is different to the
  328. // current keyframe:
  329.  
  330. if ( keyframe != currentKeyframe )
  331. {
  332. // Update the morphTargetInfluences array to progress the animation
  333. lamp.morphTargetInfluences[ lastKeyframe ] = 0;
  334. lamp.morphTargetInfluences[ currentKeyframe ] = 1;
  335. lamp.morphTargetInfluences[ keyframe ] = 0;
  336.  
  337. // Track previous/last keyframe and the current keyframe:
  338. lastKeyframe = currentKeyframe;
  339. currentKeyframe = keyframe;
  340. }
  341. lamp.morphTargetInfluences[ keyframe ] =
  342. ( time % interpolation ) / interpolation;
  343. lamp.morphTargetInfluences[ lastKeyframe ] =
  344. 1 - lamp.morphTargetInfluences[ keyframe ];
  345. }
  346.  
  347. renderer.render( scene, camera );
  348. }
  349.  
  350. </script>
  351.  
  352. </body>
  353. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement