Three.js会飞走飞回来的鸟
效果图
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
(function(){
var controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.maxPolarAngle = Math.PI * 0.5;
controls.minDistance = 1000;
controls.maxDistance = 5000;
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 );
})();
// 加载模型
var mixers = [];
var clock = new THREE.Clock();
var birdmesh;
(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 loader = new THREE.GLTFLoader();
loader.load( './static/models/gltf/Flamingo.glb', function( gltf ) {
birdmesh = gltf.scene.children[ 0 ];
var s = 0.35;
birdmesh.scale.set( s, s, s );
birdmesh.position.y = 15;
birdmesh.rotation.y = -1;
birdmesh.castShadow = true;
birdmesh.receiveShadow = true;
scene.add( birdmesh );
var mixer = new THREE.AnimationMixer( birdmesh );
mixer.clipAction( gltf.animations[ 0 ] ).setDuration( 1 ).play();
mixers.push( mixer );
} );
})();
// var rotateY = new THREE.Matrix4().makeRotationY( 0.005 );
var step = -2;
var flag = true;
var animate = function () {
requestAnimationFrame(animate);
// camera.applyMatrix( rotateY );
// camera.updateMatrixWorld();
var delta = clock.getDelta();
for ( var i = 0; i < mixers.length; i ++ ) {
mixers[ i ].update( delta );
}
if(birdmesh != null) {
if(birdmesh.position.x == -1000) {
flag = false;
}
if(birdmesh.position.x == 1000) {
flag = true;
}
if(flag){
birdmesh.rotation.y = -1;
birdmesh.position.x += step;
birdmesh.position.z -= (step+0.2);
}else {
birdmesh.rotation.y = 2.3;
birdmesh.position.x -= step;
birdmesh.position.z += (step+0.2);
}
}
stats.begin();
renderer.render( scene, camera );
stats.end();
};
animate();
Three.js会飞走飞回来的鸟的更多相关文章
- HTML5+JS 《五子飞》游戏实现(一)规则
很久没写文章了,这个游戏其实已经写了有段时间了,一直没有完善,赶在新年之际,分享给大家. 该<五子飞>游戏,不是平常大家所说的<五子棋>,这个玩法简单,是我们老家儿时常玩的一种 ...
- HTML5+JS 《五子飞》游戏实现(八)人机对战
要想实现人机对战,就必须让电脑自动下棋,而且要知道自动去查找对方的棋子,看看有没有可以挑一对的,有没有可以夹一个的,这样下起来才有意思. 当电脑用户下完棋后,电脑应立即搜索用户的棋子,然后如果没有被吃 ...
- HTML5+JS 《五子飞》游戏实现(四)夹一个和挑一对
在第一章我们已经说了怎么才能“夹一个”以及怎样才能挑一对,但那毕竟只是书面上的,对码农来讲,我们还是用代码讲解起来会更容易了解. 为了更容易对照分析,我们先把路线再次贴出来: // 可走的路线 thi ...
- HTML5+JS 《五子飞》游戏实现(三)页面和棋盘棋子
前面两节,我们已经对<五子飞>有个初步的认识,对走棋路线也有了基本的了解,现在里沃特继续跟大家分享HTML页面,另外把棋盘棋子也画出来. 演示地址:http://www.lyout.com ...
- HTML5+JS 《五子飞》游戏实现(七)游戏试玩
前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:ht ...
- HTML5+JS 《五子飞》游戏实现(六)鼠标响应与多重选择
上一章我们提到了如果有多条线上的棋子可以被吃掉,那么游戏需要提示用户,让用户选择吃哪条线上的.另外因为是网页游戏,所以一定要实现鼠标单击棋子可以进行操作. 当鼠标移动棋子上面后,切换鼠标指针为手形,移 ...
- HTML5+JS 《五子飞》游戏实现(五)移动棋子
上一章 我们知道了怎么处理两个重要的吃棋动作,想要吃对方的棋子,首先得移动自己的棋子.现在里沃特跟大家分享分享,怎么移动棋子. 想要移动棋子,在页面上,首先要点击一下要移动的棋子,然后再点击一下目标位 ...
- 让 ASP.NET vNext 在 Mac OS 中飞呀飞。。。
写在前面 阅读目录: 娓娓道来 Install ASP.NET vNext Command Line Tools 安装 Homebrew 使用 Homebrew,安装 KVM Install Subl ...
- HTML5+JS 《五子飞》游戏实现(二)路线分析和资源准备
上一节 里沃特与我们分享了<五子飞>的下棋规则,可能有些伙伴看得不清楚,像我们码农还是看到代码比较靠谱.下面就把可以走棋的路线跟大家说一下. 假设从左上角开始,以0开始编号,往右数(没看第 ...
随机推荐
- xlearn安装
xlearn简介 xLearn is a high performance, easy-to-use, and scalable machine learning package, which can ...
- ubuntu14.04搭建Hadoop2.9.0集群(分布式)环境
本文进行操作的虚拟机是在伪分布式配置的基础上进行的,具体配置本文不再赘述,请参考本人博文:ubuntu14.04搭建Hadoop2.9.0伪分布式环境 本文主要参考 给力星的博文——Hadoop集群安 ...
- Intellij IDEA 配置Subversion插件实现步骤详解
在使用Intellij的过程中,突然发现svn不起效了,在VCS–>Checkout from Version Control中也未发现Subversion这一项.如下图: 一.原因查找 经过 ...
- win8里DNW的裸机程序下载
1. win8要装DNW驱动首先要禁止驱动数字签名(参考百度经验:http://jingyan.baidu.com/article/3f16e003d1f4612591c103ce.html) 2.然 ...
- Python基础学习(第2天)
第三课:序列(sequence) 1.序列是一种有顺序的元素的集合 序列可以包含1个或多个元素,也可以不包括任何元素: 序列中的元素可以是[基础数据类型]中任一种,也可以是[别的序列]. s1 = ( ...
- New Concept English three (38)
26w/m 45 Future historians will be in a unique position when they come to record the history of our ...
- PostgreSQL upset解决在插入过程中重复数据冲突
关于重复行问题: 在SQL Server中则可以自动排出重复行,不需要处理.在Oracle中经常遇到upsert语法,来排出冲突行.在PostgreSQL中,也需要手动排出重复行,否则会爆出错误,up ...
- vsftpd的530 Login incorrect错误解决方法 vsftpd登录错误
530 Login incorrect只有用匿名anonymous才可登录,其余所有用户都报530 Login incorrect错 复制代码 代码如下: local_enable=YESwrite_ ...
- [QT]问题记录-控件初始化导致程序异常关闭
qt新手,在设置 pushButton 的字体颜色时,出现软件异常闭,代码如下: 按钮的初始化在 ui->setupUi(this); 前边,会出现一下问题. 解决办法:将按钮的初始化在 u ...
- linux 系统监控某目录下文件及文件夹的变化
inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ~]# uname -r 2.6.32-22 ...