|
10 | 10 | <body>
|
11 | 11 | <div id="info">
|
12 | 12 | <a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - Tone Mapping<br />
|
13 |
| - Battle Damaged Sci-fi Helmet by |
14 |
| - <a href="https://sketchfab.com/theblueturtle_" target="_blank" rel="noopener">theblueturtle_</a><br /> |
| 13 | + Venice Mask by |
| 14 | + <a href="https://sketchfab.com/D.art" target="_blank" rel="noopener">DailyArt</a> is licensed under <a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" rel="noopener">CC Attribution-NonCommercial</a><br /> |
15 | 15 | <a href="https://hdrihaven.com/hdri/?h=venice_sunset" target="_blank" rel="noopener">Venice Sunset</a> from <a href="https://hdrihaven.com/" target="_blank" rel="noopener">HDRI Haven</a>
|
16 | 16 | </div>
|
17 | 17 |
|
|
31 | 31 | import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
|
32 | 32 | import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
|
33 | 33 | import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
|
| 34 | + import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js'; |
34 | 35 | import { RGBELoader } from 'three/addons/loaders/RGBELoader.js';
|
35 | 36 |
|
36 |
| - let mesh, renderer, scene, camera, controls; |
| 37 | + let renderer, scene, camera, controls; |
37 | 38 | let gui, guiExposure = null;
|
38 | 39 |
|
39 | 40 | const params = {
|
40 | 41 | exposure: 1.0,
|
41 |
| - toneMapping: 'AgX', |
| 42 | + toneMapping: 'Neutral', |
42 | 43 | blurriness: 0.3,
|
43 | 44 | intensity: 1.0,
|
44 | 45 | };
|
|
65 | 66 | renderer = new THREE.WebGLRenderer( { antialias: true } );
|
66 | 67 | renderer.setPixelRatio( window.devicePixelRatio );
|
67 | 68 | renderer.setSize( window.innerWidth, window.innerHeight );
|
| 69 | + renderer.setAnimationLoop( animate ); |
68 | 70 | document.body.appendChild( renderer.domElement );
|
69 | 71 |
|
70 | 72 | renderer.toneMapping = toneMappingOptions[ params.toneMapping ];
|
|
92 | 94 | scene = new THREE.Scene();
|
93 | 95 | scene.backgroundBlurriness = params.blurriness;
|
94 | 96 |
|
95 |
| - camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.25, 20 ); |
96 |
| - camera.position.set( - 1.8, 0.6, 2.7 ); |
| 97 | + const light = new THREE.DirectionalLight( 0xfff3ee, 3 ); // simualte sun |
| 98 | + light.position.set( 1, 0.05, 0.7 ); |
| 99 | + scene.add( light ); |
| 100 | + |
| 101 | + // scene.add( new THREE.DirectionalLightHelper( light, 1, 0x000000 ) ); |
| 102 | + |
| 103 | + camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.01, 10 ); |
| 104 | + camera.position.set( - 0.02, 0.03, 0.05 ); |
97 | 105 |
|
98 | 106 | controls = new OrbitControls( camera, renderer.domElement );
|
99 |
| - controls.addEventListener( 'change', render ); // use if there is no animation loop |
100 |
| - controls.enableZoom = false; |
101 | 107 | controls.enablePan = false;
|
102 |
| - controls.target.set( 0, 0, - 0.2 ); |
| 108 | + controls.enableDamping = true; |
| 109 | + controls.minDistance = 0.03; |
| 110 | + controls.maxDistance = 0.2; |
| 111 | + controls.target.set( 0, 0.03, 0 ); |
103 | 112 | controls.update();
|
104 | 113 |
|
105 | 114 | const rgbeLoader = new RGBELoader()
|
106 | 115 | .setPath( 'textures/equirectangular/' );
|
107 | 116 |
|
108 |
| - const gltfLoader = new GLTFLoader().setPath( 'models/gltf/DamagedHelmet/glTF/' ); |
| 117 | + const dracoLoader = new DRACOLoader(); |
| 118 | + dracoLoader.setDecoderPath( 'jsm/libs/draco/gltf/' ); |
| 119 | + |
| 120 | + const gltfLoader = new GLTFLoader(); |
| 121 | + gltfLoader.setDRACOLoader( dracoLoader ); |
| 122 | + gltfLoader.setPath( 'models/gltf/' ); |
109 | 123 |
|
110 | 124 | const [ texture, gltf ] = await Promise.all( [
|
111 | 125 | rgbeLoader.loadAsync( 'venice_sunset_1k.hdr' ),
|
112 |
| - gltfLoader.loadAsync( 'DamagedHelmet.gltf' ), |
| 126 | + gltfLoader.loadAsync( 'venice_mask.glb' ), |
113 | 127 | ] );
|
114 | 128 |
|
115 | 129 | // environment
|
|
121 | 135 |
|
122 | 136 | // model
|
123 | 137 |
|
124 |
| - mesh = gltf.scene.getObjectByName( 'node_damagedHelmet_-6514' ); |
125 |
| - scene.add( mesh ); |
126 |
| - |
127 |
| - render(); |
| 138 | + scene.add( gltf.scene ); |
128 | 139 |
|
129 | 140 | window.addEventListener( 'resize', onWindowResize );
|
130 | 141 |
|
| 142 | + // |
| 143 | + |
131 | 144 | gui = new GUI();
|
132 | 145 | const toneMappingFolder = gui.addFolder( 'Tone Mapping' );
|
133 | 146 |
|
|
139 | 152 | updateGUI( toneMappingFolder );
|
140 | 153 |
|
141 | 154 | renderer.toneMapping = toneMappingOptions[ params.toneMapping ];
|
142 |
| - render(); |
143 | 155 |
|
144 | 156 | } );
|
145 | 157 |
|
|
148 | 160 | .onChange( function ( value ) {
|
149 | 161 |
|
150 | 162 | renderer.toneMappingExposure = value;
|
151 |
| - render(); |
152 | 163 |
|
153 | 164 | } );
|
154 | 165 |
|
|
159 | 170 | .onChange( function ( value ) {
|
160 | 171 |
|
161 | 172 | scene.backgroundBlurriness = value;
|
162 |
| - render(); |
163 | 173 |
|
164 | 174 | } );
|
165 | 175 |
|
|
168 | 178 | .onChange( function ( value ) {
|
169 | 179 |
|
170 | 180 | scene.backgroundIntensity = value;
|
171 |
| - render(); |
172 | 181 |
|
173 | 182 | } );
|
174 | 183 |
|
|
178 | 187 |
|
179 | 188 | }
|
180 | 189 |
|
181 |
| - function updateGUI( folder ) { |
| 190 | + function updateGUI() { |
182 | 191 |
|
183 | 192 | if ( params.toneMapping === 'None' ) {
|
184 | 193 |
|
|
200 | 209 |
|
201 | 210 | renderer.setSize( window.innerWidth, window.innerHeight );
|
202 | 211 |
|
203 |
| - render(); |
204 |
| - |
205 | 212 | }
|
206 | 213 |
|
207 |
| - function render() { |
| 214 | + function animate() { |
| 215 | + |
| 216 | + controls.update(); |
208 | 217 |
|
209 | 218 | renderer.render( scene, camera );
|
210 | 219 |
|
|
0 commit comments