4343 margin-top : 10px ;
4444 display : inline-block;
4545 }
46+
47+ # settings-panel {
48+ position : absolute;
49+ right : 20px ;
50+ top : 20px ;
51+ background : rgba (0 , 0 , 0 , 0.8 );
52+ border : 1px solid # ff0000 ;
53+ padding : 15px ;
54+ color : # ff0000 ;
55+ font-family : 'Courier New' , monospace;
56+ z-index : 100 ;
57+ pointer-events : auto;
58+ width : 220px ;
59+ font-size : 12px ;
60+ box-shadow : 0 0 15px rgba (255 , 0 , 0 , 0.2 );
61+ }
62+
63+ .control-group {
64+ margin-bottom : 15px ;
65+ }
66+
67+ .control-group label {
68+ display : block;
69+ margin-bottom : 5px ;
70+ }
71+
72+ .control-group input {
73+ width : 100% ;
74+ cursor : pointer;
75+ accent-color : # ff0000 ;
76+ }
4677 </ style >
4778</ head >
4879
@@ -52,6 +83,28 @@ <h1>WARNING: GATE OPEN</h1>
5283 < p > LOCATION: HAWKINS NATIONAL LABORATORY</ p >
5384 < a href ="index.html "> RUN BACK HOME</ a >
5485 </ div >
86+
87+ < div id ="settings-panel ">
88+ < div style ="border-bottom: 1px solid #ff0000; margin-bottom: 10px; padding-bottom: 5px; font-weight: bold; "> RENDER
89+ CONSOLE</ div >
90+ < div class ="control-group ">
91+ < label > EXPOSURE (曝光度)</ label >
92+ < input type ="range " id ="exposure-slider " min ="0 " max ="5 " step ="0.1 " value ="1.5 ">
93+ </ div >
94+ < div class ="control-group ">
95+ < label > AMBIENT (环境光)</ label >
96+ < input type ="range " id ="ambient-slider " min ="0 " max ="5 " step ="0.1 " value ="1.2 ">
97+ </ div >
98+ < div class ="control-group ">
99+ < label > MAIN LIGHT (主灯)</ label >
100+ < input type ="range " id ="main-light-slider " min ="0 " max ="10 " step ="0.1 " value ="2.0 ">
101+ </ div >
102+ < div class ="control-group ">
103+ < label > FLICKER BASE (闪烁基准)</ label >
104+ < input type ="range " id ="flicker-slider " min ="0 " max ="500 " step ="10 " value ="50 ">
105+ </ div >
106+ </ div >
107+
55108 < div id ="loading " class ="loading "> Locating Demogorgon...</ div >
56109
57110 < script type ="importmap ">
@@ -68,8 +121,8 @@ <h1>WARNING: GATE OPEN</h1>
68121 import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js' ;
69122 import { OrbitControls } from 'three/addons/controls/OrbitControls.js' ;
70123
71- let scene , camera , renderer , controls , model ;
72- let flashLight ;
124+ let scene , camera , renderer , controls , model , ambientLight , mainLight , flashLight ;
125+ let flickerBase = 50 ;
73126
74127 function init ( ) {
75128 scene = new THREE . Scene ( ) ;
@@ -83,16 +136,24 @@ <h1>WARNING: GATE OPEN</h1>
83136 renderer . setSize ( window . innerWidth , window . innerHeight ) ;
84137 renderer . setPixelRatio ( window . devicePixelRatio ) ;
85138 renderer . shadowMap . enabled = true ;
139+ // 开启色调映射,让模型亮度更自然
140+ renderer . toneMapping = THREE . ACESFilmicToneMapping ;
141+ renderer . toneMappingExposure = 1.5 ;
86142 document . body . appendChild ( renderer . domElement ) ;
87143
88144 controls = new OrbitControls ( camera , renderer . domElement ) ;
89145 controls . enableDamping = true ;
90146
91147 // 灯光设置
92- const ambientLight = new THREE . AmbientLight ( 0x404040 , 0.5 ) ; // 极弱的环境光
148+ ambientLight = new THREE . AmbientLight ( 0xffffff , 1.2 ) ;
93149 scene . add ( ambientLight ) ;
94150
95- flashLight = new THREE . PointLight ( 0xff0000 , 100 , 10 ) ;
151+ // 增加一个强力的主方向光,从斜上方照亮模型
152+ mainLight = new THREE . DirectionalLight ( 0xffffff , 2.0 ) ;
153+ mainLight . position . set ( 5 , 10 , 7.5 ) ;
154+ scene . add ( mainLight ) ;
155+
156+ flashLight = new THREE . PointLight ( 0xff0000 , 150 , 15 ) ;
96157 flashLight . position . set ( 2 , 3 , 2 ) ;
97158 flashLight . castShadow = true ;
98159 scene . add ( flashLight ) ;
@@ -134,6 +195,20 @@ <h1>WARNING: GATE OPEN</h1>
134195 // 添加 Upside Down 的灰烬粒子
135196 createParticles ( ) ;
136197
198+ // 绑定控制台事件
199+ document . getElementById ( 'exposure-slider' ) . addEventListener ( 'input' , ( e ) => {
200+ renderer . toneMappingExposure = parseFloat ( e . target . value ) ;
201+ } ) ;
202+ document . getElementById ( 'ambient-slider' ) . addEventListener ( 'input' , ( e ) => {
203+ ambientLight . intensity = parseFloat ( e . target . value ) ;
204+ } ) ;
205+ document . getElementById ( 'main-light-slider' ) . addEventListener ( 'input' , ( e ) => {
206+ mainLight . intensity = parseFloat ( e . target . value ) ;
207+ } ) ;
208+ document . getElementById ( 'flicker-slider' ) . addEventListener ( 'input' , ( e ) => {
209+ flickerBase = parseFloat ( e . target . value ) ;
210+ } ) ;
211+
137212 window . addEventListener ( 'resize' , onWindowResize ) ;
138213 animate ( ) ;
139214 }
@@ -163,7 +238,7 @@ <h1>WARNING: GATE OPEN</h1>
163238 if ( Math . random ( ) > 0.9 ) {
164239 flashLight . intensity = Math . random ( ) * 150 ;
165240 } else {
166- flashLight . intensity = 50 ;
241+ flashLight . intensity = flickerBase ;
167242 }
168243
169244 if ( model ) model . rotation . y += 0.005 ;
0 commit comments