上一面讲述了向场景中添加物体对象。这一篇准备把每个功能点细细的讲述一遍,一方面是为了加深自己的理解。另一方面希望能够

帮助到有需要的人。

一、在学习WEBGL的时候,你应该先了解要创建一个WebGL程序需要哪些步骤。就跟弄梅菜扣肉一样,需要哪些步骤。

  • 初始化WebGL绘图上下文
  • 初始化着色器程序
  • 建立模型和数据缓存
  • 完成绘制和动画

这是一个面向过程编程。然而three.js不一样,是一个面向对象编程。主要构建三个对象 scene(场景) camera(相机) renderer(渲染器).。

这三个东西是什么意思呢?听起来完全不懂是啥。举个小列子:就拿电影来说。场景(scene)就好比整个布局空间,相机(camera)相当于

拍摄期。而渲染器相当于(renderer)把拍摄的电影转换成胶卷也就是电脑的屏幕。

场景和空间包含了3D和数据模型,而renderer包含了着色器和WebGL绘图上下文。

二、THREE.JS创建场景,相机,渲染器

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo1(three入门第一篇)</title>
</head>
<body> </body>
<script type="text/javascript" src="js/three.js"></script>
<script type="text/javascript">
var width = window.innerWidth, height = window.innerHeight;
var scene = new THREE.Scene(); //创建一个场景
var camera = new THREE.PerspectiveCamera(75,width/height,1,5000); //创建相机
/*
three.js创建相机的方式有很多种,其中最长用的是PerspectiveCamera();
远景相机,相当于人眼观察模式
肯定有人会有疑问,这几个参数是什么意思呢?
第一个 75 是 视角
width / height 相机拍摄面的长宽比,别问为什么这么写,我也没搞清楚。反正设置为窗口
的width/height图形就不会被压变形。
下面两个是近裁剪面。和远裁剪面。
*/
var renderer = new THREE.WebGLRenderer(); //s上一篇用的是CSS3DRenderer
//WebGLrenderer其实是用CANVAS渲染。
renderer.setSize(width,height);
document.getElementsByTagName('body')[0].appendChild(renderer.domElement);
</script>
</html>

电影,场景,胶卷都准备好了,那如何才能展示演员呢?也就是上面一篇说 的如何向场景中添加物体对象呢?

三、添加演员(3D立方体)。

 //演员进场
var geometry = new THREE.BoxGeometry(1,1,1);
//BoxGeometry(); 3D盒子模型。包含了立方体所有顶点和填充面的对象。
var material = new THREE.MeshBasicMaterial({color:'red'});
//有个几何模型,我们需要材料为其上色。我们采用的时候 网孔基础材料MeshBasicMaterial();
var mesh = new THREE.Mesh(geometry,material);
//需要一个网孔,来承载几何模型和材料
scene.add(mesh); //把这个网孔放置到场景中去。 camera.position.z = 5; //调节相机的位置。 renderer.render(scene,camera); //把画面转换成相机,并播放

这样这个演员就入镜了。

四、如何让这个演员动起来呢?

    //懂动起来。
function loop(){
requestAnimationFrame(loop);
mesh.rotation.x += 0.1; //X选择
mesh.rotation.y += 0.1; //Y旋转
renderer.render(scene,camera); //把画面转换成相机,并播放
}
loop();
//解释下requestAnimationFrame这个api
/*
requestAnimationFrame这个函数,它用来替代 setInterval, 这个新接口具备多个优点,
比如浏览器Tab切换后停止渲染以节约资源、
和屏幕刷新同步避免无效刷新、在不支持该接口的浏览器中能安全回退为setInterval。
简直就是动画神奇
*/

演员入镜,并有了,打动效果。第一个小短篇算完成了吧。

五、整个代码(本来想托管到githup上)。发现太慢了。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo1(three入门第一篇)</title>
</head>
<body> </body>
<script type="text/javascript" src="js/three.js"></script>
<script type="text/javascript">
var width = window.innerWidth, height = window.innerHeight;
var scene = new THREE.Scene(); //创建一个场景
var camera = new THREE.PerspectiveCamera(75,width/height,1,5000); //创建相机
/*
three.js创建相机的方式有很多种,其中最长用的是PerspectiveCamera();
远景相机,相当于人眼观察模式
肯定有人会有疑问,这几个参数是什么意思呢?
第一个 75 是 视角
width / height 相机拍摄面的长宽比,别问为什么这么写,我也没搞清楚。反正设置为窗口
的width/height图形就不会被压缩。
下面两个是近裁剪面。和远裁剪面。
*/
var renderer = new THREE.WebGLRenderer(); //s上一篇用的是CSS3DRenderer
//WebGLrenderer其实是用CANVAS渲染。
renderer.setSize(width,height);
document.getElementsByTagName('body')[0].appendChild(renderer.domElement); //演员进场
var geometry = new THREE.BoxGeometry(1,1,1);
//BoxGeometry(); 3D盒子模型。包含了立方体所有顶点和填充面的对象。
var material = new THREE.MeshBasicMaterial({color:'red'});
//有个几何模型,我们需要材料为其上色。我们采用的时候 网孔基础材料MeshBasicMaterial();
var mesh = new THREE.Mesh(geometry,material);
//需要一个网孔,来承载几何模型和材料
scene.add(mesh); //把这个网孔放置到场景中去。 camera.position.z = 5; //调节相机的位置。 //懂动起来。
function loop(){
requestAnimationFrame(loop);
mesh.rotation.x += 0.1; //X选择
mesh.rotation.y += 0.1; //Y旋转
renderer.render(scene,camera); //把画面转换成相机,并播放
}
loop();
//解释下requestAnimationFrame这个api
/*
requestAnimationFrame这个函数,它用来替代 setInterval, 这个新接口具备多个优点,
比如浏览器Tab切换后停止渲染以节约资源、
和屏幕刷新同步避免无效刷新、在不支持该接口的浏览器中能安全回退为setInterval。
简直就是动画神奇
*/ </script>
</html>

六、在WebGL中three.js扮演了重要的角色,然而中文api真的少。只有一个一个的慢慢累积。

Three.js入门篇(一)创建一个场景的更多相关文章

  1. 1. web前端开发分享-css,js入门篇

    关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...

  2. web前端开发分享-css,js入门篇(转)

    转自:http://www.cnblogs.com/jikey/p/3600308.html 关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人 ...

  3. web前端开发分享-css,js入门篇

    学习没有捷径,但学习是有技巧与方法.   一,css入门篇:   推荐书籍:css哪些事儿,精通css. 理由:css那些事儿,他是一本介绍css基础类的书,是入门的经典读物. 系统的介绍了css的选 ...

  4. Vue.js 入门:从零开始做一个极简 To-Do 应用

    Vue.js 入门:从零开始做一个极简 To-Do 应用 写作时间:2019-12-10版本信息:Vue.js 2.6.10官网文档:https://cn.vuejs.org/ 前言  学习 Vue ...

  5. cocos3.2中如何创建一个场景

    1.可以将一些比较通用的东西放到Common.h中,这是一个.h文件,必须手动添加,且保证在classes目录里 #ifndef __COMMON_H__ #define __COMMON_H__ # ...

  6. 【SSRS】入门篇(一) -- 创建SSRS项目

    原文:[SSRS]入门篇(一) -- 创建SSRS项目 在本篇中,您将学习如何在 SQL Server Data Tools (SSDT) 中创建报表服务器项目. 报表服务器项目用于创建在报表服务器中 ...

  7. Three.js 第一篇:绘制一个静态的3D球体

    第一篇就画一个球体吧 首先我们知道Three.js其实是一个3D的JS引擎,其中的强大之处就在于这个JS框架并不是依托于JQUERY来写的.那么,我们在写这一篇绘制3D球体的文章的时候,应该注意哪些地 ...

  8. Node.js 入门篇

    Node.js 使用C++开发的. Node.js是一个事件驱动服务端JavaScript环境,只要能够安装相应的模块包,就可以开发出需要的服务端程序,如HTTP服务端程序.Socket程序等. No ...

  9. Node.js实战1:创建一个新的Node项目。

    你也许在猜专业的Node开发如何创建一个新项目. 有Npm在 ,这会非常简单. 虽然你可以创建一个JS文件,并执行:node file.js,但我建议你使用npm init来先创建一个node项目,这 ...

随机推荐

  1. [CF1027F]Session in BSU[最小基环树森林]

    题意 有 \(n\) 门课程,每门课程可以选择在 \(a_i\) 或者 \(b_i\) 天参加考试,每天最多考一门,问最早什么时候考完所有课程. \(n\leq 10^6\). 分析 类似 [BZOJ ...

  2. HTTPS为什么又快又安全?

    一.基础:对称加密和非对称加密 对称加密 通信两端用一样的密钥加解密.如DES.AES. 优点:性能损耗低,速度快: 缺点:密钥存在泄露的可能. 非对称加密 通信两端各自持有对方的公钥及自己的私钥,通 ...

  3. Linux命令速记

    apropos 通过命令描述,找到匹配的所有命令 ZSH 包含了自动纠错机制,可以用来来替代 Bash 作为你的命令行 shell. 速记表 https://www.maketecheasier.co ...

  4. vs2015新功能和其他

    1.自2011版本开始开发式编译器发布:Roslyn,其提供的API可以侦测dll编译过程中访问和分析编译数据,传统的编译器都是黑盒子:源代码从黑盒子的一端进入,目标文件/程序集从另一端出来. 2.最 ...

  5. 应用.NET控制台应用程序开发批量导入程序。

    一.最近一直在调整去年以及维护去年开发的项目,好久没有在进行个人的博客了.每天抽了一定的时间在研究一些开源的框架,Drapper 以及NHibernate以及当前比较流行的SqlSuper框架 并进行 ...

  6. Jsp中格式化时间戳的常用标签

    接下来一段时间的记录,虽然不是一些什么全新的知识,但是作为后台开发人员都是应该必须掌握的前端基础技能,说实话,每一个后台程序员的短板就在于前端技能的弱而造就了不能更上一层楼.从今天开始,我将彻底开启菜 ...

  7. 利用Elasticsearch搭建全球域名解析记录

    前言 数据来源,由Rapid7收集并提供下载https://scans.io/study/sonar.fdns 下载Elasticsearch 2.3 ElasticSearch是一个基于Lucene ...

  8. Acer 4750G安装OS X 10.9 DP4(简版)

    一.下载os x 10.9懒人版:http://bbs.pcbeta.com/viewthread-1384504-1-1.html 二.用系统自带的磁盘分区工具划分一个5G左右的临时安装盘(新建分区 ...

  9. How to submit a package to PyPI

    How to submit a package to PyPI The other month a coworker of mine wanted to distribute a small wrap ...

  10. nginx正向vs反向代理

    1.概述 nginx的正向代理,只能代理http.tcp等,不能代理https请求.有很多人不是很理解具体什么是nginx的正向代理.什么是反向代理.下面结合自己的使用做的一个简介: 1)正向代理: ...