< template> < div> < div id= "container" > < / div> < / div> 
< / template> 
< script> 
import  *  as  THREE  from  'three' ; 
import  {  OrbitControls }  from  'three/examples/jsm/controls/OrbitControls' ; 
import  {  RoomEnvironment }  from  'three/examples/jsm/environments/RoomEnvironment.js' ; 
import  Stats from  'three/examples/jsm/libs/stats.module.js' ; 
import  {  GLTFLoader }  from  'three/examples/jsm/loaders/GLTFLoader' 
import  {  DRACOLoader }  from  'three/examples/jsm/loaders/DRACOLoader' 
import  {  GUI  }  from  'three/examples/jsm/libs/lil-gui.module.min.js' ; 
import  gsap from  'gsap' ; 
import  {  StereoEffect }  from  'three/examples/jsm/effects/StereoEffect.js' ; 
const  path =  '/textures/cube/Park3Med/' 
const  format =  '.jpg' 
const  urls =  [ path +  'px'  +  format,  path +  'nx'  +  format, path +  'py'  +  format,  path +  'ny'  +  format, path +  'pz'  +  format,  path +  'nz'  +  format
] 
const  textureCube =  new  THREE. CubeTextureLoader ( ) . load ( urls) ; 
export  default  { data ( )  { return  { container :  null ,  scene :  null , 	camera :  null ,  renderer :  null ,  controller :  null , 	stats :  null , mixer :  null , model :  null , clock :  new  THREE. Clock ( ) , spheres :  [ ] , mouseX :  0 , mouseY :  0 , windowHalfX :  0 , windowHalfY :  0 , effect :  null , } ; } , mounted ( )  { this . init ( ) this . animate ( )   window. addEventListener ( "resize" ,  this . onWindowSize) window. addEventListener ( 'mousemove' ,  this . onDocumentMouseMove) ; } , beforeUnmount ( )  { console. log ( 'beforeUnmount===============' ) ; this . container =  null this . scene =  null this . camera =  null this . renderer =  null this . controller =  null this . stats =  null this . mixer =  null this . model =  null } , methods :  { init ( )  { this . container =  document. getElementById ( 'container' ) this . windowHalfX =  this . container. clientWidth /  2 ; this . windowHalfY =  this . container. clientHeight /  2 ; this . setScene ( ) this . setCamera ( ) this . setRenderer ( ) this . setEffect ( ) this . setController ( ) this . addHelper ( ) this . setPMREMGenerator ( ) this . setLight ( ) this . setMesh ( ) this . addStatus ( ) } , setScene ( )  { this . scene =  new  THREE. Scene ( ) this . scene. background =  textureCube; } , setCamera ( )  { this . camera =  new  THREE. PerspectiveCamera ( 60 ,  this . container. clientWidth /  this . container. clientHeight,  1 ,  100000 ) this . camera. position. set ( 0 ,  0 ,  3200 ) this . camera. aspect =  this . container. clientWidth /  this . container. clientHeight; this . camera. updateProjectionMatrix ( ) ; this . camera. lookAt ( new  THREE. Vector3 ( 0 ,  0 ,  0 ) ) this . scene. add ( this . camera) } , setRenderer ( )  { this . renderer =  new  THREE. WebGLRenderer ( { antialias :  true , logarithmicDepthBuffer :  true ,   } ) this . renderer. setSize ( this . container. clientWidth,  this . container. clientHeight) ; this . renderer. setPixelRatio ( window. devicePixelRatio) ; this . container. appendChild ( this . renderer. domElement) ; } , setEffect ( )  { this . effect =  new  StereoEffect ( this . renderer) this . effect. setSize ( this . container. clientWidth,  this . container. clientHeight) ; } , setController ( )  { this . controller =  new  OrbitControls ( this . camera,  this . renderer. domElement) ; this . controller. enableDamping =  true ;  this . controller. dampingFactor =  0.04 ;  } , addHelper ( )  { let  helper =  new  THREE. CameraHelper ( this . camera) ; let  axisHelper =  new  THREE. AxesHelper ( 150 ) ;   this . scene. add ( axisHelper) let  gridHelper =  new  THREE. GridHelper ( 100 ,  30 ,  0x2C2C2C ,  0x888888 ) ; this . scene. add ( gridHelper) ; } , setPMREMGenerator ( )  { const  pmremGenerator =  new  THREE. PMREMGenerator ( this . renderer) ; this . scene. environment =  pmremGenerator. fromScene ( new  RoomEnvironment ( this . renderer) ,  0.04 ) . texture; } , setLight ( )  { const  ambientLight =  new  THREE. AmbientLight ( 0x404040 ,  4 ) ; const  directionalLight =  new  THREE. DirectionalLight ( 0xffffff ,  1.0 ) ; const  test =  new  THREE. PointLight ( "#ffffff" ,  10 ,  2 ) ; const  testHelperMap =  new  THREE. PointLightHelper ( test) ; } , addStatus ( )  { this . stats =  new  Stats ( ) ; this . container. appendChild ( this . stats. dom) ; } , setMesh ( )  { textureCube. mapping =  THREE . CubeRefractionMapping; const  geometry =  new  THREE. SphereGeometry ( 100 ,  32 ,  16 ) ; const  material =  new  THREE. MeshBasicMaterial ( { color :  0xffffff , envMap :  textureCube, refractionRatio :  0.95 , } ) for  ( let  i =  0 ;  i <  500 ;  i++ )  { const  mesh =  new  THREE. Mesh ( geometry,  material) mesh. position. x =  Math. random ( )  *  10000  -  5000 mesh. position. y =  Math. random ( )  *  10000  -  5000 mesh. position. z =  Math. random ( )  *  10000  -  5000 mesh. scale. x =  mesh. scale. y =  mesh. scale. z =  Math. random ( )  *  3  +  1 this . scene. add ( mesh) this . spheres. push ( mesh) } } , onWindowSize ( )  { this . windowHalfX =  this . container. clientWidth /  2 ; this . windowHalfY =  this . container. clientHeight /  2 ; this . camera. aspect =  this . container. clientWidth /  this . container. clientHeight; this . camera. updateProjectionMatrix ( ) ; this . effect. setSize ( this . container. clientWidth,  this . container. clientHeight) ; } , onDocumentMouseMove ( event )  { this . mouseX =  ( event. clientX -  this . windowHalfX)  *  10 ; this . mouseY =  ( event. clientY -  this . windowHalfY)  *  10 ; } , animate ( )  { const  timer =  0.0001  *  Date. now ( ) ; this . camera. position. x +=  ( this . mouseX -  this . camera. position. x)  *  .05 ; this . camera. position. y +=  ( -  this . mouseY -  this . camera. position. y)  *  .05 ; this . camera. lookAt ( this . scene. position) ; for  ( let  i =  0 ;  i <  this . spheres. length;  i++ )  { const  sphere =  this . spheres[ i] ; sphere. position. x =  5000  *  Math. cos ( timer +  i) ; sphere. position. y =  5000  *  Math. sin ( timer +  i *  1.1 ) ; } const  delta =  this . clock. getDelta ( ) ; if  ( this . mixer)  { this . mixer. update ( delta) ; } requestAnimationFrame ( this . animate) ; this . controller. update ( delta) ; this . stats. update ( ) ; this . effect. render ( this . scene,  this . camera) ; } , } , 
} ; 
< / script> 
< style> 
#container { position :  absolute; width :  100 % ; height :  100 % ; 
} 
< / style> . lookAt ( x,  y,  z) this . controller. update ( delta) ; this . stats. update ( ) ; this . effect. render ( this . scene,  this . camera) ; } , } , 
} ; 
< / script> 
< style> 
#container { position :  absolute; width :  100 % ; height :  100 % ; 
} 
< / style>