简介
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框架包,引入自己的页面。
具体实现过程
准备一个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="/UploadFiles/2021-04-02/three.min.js">明确绘制思路
接下来的绘制过程会涉及到多个概念:canvas、scene、camera、renderer。
为了能更好理解绘制过程的代码和有助于记忆,我们先来理解这几个概念:
假设我们现在正在旅游的途中,看到了一个很唯美的画面,想把这个3D世界记录下来
- 这个唯美的场景就是scene,我们用相机camera拍摄下来形成照片
- 为了能看清楚这个照片,我们把这个照片放置在一个画布canvas上
- 最后,我们再用renderer修饰渲染一下
这样,我们就能成功展现这个3D世界了。
【程序还是很贴近生活哒"htmlcode">
<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);
经过以上步骤,我们的的正方体就成功创建好了。
以下是本例完整代码:
<!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="/UploadFiles/2021-04-02/three.min.js">总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】