初识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是分布 ...
随机推荐
- 转载:解决微信OAuth2.0网页授权回调域名只能设置一个的问题
项目地址:https://github.com/HADB/GetWeixinCode 说明:微信项目很多,但是回调域名有限,经常使用,做个笔记. 解决微信OAuth2.0网页授权只能设置一个回调域名的 ...
- 语句in
Python :in在for中: for name in names: names='1','2','3','4','5' for name in names: print(names) in no ...
- OSM数据下载地址
1.OSM数据下载地址 官网下载: http://planet.openstreetmap.org/ GeoFabrik:http://www.geofabrik.de/ Metro Extracts ...
- C语言使用指针变量指向字符串,对字符串进行处理后再将指针移向开头为什么不能输出?(使用Dev-c++进行编译)
# include <stdio.h> # include <stdlib.h> int main() { char *point_1="aaaaaabbbbbbzz ...
- Beta敏捷冲刺每日报告——Day1
1.情况简述 Beta阶段Scrum Meeting 敏捷开发起止时间 2017.11.2 00:00 -- 2017.11.3 00:00 讨论时间地点 2017.11.2 晚9:30,电话会议会议 ...
- PTA題目的處理(三)
题目7-1 高速公路超速處罰 1.實驗代碼 #include <stdio.h> //#include <stdlib.h> int main() { int csp,lsp; ...
- iOS中CocoaPods的安装及错误详解
什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为"Pods"的依赖库(这些类库必须是Coc ...
- 201621123027 Week02-Java基本语法与类库
Week02-Java基本语法与类库 1.本周学习总结 关键词:基本语法,数据类型,包装类 本周讲了Java的基本数据类型和包装类: 数据类型主要分为八类(byte,short,int,long,do ...
- openfalcon
一.环境准备 操作系统:centos7(minimal,www.centos.org下载的包是CentOS-7-x86_64-Minimal-1611.iso) 1.1 更换阿里yum(个人习惯) 步 ...
- LeetCode & 118-Pascal's Triangle-Easy
Array Description: Given numRows, generate the first numRows of Pascal's triangle. For example, give ...