1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| var camera, scene, renderer; var isUserInteracting = false, onMouseDownMouseX = 0, onMouseDownMouseY = 0, lon = 0, onMouseDownLon = 0, lat = 0, onMouseDownLat = 0, phi = 0, theta = 0; init(); animate(); function init() { var container, mesh; container = document.getElementById( 'container' ); camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 1100 ); camera.target = new THREE.Vector3( 0, 0, 0 ); scene = new THREE.Scene(); var geometry = new THREE.SphereBufferGeometry( 500, 60, 40 ); // invert the geometry on the x-axis so that all of the faces point inward geometry.scale( -1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { map: new THREE.TextureLoader().load( 'textures/2294472375_24a3b8ef46_o.jpg' ) } ); mesh = new THREE.Mesh( geometry, material ); scene.add( mesh ); renderer = new THREE.WebGLRenderer(); renderer.setPixelRatio( window.devicePixelRatio ); // 防止在retina等屏幕上出现图像变形等显示问题 renderer.setSize( window.innerWidth, window.innerHeight ); container.appendChild( renderer.domElement ); document.addEventListener( 'mousedown', onDocumentMouseDown, false ); document.addEventListener( 'mousemove', onDocumentMouseMove, false ); document.addEventListener( 'mouseup', onDocumentMouseUp, false ); document.addEventListener( 'wheel', onDocumentMouseWheel, false ); // document.addEventListener( 'dragover', function ( event ) { event.preventDefault(); event.dataTransfer.dropEffect = 'copy'; }, false ); document.addEventListener( 'dragenter', function ( event ) { document.body.style.opacity = 0.5; }, false ); document.addEventListener( 'dragleave', function ( event ) { document.body.style.opacity = 1; }, false ); document.addEventListener( 'drop', function ( event ) { event.preventDefault(); var reader = new FileReader(); reader.addEventListener( 'load', function ( event ) { material.map.image.src = event.target.result; material.map.needsUpdate = true; }, false ); reader.readAsDataURL( event.dataTransfer.files[ 0 ] ); // 将读取到的文件编码成Data URL document.body.style.opacity = 1; }, false ); // window.addEventListener( 'resize', onWindowResize, false ); } function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth, window.innerHeight ); } function onDocumentMouseDown( event ) { event.preventDefault(); isUserInteracting = true; onMouseDownMouseX = event.clientX; onMouseDownMouseY = event.clientY; onMouseDownLon = lon; onMouseDownLat = lat; } function onDocumentMouseMove( event ) { if ( isUserInteracting === true ) { lon = ( onMouseDownMouseX - event.clientX ) * 0.1 + onMouseDownLon; // 0.1只是来控制速度 lat = ( event.clientY - onMouseDownMouseY ) * 0.1 + onMouseDownLat; } } function onDocumentMouseUp( event ) { isUserInteracting = false; } function onDocumentMouseWheel( event ) { var fov = camera.fov + event.deltaY * 0.05; camera.fov = THREE.Math.clamp( fov, 10, 75 ); camera.updateProjectionMatrix(); } function animate() { requestAnimationFrame( animate ); update(); } function update() { // if ( isUserInteracting === false ) { // lon += 0.1; // } lat = Math.max( - 85, Math.min( 85, lat ) ); // 上下滑动距离控制在 -85 和 +85之间 来设置纬度 console.log('lat', lat); console.log('lon', lon); phi = THREE.Math.degToRad( lat ); // 角度( 85-负85度!!!!)转弧度 theta = THREE.Math.degToRad( lon ); // 角度转弧度 // 自己做的公式 camera.target.x = 500 * Math.cos( theta ); camera.target.y = 500 * Math.sin( phi ); camera.target.z = 500 * Math.sin( theta ); // 原版公式 // camera.target.x = 500 * Math.sin( phi ) * Math.cos( theta ); // camera.target.y = 500 * Math.cos( phi ); // camera.target.z = 500 * Math.sin( phi ) * Math.sin( theta ); camera.lookAt( camera.target ) ; /* // distortion camera.position.copy( camera.target ).negate(); */ renderer.render( scene, camera ); }
|