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

网页3D效果库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

时间: 2024-12-16 09:24:42

网页3D效果库Three.js初窥的相关文章

Boost.ASIO简要分析-1 初窥

Boost.Asio是一个主要用于网络及底层I/O编程的跨平台C++库. 1. 初窥 Boost.Asio支持对I/O对象进行同步及异步操作. 1.1 同步操作 同步操作的事件顺序如下图所示: 1) 调用者调用I/O对象的connect函数开始连接操作,socket.connect(server_endpoint): 2) I/O对象将连接请求传递给io_service: 3) io_service调用操作系统函数: 4) 操作系统返回结果给io_service: 5) io_service将结

C++拾遗(二)——初窥标准库类型

本篇博文的开始,先介绍一道书上看到的智力题:有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸.有一台称重精准的天平,只是用一次天平的情况下如何找出比较重的那瓶药丸? 好了,直接公布答案.从药瓶#1取出一粒药丸,从药瓶#2取出两粒,从药瓶#3取出三粒,依此类推.如果每粒药丸均重1克,则称得总重量为210克(1 + 2 + … + 20 = 20 * 21 / 2 = 210),“多出来的”重量必定来自每粒多0.1克的药丸.药瓶的编号可由算式(weight - 210 gr

HTML5网页设计初窥系列课程

HTML5网页设计初窥系列课程(1):新Web设计标准HTML5的历史与回顾 (Level 200) HTML5网页设计初窥系列课程(2):新的页面组织标记 (Level 200) HTML5网页设计初窥系列课程(3):智能表单设计 (Level 200) HTML5网页设计初窥系列课程(4):引入多媒体对象 (Level 200) HTML5网页设计初窥系列课程(5):Canvas对象你的画布 (Level 200) HTML5网页设计初窥系列课程(6):扩展图形标记 (Level 200)

3D图形处理库

转自 3D图形处理库 高性能软件光栅化渲染器 OpenSWR OpenSWR —— 用于OpenGL的高性能,高度可扩展的软件光栅化渲染器 OpenSWR的目的是提供一个高性能,高度可扩展的OpenGL兼容软件光栅化渲染器,允许使用未经修改的可视化软件. ... 全新 3D 可视化库 ECharts-X ECharts-X是 ECharts 团队推出的全新 3D 可视化库,它是基于 ECharts 的扩展,底层深度整合了 WebGL 库QTEK和 Canvas2D 库ZRender. 特色 混搭

6个绚丽时尚的Web前端3D效果展示(附源码)

作为一个前沿的 Web 开发者,对于 HTML5 和 现在流行的3D技术或多或少都有掌握.前几年这些新技术刚萌芽的时候,开发者们已经使用它们来小试牛刀了,如今这些先进技术已经遍地开发,特别是在移动端大显身手.这篇文章挑选了6个前沿的绚丽的3D展示效果,希望对你有所帮助. 1.  3D自由立体旋转现实物理效果 3D自由立体旋转是一个基于 HTML5 技术的实验,模拟现实物理效果,让你在 Web 中感受自然物体的3D自由立体旋转运动.玩法介绍:可以随意拖动鼠标.按住鼠标左键选中旋转物体.或者按住鼠标

Hadoop学习笔记(9) ——源码初窥

Hadoop学习笔记(9) ——源码初窥 之前我们把Hadoop算是入了门,下载的源码,写了HelloWorld,简要分析了其编程要点,然后也编了个较复杂的示例.接下来其实就有两条路可走了,一条是继续深入研究其编程及部署等,让其功能使用的淋漓尽致.二是停下来,先看看其源码,研究下如何实现的.在这里我就选择第二条路. 研究源码,那我们就来先看一下整个目录里有点啥: 这个是刚下完代码后,目录列表中的内容. 目录/文件 说明 bin 下面存放着可执行的sh命名,所有操作都在这里 conf 配置文件所在

impress.js初体验

概述 如果你已经厌烦了使用PowerPoint制作PPT,那么impress.js是一个非常好的选择,用它做的PPT更加直观,效果也非常的不错.装X是需要一定代价的,不过如果你是个前端爱好者那么一切就没问题了.当然如果你能勉强明白HTML和CSS也没问题,看看这篇文章 + 一点点实践(把官网上的例子拿来改改)即可... impress.js 是国外一位开发者受 Prezi 启发,采用 CSS3 与 JavaScript 语言完成的一个可供开发者使用的表现层框架(演示工具).现在普通开发者可以利用

weui 多网页切换效果分析

weui的文档写的不怎么详尽,简单的来讲WeUI 为微信 Web 服务量身设计的h5框架. WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一.包含button.cell.dialog. progress. toast.article.icon等各式元素. 严格的讲它是一个css库.算一个精简的库. 如果要用jQuery开发的话,head部分,需要加载如下信息: <head> <meta charset=&quo

JQuery初窥

本周五开始学习JQuery.通过一天的接触下来,感觉使用JQuery确实比之前自己写原生JS代码要方便得多,但是有另外一个问题,函数太多,初学的话不了解很多函数功能,使用不顺畅.然后,感觉JQuery自身提供的show(),fadeIn()函数效果太单一,不晓得还有没有替换的函数.另外,本周作业让用JQuery做图片轮播效果,说一点我遇到的问题,就是现在只能使用fadeIn()和fadeOut()来实现图片切换,但是我看淘宝那个是有个左滑动的效果,JQuery里面好像没有这种效果.如果用之前学的