@@ -16,128 +16,107 @@ import {
1616 Mesh ,
1717 RepeatWrapping ,
1818 MeshStandardMaterial ,
19+ MeshPhysicalMaterialParameters ,
1920 PlaneGeometry
2021} from 'three'
2122import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
2223import { PLYLoader } from 'three/examples/jsm/loaders/PLYLoader'
2324import { animation } from '../common/animation'
2425
25- const camera3D = ( ) : PerspectiveCamera => {
26- const camera = new PerspectiveCamera ( 75 , window . innerWidth / window . innerHeight , 0.1 , 1000 )
27- camera . position . z = 8
28- camera . position . y = 0
29- camera . position . x = 0
30- return camera
31- }
32-
33- const renderer3D = ( ) : WebGLRenderer => {
34- const renderer = new WebGLRenderer ( { alpha : true } )
35- renderer . physicallyCorrectLights = true
36- // renderer.gammaInput = true
37- // renderer.gammaOutput = true
38- renderer . shadowMap . enabled = true
39- renderer . shadowMap . type = PCFSoftShadowMap
40- renderer . setSize ( window . innerWidth , window . innerHeight )
41- return renderer
42- }
43-
44- const sceneThreeJS = ( ) : void => {
45- const plyLoader = new PLYLoader ( )
46- const scene = new Scene ( )
47- const textureLoader = new TextureLoader ( )
48- const camera = camera3D ( )
49- const renderer = renderer3D ( )
50- const orbit = orbitsControls ( camera , renderer )
51- setup ( renderer , camera , scene )
52- lights ( scene )
53- stars ( textureLoader , stars => scene . add ( stars ) )
54- meshWithPBRMaterial ( plyLoader , lucy ( ) , mesh => scene . add ( mesh ) )
55- meshWithPBRMaterial ( plyLoader , dragon ( ) , mesh => scene . add ( mesh ) )
56- meshWithPBRMaterial ( plyLoader , bunny ( ) , mesh => scene . add ( mesh ) )
57- floor ( textureLoader , mesh => scene . add ( mesh ) )
58- DefaultLoadingManager . onLoad = ( ) => renderLoop ( renderer , scene , camera , orbit )
59- }
60-
61- class Object3D {
62- constructor ( path , properties , position , rotation ) {
63- this . path = path
64- this . properties = properties
65- this . position = position
66- this . rotation = rotation
67- }
26+ interface Object3D {
27+ path : string ;
28+ properties : MeshPhysicalMaterialParameters ;
29+ position : Vector3 ;
30+ rotation : Vector3 ;
6831}
6932
70- const lucy = ( ) => new Object3D (
71- 'assets/models/lucy.ply' ,
72- {
33+ const lucy = ( ) : Object3D => ( {
34+ path : 'assets/models/lucy.ply' ,
35+ properties : {
7336 color : 0x3F51B5 ,
7437 roughness : 0.5 ,
7538 metalness : 0.7 ,
7639 clearcoat : 0.5 ,
7740 clearcoatRoughness : 0.5 ,
7841 reflectivity : 0.7
7942 } ,
80- new Vector3 ( 3 , - 3 , 0 ) ,
81- new Vector3 ( 0 , - Math . PI / 3.0 , 0 )
82- )
43+ position : new Vector3 ( 3 , - 3 , 0 ) ,
44+ rotation : new Vector3 ( 0 , - Math . PI / 3.0 , 0 )
45+ } )
8346
84- const dragon = ( ) => new Object3D (
85- 'assets/models/dragon.ply' ,
86- {
47+ const dragon = ( ) : Object3D => ( {
48+ path : 'assets/models/dragon.ply' ,
49+ properties : {
8750 color : 0x448AFF ,
8851 roughness : 0.1 ,
8952 metalness : 0.9 ,
9053 clearcoat : 0.0 ,
9154 clearcoatRoughness : 0.2 ,
9255 reflectivity : 1
9356 } ,
94- new Vector3 ( - 3 , - 3 , 0 ) ,
95- new Vector3 ( 0 , - Math . PI , 0 )
96- )
57+ position : new Vector3 ( - 3 , - 3 , 0 ) ,
58+ rotation : new Vector3 ( 0 , - Math . PI , 0 )
59+ } )
9760
98- const bunny = ( ) => new Object3D (
99- 'assets/models/bunny.ply' ,
100- {
61+ const bunny = ( ) : Object3D => ( {
62+ path : 'assets/models/bunny.ply' ,
63+ properties : {
10164 color : 0xCCFFFF ,
10265 roughness : 0.9 ,
10366 metalness : 0.1 ,
10467 clearcoat : 0.0 ,
10568 clearcoatRoughness : 0.5 ,
10669 reflectivity : 0.1
10770 } ,
108- new Vector3 ( 0 , - 3 , 1.5 ) ,
109- new Vector3 ( 0 , - Math . PI , 0 )
110- )
71+ position : new Vector3 ( 0 , - 3 , 1.5 ) ,
72+ rotation : new Vector3 ( 0 , - Math . PI , 0 )
73+ } )
11174
112- const orbitsControls = ( camera , renderer ) => {
75+ const camera3D = ( ) : PerspectiveCamera => {
76+ const camera = new PerspectiveCamera ( 75 , window . innerWidth / window . innerHeight , 0.1 , 1000 )
77+ camera . position . z = 8
78+ camera . position . y = 0
79+ camera . position . x = 0
80+ return camera
81+ }
82+
83+ const renderer3D = ( ) : WebGLRenderer => {
84+ const renderer = new WebGLRenderer ( { alpha : true } )
85+ renderer . physicallyCorrectLights = true
86+ // renderer.gammaInput = true
87+ // renderer.gammaOutput = true
88+ renderer . shadowMap . enabled = true
89+ renderer . shadowMap . type = PCFSoftShadowMap
90+ renderer . setSize ( window . innerWidth , window . innerHeight )
91+ return renderer
92+ }
93+
94+ const orbitsControls = ( camera : PerspectiveCamera , renderer : WebGLRenderer ) : OrbitControls => {
11395 const controls = new OrbitControls ( camera , renderer . domElement )
11496 controls . enableZoom = false
11597 controls . autoRotate = true
11698 controls . enablePan = false
11799 controls . keyPanSpeed = 7.0
118100 controls . enableKeys = false
119101 controls . target = new Vector3 ( 0 , 0 , 0 )
120- controls . mouseButtons = { }
121102 controls . dispose ( )
122103 return controls
123104}
124105
125- const setup = ( renderer , camera , scene ) => {
106+ const setWindowResizeListener = ( camera : PerspectiveCamera , renderer : WebGLRenderer ) : void => {
107+ window . addEventListener ( 'resize' , ( ) => {
108+ camera . aspect = window . innerWidth / window . innerHeight
109+ camera . updateProjectionMatrix ( )
110+ renderer . setSize ( window . innerWidth , window . innerHeight )
111+ } , false )
112+ }
113+
114+ const setup = ( renderer : WebGLRenderer , camera : PerspectiveCamera , scene : Scene ) : void => {
126115 document . getElementById ( 'rendering-surface' ) . appendChild ( renderer . domElement )
127116 scene . background = new Color ( 0x303F9F )
128117 setWindowResizeListener ( camera , renderer )
129118}
130119
131- const renderLoop = ( renderer , scene , camera , orbit ) => {
132- const renderFrame = ( ) => {
133- requestAnimationFrame ( renderFrame )
134- orbit . update ( )
135- renderer . render ( scene , camera )
136- }
137- showRenderingSurfaceAnimation ( )
138- renderFrame ( )
139- }
140-
141120const pointLight = ( ) : PointLight => {
142121 const light = new PointLight ( 0xffffff , 1 , 20 , 2 )
143122 light . power = 1700
@@ -154,9 +133,7 @@ const lights = (scene: Scene): void => {
154133 scene . add ( new HemisphereLight ( 0x303F9F , 0x000000 , 1 ) )
155134}
156135
157-
158-
159- const stars = ( textureLoader , completeLoad ) => {
136+ const stars = ( textureLoader : TextureLoader , completeLoad : ( starts : Points ) => void ) : void => {
160137 textureLoader . load ( 'assets/models/textures/circle.png' , function ( texture ) {
161138 const starsGeometry = new Geometry ( )
162139 for ( let i = 0 ; i < 10000 ; i ++ ) {
@@ -176,7 +153,7 @@ const stars = (textureLoader, completeLoad) => {
176153 } )
177154}
178155
179- const meshWithPBRMaterial = ( plyLoader , object , completeLoad ) => {
156+ const meshWithPBRMaterial = ( plyLoader : PLYLoader , object : Object3D , completeLoad : ( mesh : Mesh ) => void ) : void => {
180157 plyLoader . load ( object . path , ( geometry ) => {
181158 geometry . computeVertexNormals ( )
182159 const material = new MeshPhysicalMaterial ( object . properties )
@@ -189,7 +166,7 @@ const meshWithPBRMaterial = (plyLoader, object, completeLoad) => {
189166 } )
190167}
191168
192- const floor = ( textureLoader , completionFunction ) => {
169+ const floor = ( textureLoader : TextureLoader , completionFunction : ( mesh : Mesh ) => void ) : void => {
193170 textureLoader . load ( 'assets/models/textures/marble.jpg' , function ( texture ) {
194171 texture . wrapS = RepeatWrapping
195172 texture . wrapT = RepeatWrapping
@@ -212,12 +189,31 @@ const floor = (textureLoader, completionFunction) => {
212189
213190const showRenderingSurfaceAnimation = ( ) : void => animation ( 'rendering-surface' , 'show' )
214191
215- const setWindowResizeListener = ( camera , renderer ) => {
216- window . addEventListener ( 'resize' , ( ) => {
217- camera . aspect = window . innerWidth / window . innerHeight
218- camera . updateProjectionMatrix ( )
219- renderer . setSize ( window . innerWidth , window . innerHeight )
220- } , false )
192+ const renderLoop = ( renderer : WebGLRenderer , scene : Scene , camera : PerspectiveCamera , orbit : OrbitControls ) : void => {
193+ const renderFrame = ( ) : void => {
194+ requestAnimationFrame ( renderFrame )
195+ orbit . update ( )
196+ renderer . render ( scene , camera )
197+ }
198+ showRenderingSurfaceAnimation ( )
199+ renderFrame ( )
200+ }
201+
202+ const sceneThreeJS = ( ) : void => {
203+ const plyLoader = new PLYLoader ( )
204+ const scene = new Scene ( )
205+ const textureLoader = new TextureLoader ( )
206+ const camera = camera3D ( )
207+ const renderer = renderer3D ( )
208+ const orbit = orbitsControls ( camera , renderer )
209+ setup ( renderer , camera , scene )
210+ lights ( scene )
211+ stars ( textureLoader , stars => scene . add ( stars ) )
212+ meshWithPBRMaterial ( plyLoader , lucy ( ) , mesh => scene . add ( mesh ) )
213+ meshWithPBRMaterial ( plyLoader , dragon ( ) , mesh => scene . add ( mesh ) )
214+ meshWithPBRMaterial ( plyLoader , bunny ( ) , mesh => scene . add ( mesh ) )
215+ floor ( textureLoader , mesh => scene . add ( mesh ) )
216+ DefaultLoadingManager . onLoad = ( ) : void => renderLoop ( renderer , scene , camera , orbit )
221217}
222218
223219export { sceneThreeJS }
0 commit comments