网页3D效果库Three.js初窥

简介: 背景一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手ThreeJs官网ThreeJs-github;接下来我会陆续翻译 Three.js官网的文档,部分文字和代码为我个人添加。

背景

一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手
ThreeJs官网
ThreeJs-github;
接下来我会陆续翻译 Three.js官网的文档,部分文字和代码为我个人添加。

第一部分:three.js介绍

创建场景

这部分的目标是为Three.js做一个简单的介绍,我们会以创建一个场景,一个旋转的立方里开始,文章的结尾会有一个可运行的完整示例为你解惑。

开始之前

在你使用Three.js之前,你需要在你的电脑上建立文件存放下面的html,并需要建立js目录将three.js放入,打开浏览器浏览。

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <title>My first Three.js app</title>
        <style>
            body { margin: 0; }
            canvas { width: 100%; height: 100% }
        </style>
    </head>
    <body>
        <script src="js/three.js"></script>
        <script>
            // Our Javascript will go here.
        </script>
    </body>
</html>

好了,接下来的代码都放进空的script标签里

创建场景

事实上使用Three.js创建任何可显示的效果,都需要三样东西:场景,相机,渲染器,我们可以通过相机渲染场景.

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

让我们花点时间解释下上面的代码做了些什么,现在我们建立了场景,相机和渲染器
Three.js有几种不同的相机,现在我们使用PerspectiveCamera.第一个属性是视角,我们可以把相机理解为我们的眼睛, 第二个属性是宽高比,你通常希望使用元素的宽度除以高度,或者理解为当你在一个宽屏电视上看一个老电影是也会得到这种结果-图像会被拉伸,接下来的两个属性是远近剪切面,什么意思呢?字面上意思是:物体远离相机的far值或者比相机的near值还要近都不会被渲染! 看到这个我有点懵逼查了半天 投影矩阵 这篇文章讲的大概能看懂是什么意思。你现在不用担心这个,但是你可能会在你的app里使用其它值来达到更好的展现 !

接下来时渲染器,这是最神奇的地方,除了WebGLRenderer之外在这里使用其它的东西来兼容老的浏览器活着不支持WebGl的浏览器。

除了创建renderer实例,我们还需要设置渲染的尺寸,最好使用浏览器的宽度高度来填充应用,考虑性能,你仍可以setSize小的values。比如:window.innerWidth/2和 window.innerHeight/2,这样可以渲染半个屏幕

如果你想保持渲染的尺寸,但渲染在一个低分辨率的设备上,你可以调用setSize的updateStyle(第三个属性)设置为false,比如 setSize(window.innerWidth/2, window.innerHeight/2, false) 这样将会渲染在低分辨率的设备上但Canvas 100%显示

最后,我们添加渲染元素到HTML文档,这是一个canvas标签的渲染器来展示场景

"这非常好,但是立方体呢" 让我们继续

var geometry = new THREE.BoxGeometry(1,1,1);
var material = new THREE.MeshBasicMaterial({color:0x00ff00});
var cube = new THREE.Mesh(geometry,material);
scene.add(cube);
camera.position.z = 5

创建一个立方体,我们需要BoxGeometry,这是一个包含点,面,填充物的立方题对象,我们会在后面细细讲。

除了geometry,我们还需要material给它上色,Three.js有许多的materia,但我们现在使用MeshBasicMaterial,所有的meterial需要一个对象的属性将被应用,为了简单其间,我们只支持颜色属性0x00ff00绿色,跟css和photoshop的颜色一样

第三个事是我们需要一个Mash,mash是一个对象需要一个geometry和一个material,然后我们可以插入到场景中,也可以自由移除,

默认情况下,当我们调用scene.add(),我们将添加到坐标(0,0,0)。这将导致相机和cube在彼此内部。为了避免这种情况,我们将镜头移出一点。

渲染场景

如果你从上面的代码复制到我们创建的HTML文件之前,您无法看到任何东西。这是因为我们还没有呈现任何。为此,我们需要渲染循环

function render(){
    requestAnimationFrame(render);
    renderer.render(scne,camera);
}
render();

这将创建一个循环使渲染器每秒60次的频率绘画。如果你在写浏览器游戏,你可能会说“为什么我们不创建一个setInterval ?其实我们是可以的,但requestAnimationFrame有许多优点。最重要的是当用户导航到另一个浏览器选项卡它暂停,因此不浪费他们宝贵的处理能力和电池寿命。可以在控制台试试下面这段代码,切换tab观察!

function render(){
    requestAnimationFrame(render);console.log(1);
}
render();

使cube动起来

如果将上面所有的代码插入到我们开始创建的文件上,您应该看到一个绿色的盒子。接下来让它更有趣的旋转。
添加下面的代码到渲染器,调用renderer.render 在render函数里

cube.rotation.x += 0.1;
cube.rotation.y += 0.1;

每一帧的运行(60次/秒),并使立方体旋转动画。基本上,任何你想要移动或改变应用程序运行时必须经过渲染循环。你当然可以调用其他函数,这样你就不会得到一个数百行的渲染函数。

写在最后

恭喜你,你完成了你的第一个Three.js的应用,很简单,但你有了个起点!

下面提供了完整的代码,它可以让你更好的理解它是如何工作的

<html>
    <head>
        <title>My first Three.js app</title>
        <style>
            body { margin: 0; }
            canvas { width: 100%; height: 100% }
        </style>
    </head>
    <body>
        <script src="js/three.js"></script>
        <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( window.innerWidth, window.innerHeight );
            document.body.appendChild( renderer.domElement );

            var geometry = new THREE.BoxGeometry( 1, 1, 1 );
            var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
            var cube = new THREE.Mesh( geometry, material );
            scene.add( cube );

            camera.position.z = 5;

            var render = function () {
                requestAnimationFrame( render );

                cube.rotation.x += 0.1;
                cube.rotation.y += 0.1;

                renderer.render(scene, camera);
            };

            render();
        </script>
    </body>
</html>

总结

  • 创建一个场景 scene
  • 创建一个相机 camera
  • 创建一个渲染器 renderer
  • 设置渲染器的宽高度
  • 将渲染器元素插入文档
  • 创建盒子的几何(房子结构) geometry
  • 创建盒子的材料(装修) meterial
  • 创建一个完整的盒子 Mesh(geomety,meterial)
  • 将创建好的盒子塞到创建的场景中
  • 循环渲染

本文翻译于three.js/doc/Introduction/creating a scene

目录
相关文章
|
4天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
29 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
4月前
|
存储 JavaScript 前端开发
使用JavaScript构建动态交互式网页:从基础到实践
【10月更文挑战第12天】使用JavaScript构建动态交互式网页:从基础到实践
269 1
|
3月前
|
移动开发 JavaScript 前端开发
一些处理浏览器兼容性问题的JavaScript库
这些库在处理浏览器兼容性问题方面都有着各自的特点和优势,可以根据具体的需求和项目情况选择合适的库来使用,从而提高代码的兼容性和稳定性,为用户提供更好的体验。同时,随着浏览器技术的不断发展,还需要持续关注和学习新的兼容性解决方案。
131 48
|
2月前
|
Web App开发 移动开发 HTML5
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码。画面中心是悬浮于空的梅花鹿,其四周由白色线段组成了一个6边形将中心的梅花鹿包裹其中。四周漂浮的白雪随着多边形的转动而同步旋转。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
100 2
|
3月前
|
JavaScript 前端开发
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
|
3月前
|
CDN
如何在项目中使用Moment.js库?
如何在项目中使用Moment.js库?
|
3月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
88 5
|
3月前
|
JavaScript 前端开发
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
如何在不影响性能的前提下使用JavaScript库来实现复杂的动画效果?
|
3月前
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
67 1
|
4月前
|
存储 JavaScript 前端开发
【JavaScript】网页交互的灵魂舞者
本文介绍了 JavaScript 的三种引入方式(行内、内部、外部)和基础语法,包括变量、数据类型、运算符、数组、函数和对象等内容。同时,文章还详细讲解了 jQuery 的基本语法和常用方法,如 `text()`、`html()`、`val()`、`attr()` 和 `css()` 等,以及如何插入和删除元素。通过示例代码和图解,帮助读者更好地理解和应用这些知识。
55 1
【JavaScript】网页交互的灵魂舞者

热门文章

最新文章

  • 1
    当面试官再问我JS闭包时,我能答出来的都在这里了。
    49
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 3
    Node.js 中实现多任务下载的并发控制策略
    34
  • 4
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 5
    【JavaScript】深入理解 let、var 和 const
    49
  • 6
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    47
  • 7
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    57
  • 8
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    57
  • 9
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    72
  • 10
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    57