效果图

demo

import './index.css';

// stats
var stats;
(function(){
stats = new Stats();
document.body.appendChild( stats.dom );
})(); // gui
var gui;
(function(){
gui = new dat.GUI();
// var fn = new function() {
// this.rotationSpeed = 0.02;
// this.bouncingSpeed = 0.03 ;
// }
// gui.add(fn,'rotationSpeed', 0, 0.5);
// gui.add(fn,'bouncingSpeed', 0, 0.5);
})(); // renderer
var renderer;
(function(){
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
renderer.setPixelRatio( window.devicePixelRatio );
renderer.gammaInput = true;
renderer.gammaOutput = true;
document.body.appendChild(renderer.domElement);
})(); // scene
var scene;
(function(){
scene = new THREE.Scene();
scene.background = new THREE.Color( 0xcce0ff );
scene.fog = new THREE.Fog( 0xcce0ff, 500, 10000 );
})(); // 相机
var camera;
(function(){
camera = new THREE.PerspectiveCamera( 30, window.innerWidth / window.innerHeight, 1, 10000 );
camera.position.set( 1000, 50, 1500 );
camera.updateMatrix();
})(); // controls
var dragcontrols;
var mouse = new THREE.Vector2();
var raycaster;
var INTERSECTED;
var objects = []; (function(){
// var controls = new THREE.OrbitControls( camera, renderer.domElement );
// controls.maxPolarAngle = Math.PI * 0.5;
// controls.minDistance = 1000;
// controls.maxDistance = 5000;
dragcontrols = new THREE.TrackballControls( camera );
dragcontrols.rotateSpeed = 1.0;
dragcontrols.zoomSpeed = 1.2;
dragcontrols.panSpeed = 0.8;
dragcontrols.noZoom = false;
dragcontrols.noPan = false;
dragcontrols.staticMoving = true;
dragcontrols.dynamicDampingFactor = 0.3; var dragControls = new THREE.DragControls( objects, camera, renderer.domElement );
dragControls.addEventListener( 'dragstart', function ( event ) { dragcontrols.enabled = false; } );
dragControls.addEventListener( 'dragend', function ( event ) { dragcontrols.enabled = true; } ); document.addEventListener( 'mousemove', function(){
event.preventDefault();
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
}, false ); raycaster = new THREE.Raycaster();
raycaster.params.Points.threshold = 0.1; window.addEventListener('resize', function(){
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}, false);
})(); // 设置光源
(function(){
// 设置光源
var light = new THREE.DirectionalLight( 0xbbbbff, 1.5 ); light.position.set( -1000, 50, -1000 );
light.position.multiplyScalar( 1.3 );
light.castShadow = true; var textureLoader = new THREE.TextureLoader(); var textureFlare0 = textureLoader.load( "./static/textures/lensflare/lensflare0.png" );
var textureFlare1 = textureLoader.load( "./static/textures/lensflare/lensflare2.png" );
var textureFlare2 = textureLoader.load( "./static/textures/lensflare/lensflare3.png" ); var lensflare = new THREE.Lensflare(); lensflare.addElement( new THREE.LensflareElement( textureFlare0, 512, 0 ) );
lensflare.addElement( new THREE.LensflareElement( textureFlare1, 512, 0 ) );
lensflare.addElement( new THREE.LensflareElement( textureFlare2, 60, 0.6 ) ); light.add( lensflare ); scene.add( light ); var light = new THREE.HemisphereLight( 0xbbbbff, 0x444422 );
scene.add( light );
})(); // 加载模型
(function(){
// 地面
var loader = new THREE.TextureLoader();
var groundTexture = loader.load( './static/textures/terrain/grasslight-big.jpg' );
groundTexture.wrapS = groundTexture.wrapT = THREE.RepeatWrapping;
groundTexture.repeat.set( 25, 25 );
groundTexture.anisotropy = 16;
var groundMaterial = new THREE.MeshLambertMaterial( { map: groundTexture } );
var mesh = new THREE.Mesh( new THREE.PlaneBufferGeometry( 20000, 20000 ), groundMaterial );
mesh.position.y = - 250;
mesh.rotation.x = - Math.PI / 2;
mesh.receiveShadow = true;
mesh.name = "ground";
scene.add( mesh ); var geometry;
var object;
// 随机几何体
for(var i = 0; i < 10; i++) {
geometry = new THREE.BoxBufferGeometry( 50, 50, 50 );
object = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff } ) );
object.position.x = Math.random() * 800 - 400;
object.position.y = Math.random() * 800 - 400;
object.position.z = Math.random() * 800 - 400; object.rotation.x = Math.random() * 2 * Math.PI;
object.rotation.y = Math.random() * 2 * Math.PI;
object.rotation.z = Math.random() * 2 * Math.PI;
object.scale.x = Math.random() + 0.5;
object.scale.y = Math.random() + 0.5;
object.scale.z = Math.random() + 0.5; object.castShadow = true;
scene.add( object );
objects.push(object); } })(); // var rotateY = new THREE.Matrix4().makeRotationY( 0.005 );
var step = -2;
var flag = true;
var animate = function () {
requestAnimationFrame(animate); // camera.applyMatrix( rotateY );
// camera.updateMatrixWorld(); raycaster.setFromCamera( mouse, camera ); //calculate objects intersecting the picking ray
var intersects = raycaster.intersectObjects( scene.children ); if ( intersects.length > 0 ) {
if ( INTERSECTED != intersects[ 0 ].object ) {
if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );
INTERSECTED = intersects[ 0 ].object;
if(INTERSECTED.name != "ground"){
INTERSECTED.currentHex = INTERSECTED.material.emissive.getHex();
INTERSECTED.material.emissive.setHex( 0xff0000 );
} }
} else {
if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );
INTERSECTED = null;
} dragcontrols.update(); stats.begin();
renderer.render( scene, camera );
stats.end();
};
animate();

最新文章

  1. Catalan数
  2. maven多工程构建与打包
  3. MFC弹出模拟对话框
  4. 自定义DTD(myeclipser的XML提示功能)
  5. HDU 1507 Uncle Tom&#39;s Inherited Land*
  6. python并发编程之多进程
  7. iperf命令
  8. 使用JumpServer管理你的服务器
  9. javascript之location详解
  10. Kubernetes中的Configmap和Secret
  11. Python3-RabbitMQ 3.7.2学习——环境搭建(一)
  12. .NetCore程序发布到IIS上面
  13. python自动化之正则
  14. Git错误提示之:fatal: Not a git repository (or any of the parent directories): .git
  15. LOJ分块⑨题汇总
  16. 使用.net core 自带DI框架实现 延迟加载
  17. EasyFastCMS系列教学课程——1、三层框架的搭建
  18. atitti.atiNav 手机导航组件的设计
  19. Codeforces Round 253 (Div. 2)
  20. MMU——存储器管理单元

热门文章

  1. 【Python】循环设计
  2. 配置 Web 组件服务器 IIS 证书
  3. ARM汇编指令集4
  4. (转)程序员应该知道的10个eclipse调试技巧
  5. PostgreSQL流复制记录
  6. 如何使用google搜索
  7. python学习之面向对象(下)
  8. Python错误TypeError: write() argument must be str, not bytes
  9. 给UIButton设置阴影及动画组
  10. BZOJ3507 [Cqoi2014]通配符匹配