three.js 实现3D漫游
【three.js 实现3D漫游】使用three.js 实现3D漫游的简单实例。
在线观看:https://5wnkwjym2n.codesandbox.io/
源码如下:
three.js webgl - equirectangular panorama - 锐客网
>
body {
background-color: #000000;
margin: 0px;
overflow: hidden;
}#info {
position: absolute;
top: 0px;
width: 100%;
color: #ffffff;
padding: 5px;
font-family:Monospace;
font-size:13px;
font-weight: bold;
text-align:center;
}a {
color: #ffffff;
}
src="https://cdn.bootcss.com/three.js/r83/three.min.js">>
var imgUrl = 'https://daoket.github.io/img/three.jpg'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.SphereGeometry( 500, 60, 40 );
//SphereGeometry用来在三维空间内创建一个球体对象.
geometry.scale( - 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { //使用基本材质(BasicMaterial)的物体,渲染后物体的颜色始终为该材质的颜色,不会由于光照产生明暗、阴影效果
map: new THREE.TextureLoader().load(imgUrl)
} );
mesh = new THREE.Mesh( geometry, material );
//Mesh(图元装配函数)生成三维物体scene.add( mesh );
//网格添加到场景中renderer = new THREE.WebGLRenderer();
//定义渲染器
renderer.setPixelRatio( window.devicePixelRatio );
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 = https://www.it610.com/article/event.target.result;
material.map.needsUpdate = true;
}, false );
reader.readAsDataURL( event.dataTransfer.files[ 0 ] );
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;
onPointerDownPointerX = event.clientX;
onPointerDownPointerY = event.clientY;
onPointerDownLon = lon;
onPointerDownLat = lat;
}function onDocumentMouseMove( event ) {if ( isUserInteracting === true ) {lon = ( onPointerDownPointerX - event.clientX ) * 0.1 + onPointerDownLon;
lat = ( event.clientY - onPointerDownPointerY ) * 0.1 + onPointerDownLat;
}}function onDocumentMouseUp( event ) {isUserInteracting = false;
}function onDocumentMouseWheel( event ) {camera.fov += event.deltaY * 0.05;
camera.updateProjectionMatrix();
}function animate() {requestAnimationFrame( animate );
update();
}function update() {if ( isUserInteracting === false ) {lon += 0.1;
}lat = Math.max( - 85, Math.min( 85, lat ) );
phi = THREE.Math.degToRad( 90 - lat );
theta = THREE.Math.degToRad( lon );
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 );
}
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树
- 人脸识别|【人脸识别系列】| 实现自动化妆
- paddle|动手从头实现LSTM
- pytorch|使用pytorch从头实现多层LSTM