|
45 | 45 | <script src="js/loaders/DRACOLoader.js"></script> |
46 | 46 | <script src="js/loaders/GLTFLoader.js"></script> |
47 | 47 |
|
| 48 | + <script src="js/pmrem/PMREMGenerator.js"></script> |
| 49 | + <script src="js/pmrem/PMREMCubeUVPacker.js"></script> |
| 50 | + |
48 | 51 | <script src="js/Car.js"></script> |
49 | 52 |
|
50 | 53 | <script src="js/WebGL.js"></script> |
|
65 | 68 | var glassMatSelect = document.getElementById( 'glass-mat' ); |
66 | 69 |
|
67 | 70 | var followCamera = document.getElementById( 'camera-toggle' ); |
68 | | - followCamera.addEventListener( 'change', onFollowCameraToggle ); |
69 | 71 |
|
70 | | - var lightHolder = new THREE.Group(); |
71 | 72 | var clock = new THREE.Clock(); |
72 | 73 | var car = new THREE.Car(); |
73 | 74 | car.turningRadius = 75; |
|
81 | 82 | var damping = 5.0; |
82 | 83 | var distance = 5; |
83 | 84 | var cameraTarget = new THREE.Vector3(); |
84 | | - var origin = new THREE.Vector3(); |
85 | 85 |
|
86 | 86 | function init() { |
87 | 87 |
|
88 | 88 | var container = document.getElementById( 'container' ); |
89 | 89 |
|
90 | 90 | camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 200 ); |
91 | 91 | camera.position.set( 3.25, 2.0, -5 ); |
| 92 | + camera.lookAt( 0, 0.5, 0 ); |
92 | 93 |
|
93 | 94 | scene = new THREE.Scene(); |
94 | 95 | scene.fog = new THREE.Fog( 0xd7cbb1, 1, 80 ); |
95 | 96 |
|
96 | | - envMap = new THREE.CubeTextureLoader() |
97 | | - .setPath( 'textures/cube/skyboxsun25deg/') |
98 | | - .load( [ 'px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg' ] ); |
| 97 | + var urls = [ 'px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg' ]; |
| 98 | + var loader = new THREE.CubeTextureLoader().setPath( 'textures/cube/skyboxsun25deg/'); |
| 99 | + loader.load( urls, function ( texture ) { |
| 100 | + |
| 101 | + scene.background = texture; |
| 102 | + |
| 103 | + var pmremGenerator = new THREE.PMREMGenerator( texture ); |
| 104 | + pmremGenerator.update( renderer ); |
| 105 | + |
| 106 | + var pmremCubeUVPacker = new THREE.PMREMCubeUVPacker( pmremGenerator.cubeLods ); |
| 107 | + pmremCubeUVPacker.update( renderer ); |
| 108 | + |
| 109 | + envMap = pmremCubeUVPacker.CubeUVRenderTarget.texture; |
99 | 110 |
|
100 | | - scene.background = envMap; |
| 111 | + pmremGenerator.dispose(); |
| 112 | + pmremCubeUVPacker.dispose(); |
| 113 | + |
| 114 | + // |
| 115 | + |
| 116 | + initCar(); |
| 117 | + initMaterials(); |
| 118 | + initMaterialSelectionMenus(); |
| 119 | + |
| 120 | + } ); |
101 | 121 |
|
102 | 122 | var ground = new THREE.Mesh( |
103 | 123 | new THREE.PlaneBufferGeometry( 2400, 2400 ), |
|
114 | 134 | grid.material.transparent = true; |
115 | 135 | scene.add( grid ); |
116 | 136 |
|
117 | | - var hemiLight = new THREE.HemisphereLight( 0x7c849b, 0xd7cbb1, 0.1 ); |
118 | | - hemiLight.position.set( 0, 1, 0 ); |
119 | | - scene.add( hemiLight ); |
120 | | - |
121 | | - var shadowLight = new THREE.DirectionalLight( 0xffffee, 0.1 ); |
122 | | - shadowLight.position.set( -1.5, 1.25, -1.5 ); |
123 | | - shadowLight.castShadow = true; |
124 | | - shadowLight.shadow.width = 512; |
125 | | - shadowLight.shadow.height = 512; |
126 | | - shadowLight.shadow.camera.top = 2; |
127 | | - shadowLight.shadow.camera.bottom = -2; |
128 | | - shadowLight.shadow.camera.left = -2.5; |
129 | | - shadowLight.shadow.camera.right = 2.5; |
130 | | - shadowLight.shadow.camera.far = 5.75; |
131 | | - shadowLight.shadow.bias = -0.025; |
132 | | - |
133 | | - lightHolder.add( shadowLight, shadowLight.target ); |
134 | | - |
135 | 137 | renderer = new THREE.WebGLRenderer( { antialias: true } ); |
136 | | - renderer.setPixelRatio( window.devicePixelRatio ); |
137 | 138 | renderer.gammaOutput = true; |
138 | | - renderer.shadowMap.enabled = true; |
| 139 | + renderer.setPixelRatio( window.devicePixelRatio ); |
139 | 140 | renderer.setSize( window.innerWidth, window.innerHeight ); |
140 | 141 |
|
141 | 142 | container.appendChild( renderer.domElement ); |
142 | 143 |
|
143 | 144 | stats = new Stats(); |
144 | 145 | container.appendChild( stats.dom ); |
145 | 146 |
|
146 | | - initCar(); |
147 | | - initMaterials(); |
148 | | - initMaterialSelectionMenus(); |
149 | | - |
150 | 147 | window.addEventListener( 'resize', onWindowResize, false ); |
151 | 148 |
|
152 | 149 | renderer.setAnimationLoop( function() { |
|
170 | 167 |
|
171 | 168 | carModel = gltf.scene.children[ 0 ]; |
172 | 169 |
|
173 | | - // add lightHolder to car so that the shadow will track the car as it moves |
174 | | - carModel.add( lightHolder ); |
175 | | - |
176 | 170 | car.setModel( carModel ); |
177 | 171 |
|
178 | 172 | carModel.traverse( function ( child ) { |
179 | 173 |
|
180 | 174 | if ( child.isMesh ) { |
181 | 175 |
|
182 | | - child.castShadow = true; |
183 | | - child.receiveShadow = true; |
184 | 176 | child.material.envMap = envMap; |
185 | 177 |
|
186 | 178 | } |
|
236 | 228 |
|
237 | 229 | glass: [ |
238 | 230 |
|
239 | | - new THREE.MeshStandardMaterial( { color: 0xffffff, envMap: envMap, metalness: 0.9, roughness: 0.1, opacity: 0.15, transparent: true, premultipliedAlpha: true, name: 'clear' } ), |
240 | | - new THREE.MeshStandardMaterial( { color: 0x000000, envMap: envMap, metalness: 0.9, roughness: 0.1, opacity: 0.15, transparent: true, premultipliedAlpha: true, name: 'smoked' } ), |
241 | | - new THREE.MeshStandardMaterial( { color: 0x001133, envMap: envMap, metalness: 0.9, roughness: 0.1, opacity: 0.15, transparent: true, premultipliedAlpha: true, name: 'blue' } ), |
| 231 | + new THREE.MeshStandardMaterial( { color: 0xffffff, envMap: envMap, metalness: 1, roughness: 0, opacity: 0.2, transparent: true, premultipliedAlpha: true, name: 'clear' } ), |
| 232 | + new THREE.MeshStandardMaterial( { color: 0x000000, envMap: envMap, metalness: 1, roughness: 0, opacity: 0.2, transparent: true, premultipliedAlpha: true, name: 'smoked' } ), |
| 233 | + new THREE.MeshStandardMaterial( { color: 0x001133, envMap: envMap, metalness: 1, roughness: 0, opacity: 0.2, transparent: true, premultipliedAlpha: true, name: 'blue' } ), |
242 | 234 |
|
243 | 235 | ], |
244 | 236 |
|
|
270 | 262 |
|
271 | 263 | } ); |
272 | 264 |
|
273 | | - bodyMatSelect.selectedIndex = 2; |
274 | | - rimMatSelect.selectedIndex = 4; |
| 265 | + bodyMatSelect.selectedIndex = 3; |
| 266 | + rimMatSelect.selectedIndex = 5; |
275 | 267 | glassMatSelect.selectedIndex = 0; |
276 | 268 |
|
277 | 269 | bodyMatSelect.addEventListener( 'change', updateMaterials ); |
|
302 | 294 |
|
303 | 295 | } |
304 | 296 |
|
305 | | - function onFollowCameraToggle() { |
306 | | - |
307 | | - carModel.position.copy( origin ); |
308 | | - |
309 | | - } |
310 | | - |
311 | 297 | function update() { |
312 | 298 |
|
313 | 299 | var delta = clock.getDelta(); |
|
316 | 302 |
|
317 | 303 | car.update( delta / 3 ); |
318 | 304 |
|
319 | | - resetPosition(); |
| 305 | + console.log( ); |
320 | 306 |
|
321 | | - // keep the light (and shadow) pointing in the same direction as the car rotates |
322 | | - lightHolder.rotation.y = -carModel.rotation.y; |
| 307 | + if ( carModel.position.length() > 200 ) { |
| 308 | + |
| 309 | + carModel.position.set( 0, 0, 0 ); |
| 310 | + car.speed = 0; |
| 311 | + |
| 312 | + } |
323 | 313 |
|
324 | 314 | if ( followCamera.checked ) { |
325 | 315 |
|
|
329 | 319 |
|
330 | 320 | camera.position.lerp( cameraTarget, delta * damping ); |
331 | 321 |
|
| 322 | + } else { |
| 323 | + |
| 324 | + carModel.getWorldPosition( cameraTarget ); |
| 325 | + cameraTarget.y += 0.5; |
| 326 | + |
| 327 | + camera.position.set( 3.25, 2.0, -5 ); |
| 328 | + |
332 | 329 | } |
333 | 330 |
|
334 | 331 | camera.lookAt( carModel.position ); |
|
339 | 336 |
|
340 | 337 | } |
341 | 338 |
|
342 | | - function resetPosition() { |
343 | | - |
344 | | - if ( carModel.position.distanceTo( origin ) > 200 ) { |
345 | | - |
346 | | - carModel.position.copy( origin ); |
347 | | - car.speed = 0; |
348 | | - |
349 | | - } |
350 | | - |
351 | | - } |
352 | | - |
353 | 339 | init(); |
354 | 340 |
|
355 | 341 | </script> |
|
0 commit comments