利用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 相关文章推荐
理解Javascript的call、apply
Dec 16 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
May 10 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
Oct 11 Javascript
JS常用函数和常用技巧小结
Oct 15 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
JS获得一个对象的所有属性和方法实例
Feb 21 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
Jun 04 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
Jun 07 Javascript
详解动画插件wow.js的使用方法
Sep 13 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
Jul 23 jQuery
微信小程序如何引用外部js,外部样式,公共页面模板
Jul 23 Javascript
微信小程序canvas绘制圆角base64图片的实现
Aug 18 Javascript
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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
javascript 写类方式之十
2009/07/05 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
jQuery访问json文件中数据的方法示例
2019/01/28 jQuery
一篇文章弄懂javascript中的执行栈与执行上下文
2019/08/09 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
Python 的 with 语句详解
2014/06/13 Python
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
python将时分秒转换成秒的实例
2019/12/07 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
平面设计师的工作职责
2013/11/21 职场文书
医学生就业推荐表自我鉴定
2014/03/26 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis