初识webgl--我的webgl学习第一课(基于threeJs)
一,我为什么要学习webgl
一个偶然的机会,在和朋友的聊天过程中,听说了webgl,也许过去也看到过,但是没有特别在意过。原来,JavaScript也可以很好的渲染并在网页上显示三维动画,不用借助插件,听起来是一个很棒的事情。大学的时候,计算机老师让我们课后学习3Dmax,种种原因,并没有听老师的话,但是,却一直希望能够接触一下三维世界。现在,我喜欢的JavaScript也可以实现三维动画效果,当然有点小惊喜,既然如此,何不借此机会,了解webgl的同时,巩固下自己的JavaScript基础呢?
其二,有句话说的很好,活到老,学到老,更何况,还没有老,那还不赶快多学一学一些很有挑战性的东西,充实下自己的精神生活,不浪费大脑资源。
二,threeJs基础知识总结
1.组成三维场景的基本要素:场景,相机,渲染器。
三维场景,立体空间,和我们生活的现实世界很相似。通过照片或者视频,我们只能看到物体片面的状态,也就是作者想要展示给你看的那个面。但是,现实生活中我们可以手动移动物体,得到一个全面的状态,这就是三维的优点之一吧,我们将拥有更多的控制权。不过,不同于现实生活的是,在threeJs里面,最初的世界是一片空,场景就相当于造物主创造一个新世界,先创造大环境,容纳所有生物,然后按照自己的喜好或者需求添加生物。新世界创造好了,接下来需要一个可以看懂新世界的眼睛,把新世界的点点滴滴传给一个能够理解这个眼睛所传来的图像的大脑,经过一系列处理,把这些图像信息还原为我们人类的眼睛能够看懂的内容,展示给我们。所以,场景可以理解为造物主,相机可以理解为能够看懂场景这个造物主的构成的眼睛,而渲染器呢,就是能够把眼睛看到的新世界展示给我们的那个特殊的大脑。
总结一下,用threeJs官方的话来说呢就是: render the scene with camera.
即:我们通过相机来把场景渲染到页面上。
接下来,看一个具体的例子:
<!DOCTYPE html>
<html> <head>
<meta charset="utf-8" />
<title>mytestOne</title>
<style>
#scene {width: 400px;height: 400px;margin: 10% auto;}
</style>
<script src="js/three.js"></script>
</head> <body>
<button onclick="render()">开始执行</button>
<div id="scene"></div>
<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(400, 400);//设置渲染器的尺寸
document.getElementById('scene').append(renderer.domElement);//把场景容器添加到页面,使场景能够被我们看到。
var geometry=new THREE.CubeGeometry(1,1,1);//定义几何体,将来添加到场景中
var material=new THREE.MeshBasicMaterial({
color: 0xBDC1F4
});//定义材质,用来渲染几何体
var cube=new THREE.Mesh(geometry,material);//用几何体和材质,渲染立方体。
scene.add(cube);//把立方体添加到场景中
camera.position.z=5;//相机距离的远近,影响了物体的大小
//渲染函数,让立方体完成旋转的动画。
function render(){
requestAnimationFrame(render);
cube.rotation.x+=0.1;
cube.rotation.y+=0.1;
renderer.render(scene,camera);
};
</script>
</body> </html>
单击开始运行时,触发渲染函数,整个立方体就会在场景中动起来。
上面的写法是一个简单例子的写法,场景,相机还有渲染器都是最基础的,不复杂,所有我们按照顺序写,但是如果是大型场景,很复杂,这样写不利于阅读。也就是代码不友好,我们可以分模块来写,比如,专门的渲染器函数,场景函数,几何体函数等等,把功能按照模块封装起来,最后再统一调用,举个例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>mytestTwo</title>
<script type="text/javascript" src="js/three.js" ></script>
<style type="text/css">
#scene-wrap {
border: none;
cursor: pointer;
width: 400px;
height: 400px;
background-color: #BDC1F4;
}
</style>
</head>
<body>
<button onclick="start()">start</button>
<div id="scene-wrap"></div>
</body>
<script>
var width=document.getElementById('scene-wrap').clientWidth;
var height=document.getElementById('scene-wrap').clientHeight;
//定义渲染器,同时设置宽高并把它添加到页面节点中。
var renderer;
function initThree(){
renderer=new THREE.WebGLRenderer({antialias:true});
renderer.setSize(width,height);
document.getElementById('scene-wrap').append(renderer.domElement);
renderer.setClearColor(0x00FF00, 1.0);
}
//定义相机
var camera;
function initCamera(){
camera=new THREE.PerspectiveCamera(45,width/height,1,1000);
camera.position.x=0;
camera.position.y=1000;
camera.position.z=0;
camera.up.x = 0;
camera.up.y = 0;
camera.up.z = 1;
camera.lookAt({
x: 0,
y: 0,
z: 0
});
}
//定义场景
var scene;
function initScene(){
scene=new THREE.Scene();
}
//定义灯光
var light;
function initLight(){
light=new THREE.DirectionalLight(0xFF0000, 1.0, 0);
light.position.set(100,100,200);
scene.add(light);//给场景添上灯光
}
//定义几何体
var cube;
function initObject(){
var geometry=new THREE.Geometry();
var material=new THREE.LineBasicMaterial({
vertexColors:THREE.VertexColors
});
var color1=new THREE.Color(0x00ff00);
var color2=new THREE.Color(0x0000ff);
var p1=new THREE.Vector3(-100,0,100);
var p2=new THREE.Vector3(100,0,-100);
geometry.vertices.push(p1);
geometry.vertices.push(p2);
geometry.colors.push(color1,color2);
var line=new THREE.Line(geometry,material,THREE.LinePieces);
scene.add(line);//在场景中添加物体
}
//定义渲染函数
function render(){
renderer.clear();
renderer.render(scene,camera);//使用相机将渲染的场景展示在浏览器中
requestAnimationFrame(render);
}
//触发函数
function start(){
initThree();
initCamera();
initScene();
initLight();
initObject();
render();
}
</script>
</html>
这样,我们只关注于每个模块内部的东西,逻辑就会很清晰。
好了,回归本小节主体,我们可以发现,如果想要用threeJs创建一个三维场景或者说创造一个新世界,那么我们离不开三个要素,场景,相机还有渲染器。换句话说就是造物主,眼睛还有大脑。O(∩_∩)O哈哈~
OK,文章太长好像容易让人生烦,欲知后事如何,且听下回分解。
初识webgl--我的webgl学习第一课(基于threeJs)的更多相关文章
- Magento学习第一课——目录结构介绍
Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...
- Elasticsearch7.X 入门学习第一课笔记----基本概念
原文:Elasticsearch7.X 入门学习第一课笔记----基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...
- MFC学习-第一课 MFC运行机制
最近由于兴趣爱好,学习了孙鑫的MFC教程的第一课.看完视频了,自己便用visual studio 2010尝试了MFC编程,其中遇到了一些问题. 1.vs2010不像vs6.0那样可以新建一个空的MF ...
- python学习第一课要点记录
写在要点之前的一段话,留给将来的自己:第一次参加编程的培训班,很兴奋很激动,之前都是自己在网上找免费的视频来看,然后跟着写一些课程中的代码,都是照着模子写,没有自己过多的思考.感觉这样学不好,除了多写 ...
- python学习第一课
第一课: 1.不要使用来路不明的软件 2.下载杀毒软件 3.不懂技术的人在技术人面前会显得愈发无知 4.python无所不能 需要掌握的知识: 1.python基本语法 2.文件处理 3.函数 4.模 ...
- JAVA学习第一课(初识JAVA)
PS:退ACM集训队了,自己也疯玩了两天,后天就开学了,就正式大二了,该收收心好好学习啦 ...
- Kotlin学习第一课:从对比Java开始
1. 介绍 今年初,甲骨文再次对谷歌所谓的安卓侵权使用Java提起诉讼,要求后者赔偿高达90亿美元.随后便传出谷歌因此计划将主力语言切换到苹果主导的Swift,不过这事后来没了跟进. 但谷歌在这两天的 ...
- Asp.net MVC4高级编程学习笔记-视图学习第一课20171009
首先解释下:本文只是对Asp.net MVC4高级编程这本书学习记录的学习笔记,书本内容感觉挺简单的,但学习容易忘记,因此在边看的同时边作下了笔记,可能其它朋友看的话没有情境和逻辑顺序还请谅解! 一. ...
- Git速成学习第一课:创建版本库与版本回退
Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 我太困了0.0精神点再写...... /*我来啦!以后会陆续更新自己的学习笔记*/ Git是分布 ...
随机推荐
- C语言作业--数组
一.PTA实验作业 题目1:7-5 数组循环左移 1. 本题PTA提交列表 2. 设计思路 定义俩个整数 n,m 定义循环变量i,j,x 定义变量k用来存放下标 定义变量number用于交换数值 定义 ...
- 1013团队Beta冲刺日志集合帖
Beta预备 Beta冲刺day1 Beta冲刺day2 Beta冲刺day3 Beta冲刺day4 Beta冲刺day5 Beta冲刺day6 Beta冲刺day7 用户使用调查报告 Beta冲刺总 ...
- Flask 学习 四 数据库
class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primary_key=True) name = db.Co ...
- 关于mule中Spring使用中的一个问题
在mule中连接数据库时,大家通常喜欢使用spring的数据库连接以及bean的配置,但是在使用时会出现一些问题,即bean无法找到,这些,就是需要把bean的id属性改成name属性:可能是因为mu ...
- nyoj 正数性质
整数性质 时间限制:500 ms | 内存限制:65535 KB 难度:1 描述 我们知道,在数学中,对于任意两个正整数a和b,必定存在一对整数s.t使得sa+tb=gcd(a,b). 输 ...
- php的调试工具xdebug
zend_extension = "D:/developsoftware/wamp/bin/php/php5.5.12/zend_ext/php_xdebug-2.2.5-5.5-vc11- ...
- 解决SoapFault (looks like we got no XML document)问题
今天在调试项目的时候出现下面的错误信息: SoapFault looks like we got no XML document (D:\phpStudy\WWW\self.shop.xunmall. ...
- c++中模板是什么?为什么要定义模板?
一.c++中模板是什么? 首先: int Max(int x, int y) { return x > y ? x : y; } float Max(float a,float b) { ret ...
- JavaScript正则表达式学习笔记(二) - 打怪升级
本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...
- build.gradle & gradle.properties
一.build.gradle buildscript { ext { springBootVersion = '1.5.9.RELEASE' } repositories { maven { cred ...