利用three.js画一个3D立体的正方体示例代码


Posted in Javascript onNovember 19, 2017

简介

three.js 是一款WebGL框架,WebGL可以让我们在canvas上实现3D效果。实现3D效果在国内来说还算是比较新的东西,可供查阅的资料也不多。这篇文章仅是一个入门篇,介绍如何绘制一个3D正方体。

Three.js中的基本概念

Three.js包含3个基本概念:场景(Scene)、相机(Camera)和渲染器(Renderer)。

场景就是需要绘制的对象,相机代表取景的视角,渲染器是绘制的载体(可以挂靠到浏览器的DOM元素中),

也就是我们通过相机拍摄场景然后绘制到目标介质中去。

创建场景、相机和渲染器

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 );

上述代码首先创建一个场景,然后创建一个PerspectiveCamera(立体感的相机),接着创建了一个WebGL的渲染器(注意Three.js也支持非3D的Canvas 2D的渲染器),然后挂靠为HTML文档body的DOM子元素。

介绍完毕,首先奉上实现的效果图:

利用three.js画一个3D立体的正方体示例代码
这就是实现的效果图,还是挺有立体感的吧?

绘制前的准备

写代码前,要先下载最新的three.js框架包,引入自己的页面。

具体实现过程

准备一个canvas画布

这个画布是我们展现整个3D正方形的画布,也就是上图那个黑色的方框。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Camera 相机</title>
 <style>
 #canvas {
 width: 400px;
 height: 300px;
 border: 1px solid red;
 margin: 50px auto;
 display:block;
 }
 </style>
</head>
<body>
 <canvas id="canvas"></canvas>
 <script src="./libs/three.min.js"></script>
</body>
</html>

明确绘制思路

接下来的绘制过程会涉及到多个概念:canvas、scene、camera、renderer。

为了能更好理解绘制过程的代码和有助于记忆,我们先来理解这几个概念:

假设我们现在正在旅游的途中,看到了一个很唯美的画面,想把这个3D世界记录下来

  • 这个唯美的场景就是scene,我们用相机camera拍摄下来形成照片
  • 为了能看清楚这个照片,我们把这个照片放置在一个画布canvas上
  • 最后,我们再用renderer修饰渲染一下

这样,我们就能成功展现这个3D世界了。

【程序还是很贴近生活哒?】

通过现实世界的理解,我们接下来开始代码啦o( ̄? ̄)ブ

准备好canvas、scene、camera、renderer,给一个初始化的方法

<script>
var camera, scene, renderer, canvas;
init();
function init () {
 canvas = document.getElementById('canvas');
}

接下来我们要做的就是完善这个init()方法啦。

创建一个3D场景scene

场景最简单了,只需要用Scene声明一个scene对象。

scene = new THREE.Scene();

准备好camera

我们这里设置的相机是一个透视的相机PerspectiveCamera

camera有四个参数

  • 第一个参数是视线辐射的角度,这个参数越大,我们能看到的视觉越广,这个物体看上去会更小。
  • 第二个参数是图像内容展示的比例:width/height。我们一般把这个比例设置为和画布的比例一样,这样看到的图片才不会变形。
  • 第三四个参数分别是相机离展示内容(正方体)最近的距离和最远的距离。
camera = new THREE.PerspectiveCamera(45, 400/300, 1, 10);

接下来给camera设置摆放的位置,并把camera放到场景scene中

由于我们的世界是3D的,camera的摆放位置也是三维的,涉及三个参数:X轴、Y轴、Z轴。(0, 0, 0)是相机的原点,(1, 1, 5)就是把我们的相机往右和往上移动了1个单位,往后移动了5个单位。

ps: 这个时候画布canvas的大小正好是正方体的5倍。

camera.position.set(1, 1, 5);
scene.add(camera);

在场景中添加一个立方体

每个形状都是一个mesh,geometry可以理解为物体的骨骼, material可以理解为物体的皮囊

再创建一个可填充的形状cube

这样就构成了完整的实物

我们再将这个形状放入场景scene中

CubeGeometry参数设置为1:1:1表示这是一个正方体,当然可以自行修改比例,变成不一样的立方体

var geometry = new THREE.CubeGeometry(1, 1, 1);
// 添加three自带的最简单的一种材质
var material = new THREE.MeshBasicMaterial({
 color: 0xff0000,
});
var cube = new THREE.Mesh(geometry, material); 
var cube = new THREE.Mesh(geometry, material);

最后,创建renderer对图像进行渲染

将canvas交给renderer,也就是一个渲染的容器

antialias: true 平滑,抗锯齿,输出的画面会进行优化,不会带毛边

renderer = new THREE.WebGLRenderer({
 canvas: canvas,
 antialias: true
});
// 设置renderer的样式
renderer.setSize(canvas.width, canvas.height);
renderer.render(scene, camera);

经过以上步骤,我们的的正方体就成功创建好了。

利用three.js画一个3D立体的正方体示例代码

以下是本例完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Camera 相机</title>
 <style>
 #canvas {
 width: 400px;
 height: 300px;
 border: 1px solid red;
 margin: 50px auto;
 display:block;
 }
 </style>
</head>
<body>
 <canvas id="canvas"></canvas>
 <script src="./libs/three.min.js"></script>
 <script>
 var camera, scene, renderer, canvas;
 init();
 function init () {
 canvas = document.getElementById('canvas');
 scene = new THREE.Scene();
 camera = new THREE.PerspectiveCamera(45, 400/300, 1, 10);
 camera.position.set(1, 1, 5);
 scene.add(camera);

 var geometry = new THREE.CubeGeometry(1, 1, 1);
 var material = new THREE.MeshBasicMaterial({
 color: 0xff0000,
 });
 // cube 是一个可以填充的形状
 var cube = new THREE.Mesh(geometry, material);
 scene.add(cube);

 renderer = new THREE.WebGLRenderer({
 // 将canvas交给renderer 一个渲染的容器
 canvas: canvas,
 // 平滑, 抗锯齿 输出的画面会进行优化,不会带毛边
 antialias: true
 });
 // 设置renderer的样子
 renderer.setSize(canvas.width, canvas.height);
 renderer.render(scene, camera);
 }
 </script>
</body>
</html>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
在html页面上拖放移动标签
Jan 08 Javascript
jQuery AjaxQueue改进步骤
Oct 06 Javascript
Prototype源码浅析 String部分(四)之补充
Jan 16 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
May 30 Javascript
js、css、img等浏览器缓存问题的2种解决方案
Oct 23 Javascript
js获取当前页面路径示例讲解
Jan 08 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
Mar 13 Javascript
原生js三级联动的简单实现代码
Jun 07 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
Jan 05 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
Jan 19 Javascript
js中async函数结合promise的小案例浅析
Apr 14 Javascript
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
Nov 19 #Javascript
使用DataTable插件实现异步加载数据
Nov 19 #Javascript
原生JavaScript实现Ajax异步请求
Nov 19 #Javascript
gulp安装以及打包合并的方法教程
Nov 19 #Javascript
js实现rem自动匹配计算font-size的示例
Nov 18 #Javascript
如何编写一个完整的Angular4 FormText 组件
Nov 18 #Javascript
Angular中支持SCSS的方法
Nov 18 #Javascript
You might like
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
PHP页面中文乱码分析
2013/10/29 PHP
php之curl设置超时实例
2014/11/03 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
jQuery设置和获取HTML、文本和值示例
2014/07/08 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
用Python实现换行符转换的脚本的教程
2015/04/16 Python
在Python中使用Neo4j数据库的教程
2015/04/16 Python
python中的错误处理
2016/04/10 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
C和C++经典笔试题附答案解析
2014/08/18 面试题
临床医学专业毕业生的自我评价
2013/10/17 职场文书
全陪导游欢迎词
2014/01/17 职场文书
歌剧魅影观后感
2015/06/05 职场文书
网络妈妈观后感
2015/06/08 职场文书
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python
Python如何使用循环结构和分支结构
2022/04/13 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python