网页3D效果库Three.js初窥
网页3D效果库Three.js初窥
背景
一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手
ThreeJs官网
ThreeJs-github;
接下来我会陆续翻译 Three.js官网的文档,部分文字和代码为我个人添加。
第一部分:three.js介绍
创建场景
这部分的目标是为Three.js做一个简单的介绍,我们会以创建一个场景,一个旋转的立方里开始,文章的结尾会有一个可运行的完整示例为你解惑。
开始之前
在你使用Three.js之前,你需要在你的电脑上建立文件存放下面的html,并需要建立js目录将three.js放入,打开浏览器浏览。
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<title>My first Three.js app</title>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100% }
</style>
</head>
<body>
<script src="js/three.js"></script>
<script>
// Our Javascript will go here.
</script>
</body>
</html>
好了,接下来的代码都放进空的script标签里
创建场景
事实上使用Three.js创建任何可显示的效果,都需要三样东西:场景,相机,渲染器,我们可以通过相机渲染场景.
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSIze(window.innerWidth,window.innerHeight);
document.body.appendChild(renderer.domElement);
让我们花点时间解释下上面的代码做了些什么,现在我们建立了场景,相机和渲染器
Three.js有几种不同的相机,现在我们使用PerspectiveCamera.第一个属性是视角,我们可以把相机理解为我们的眼睛,
第二个属性是宽高比,你通常希望使用元素的宽度除以高度,或者理解为当你在一个宽屏电视上看一个老电影是也会得到这种结果-图像会被拉伸,接下来的两个属性是远近剪切面,什么意思呢?字面上意思是:物体远离相机的far值或者比相机的near值还要近都不会被渲染!
看到这个我有点懵逼查了半天 投影矩阵 这篇文章讲的大概能看懂是什么意思。你现在不用担心这个,但是你可能会在你的app里使用其它值来达到更好的展现 !
接下来时渲染器,这是最神奇的地方,除了WebGLRenderer之外在这里使用其它的东西来兼容老的浏览器活着不支持WebGl的浏览器。
除了创建renderer实例,我们还需要设置渲染的尺寸,最好使用浏览器的宽度高度来填充应用,考虑性能,你仍可以setSize小的values。比如:window.innerWidth/2和 window.innerHeight/2,这样可以渲染半个屏幕
如果你想保持渲染的尺寸,但渲染在一个低分辨率的设备上,你可以调用setSize的updateStyle(第三个属性)设置为false,比如
setSize(window.innerWidth/2, window.innerHeight/2, false)
这样将会渲染在低分辨率的设备上但Canvas 100%显示
最后,我们添加渲染元素到HTML文档,这是一个canvas标签的渲染器来展示场景
"这非常好,但是立方体呢" 让我们继续
var geometry = new THREE.BoxGeometry(1,1,1);
var material = new THREE.MeshBasicMaterial({color:0x00ff00});
var cube = new THREE.Mesh(geometry,material);
scene.add(cube);
camera.position.z = 5
创建一个立方体,我们需要BoxGeometry,这是一个包含点,面,填充物的立方题对象,我们会在后面细细讲。
除了geometry,我们还需要material给它上色,Three.js有许多的materia,但我们现在使用MeshBasicMaterial,所有的meterial需要一个对象的属性将被应用,为了简单其间,我们只支持颜色属性0x00ff00绿色,跟css和photoshop的颜色一样
第三个事是我们需要一个Mash,mash是一个对象需要一个geometry和一个material,然后我们可以插入到场景中,也可以自由移除,
默认情况下,当我们调用scene.add(),我们将添加到坐标(0,0,0)。这将导致相机和cube在彼此内部。为了避免这种情况,我们将镜头移出一点。
渲染场景
如果你从上面的代码复制到我们创建的HTML文件之前,您无法看到任何东西。这是因为我们还没有呈现任何。为此,我们需要渲染循环
function render(){
requestAnimationFrame(render);
renderer.render(scne,camera);
}
render();
这将创建一个循环使渲染器每秒60次的频率绘画。如果你在写浏览器游戏,你可能会说“为什么我们不创建一个setInterval ?其实我们是可以的,但requestAnimationFrame有许多优点。最重要的是当用户导航到另一个浏览器选项卡它暂停,因此不浪费他们宝贵的处理能力和电池寿命。可以在控制台试试下面这段代码,切换tab观察!
function render(){
requestAnimationFrame(render);console.log(1);
}
render();
使cube动起来
如果将上面所有的代码插入到我们开始创建的文件上,您应该看到一个绿色的盒子。接下来让它更有趣的旋转。
添加下面的代码到渲染器,调用renderer.render 在render函数里
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;
每一帧的运行(60次/秒),并使立方体旋转动画。基本上,任何你想要移动或改变应用程序运行时必须经过渲染循环。你当然可以调用其他函数,这样你就不会得到一个数百行的渲染函数。
写在最后
恭喜你,你完成了你的第一个Three.js的应用,很简单,但你有了个起点!
下面提供了完整的代码,它可以让你更好的理解它是如何工作的
<html>
<head>
<title>My first Three.js app</title>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100% }
</style>
</head>
<body>
<script src="js/three.js"></script>
<script>
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;
var render = function () {
requestAnimationFrame( render );
cube.rotation.x += 0.1;
cube.rotation.y += 0.1;
renderer.render(scene, camera);
};
render();
</script>
</body>
</html>
总结
- 创建一个场景 scene
- 创建一个相机 camera
- 创建一个渲染器 renderer
- 设置渲染器的宽高度
- 将渲染器元素插入文档
- 创建盒子的几何(房子结构) geometry
- 创建盒子的材料(装修) meterial
- 创建一个完整的盒子 Mesh(geomety,meterial)
- 将创建好的盒子塞到创建的场景中
- 循环渲染
网页3D效果库Three.js初窥的更多相关文章
- 网页3D效果库Three.js学习[二]-了解照相机
camera 上篇大致了解了three.js ,并可以创建一个简单的可动的立方体.下来我们着重了解下camera (照相机),照相机其实就是视角,就像你的眼睛.Three.js有两种不同的相机模式:直 ...
- 使用Three.js网页引擎创建酷炫的3D效果的标签墙
使用Three.js引擎(这是开源的webgl三维引擎,gitgub)进行一个简单应用. 做一个酷炫的3d效果的标签墙(已经放在我的博客首页,大屏幕可见), 去我的博客首页看看实际效果 www.son ...
- Three.js - 网页3D应用的普及已经指日可待了
Three.js可以高效实现3D效果,真不赖.
- js算法初窥05(算法模式02-动态规划与贪心算法)
在前面的文章中(js算法初窥02(排序算法02-归并.快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而 ...
- JS实现 类似图片3D效果
其实这样的效果 目前很多网站上都有 其实以前也写过一个 只是当时代码只是为了实现而已,代码很乱,所以现在有业余时间研究了下,其实也并没有什么特殊地方 很类似于左右控制按钮切换图片的思路.效果如下: 可 ...
- C++拾遗(二)——初窥标准库类型
本篇博文的开始,先介绍一道书上看到的智力题:有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸.有一台称重精准的天平,只是用一次天平的情况下如何找出比较重的那瓶药丸? 好了,直 ...
- 如何查看一个网页特定效果的js代码(动画效果可js和css)(页面可以看到js的源代码)
如何查看一个网页特定效果的js代码(动画效果可js和css)(页面可以看到js的源代码) 一.总结 1.动画效果可能是 CSS 实现的,也可能是 JS 实现的. 2.直接Chrome的F12调试即可, ...
- 拜托,使用Three.js让二维图片具有3D效果超酷的好吗 💥
声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 逛 sketchfab 网站的时候我看到有很多二维平面转 3D 的模型例子 ...
- 【js】使用javascript 实现静态网页分页效果
<!DOCTYPE html> <html> <head> <meta http-equiv="content-Type" content ...
随机推荐
- RelativeLayout相对布局属性
RelativeLayout用到的一些重要的属性: 第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:layout_center ...
- Calculation
定义一个Strategy接口,其中定义一个方法,用于计算 using System; using System.Collections.Generic; using System.Linq; usin ...
- spark history-server的使用
为什么需要historyServer? 在运行Spark Application的时候,Spark会提供一个WEBUI列出应用程序的运行时信息:但该WEBUI随着Application的完成(成功/失 ...
- paper 60 :转载关于视觉SCI期刊
ChanLee_1整理的计算机视觉领域稍微容易中的期刊 模式识别,计算机视觉领域,期刊 (1)pattern recognition letters, 从投稿到发表,一年半时间 (2)Pattern ...
- paper 50 :人脸识别简史与近期进展
自动人脸识别的经典流程分为三个步骤:人脸检测.面部特征点定位(又称Face Alignment人脸对齐).特征提取与分类器设计.一般而言,狭义的人脸识别指的是"特征提取+分类器"两 ...
- js 获取选中的多选框
前台html <span class="spbox"> <input type="checkbox" name="category& ...
- PAT乙级 1026. 程序运行时间(15)
1026. 程序运行时间(15) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 要获得一个C语言程序的运行时间, ...
- 使用 TC 对LInux中vpn 上传下载进行限速(转)
TC 无需安装,Linux 内核自带 例:将vpn IP地址段192.168.1.0/24 上传下载限速为 5M 将以下内容添加到/etc/ppp/ip-up文件exit 0上面. down=5Mbi ...
- SEO之链接农场、内容农场、微信内容农场
SEO之链接农场.内容农场.微信内容农场 一.“内容农场”的上市之路http://www.neweekly.com.cn/newsview.php?id=3330里斯2006年的第二次创业仍旧延续了上 ...
- Access数据库导入到SQL Server 2005 Express中
安装好SQL Server 2005 Express后,再安装SQL Server Management Studio Express CTP就可以很方便的使用控制台进行数据库的管理.但SQL Ser ...