效果图

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会飞走飞回来的鸟的更多相关文章

  1. HTML5+JS 《五子飞》游戏实现(一)规则

    很久没写文章了,这个游戏其实已经写了有段时间了,一直没有完善,赶在新年之际,分享给大家. 该<五子飞>游戏,不是平常大家所说的<五子棋>,这个玩法简单,是我们老家儿时常玩的一种 ...

  2. HTML5+JS 《五子飞》游戏实现(八)人机对战

    要想实现人机对战,就必须让电脑自动下棋,而且要知道自动去查找对方的棋子,看看有没有可以挑一对的,有没有可以夹一个的,这样下起来才有意思. 当电脑用户下完棋后,电脑应立即搜索用户的棋子,然后如果没有被吃 ...

  3. HTML5+JS 《五子飞》游戏实现(四)夹一个和挑一对

    在第一章我们已经说了怎么才能“夹一个”以及怎样才能挑一对,但那毕竟只是书面上的,对码农来讲,我们还是用代码讲解起来会更容易了解. 为了更容易对照分析,我们先把路线再次贴出来: // 可走的路线 thi ...

  4. HTML5+JS 《五子飞》游戏实现(三)页面和棋盘棋子

    前面两节,我们已经对<五子飞>有个初步的认识,对走棋路线也有了基本的了解,现在里沃特继续跟大家分享HTML页面,另外把棋盘棋子也画出来. 演示地址:http://www.lyout.com ...

  5. HTML5+JS 《五子飞》游戏实现(七)游戏试玩

    前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:ht ...

  6. HTML5+JS 《五子飞》游戏实现(六)鼠标响应与多重选择

    上一章我们提到了如果有多条线上的棋子可以被吃掉,那么游戏需要提示用户,让用户选择吃哪条线上的.另外因为是网页游戏,所以一定要实现鼠标单击棋子可以进行操作. 当鼠标移动棋子上面后,切换鼠标指针为手形,移 ...

  7. HTML5+JS 《五子飞》游戏实现(五)移动棋子

    上一章 我们知道了怎么处理两个重要的吃棋动作,想要吃对方的棋子,首先得移动自己的棋子.现在里沃特跟大家分享分享,怎么移动棋子. 想要移动棋子,在页面上,首先要点击一下要移动的棋子,然后再点击一下目标位 ...

  8. 让 ASP.NET vNext 在 Mac OS 中飞呀飞。。。

    写在前面 阅读目录: 娓娓道来 Install ASP.NET vNext Command Line Tools 安装 Homebrew 使用 Homebrew,安装 KVM Install Subl ...

  9. HTML5+JS 《五子飞》游戏实现(二)路线分析和资源准备

    上一节 里沃特与我们分享了<五子飞>的下棋规则,可能有些伙伴看得不清楚,像我们码农还是看到代码比较靠谱.下面就把可以走棋的路线跟大家说一下. 假设从左上角开始,以0开始编号,往右数(没看第 ...

随机推荐

  1. git一个系列教程

    https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%BA%8E%E7%89%88%E6%9C%AC%E6%8E%A7%E5%8 ...

  2. js中关于json常用的内容、js将数字保留两位小数

    没什么好说的  保存起来  以后有个地方找 var json=eval("[]") //json定义 var s={"id":"xxx",& ...

  3. jQ通过cookie记住用户名

    总结要点: 一.封装的一个cookie函数: 二.获取input的value值:$("input[name=user]").val() 三.设置input的value值:$(&qu ...

  4. 【lightoj-1055】Going Together(BFS)

    链接:http://www.lightoj.com/volume_showproblem.php?problem=1055 类似推箱子的游戏,一条命令可以让abc三个小人同时移动,但是出界或者撞墙是不 ...

  5. PostgreSQL窗口函数(转)

    转自:http://time-track.cn/postgresql-window-function.html PostgreSQL提供了窗口函数的特性.窗口函数也是计算一些行集合(多个行组成的集合, ...

  6. get传输时,会将加号+ 转换为空格

    解决办法: 前端: 替换加号为 ‘%2B’, 后端: 直接接收即可.

  7. struts2逻辑视图类型汇总与解释(转)

    在struts2框架中,当action处理完之后,就应该向用户返回结果信息,该任务被分为两部分:结果类型和结果本身. 结果类型提供了返回给用户信息类型的实现细节.结果类型通常在Struts2中就已预定 ...

  8. 【英语】Bingo口语笔记(82) - go系列

  9. ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)

     目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...

  10. 分布式使用Redis

    为什么我们做分布式使用Redis? https://www.cnblogs.com/yaodengyan/p/9717080.html 绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只 ...