最后更新:2022-08-04 02:14:00 手机定位技术交流文章
近年来,网络的发展迅速。随着HTML5的普及,网页的性能越来越强大。许多复杂的动画已经可以在网络上进行,精美的效果。 但是,人总是贪的。那么,除此之外,还能做些什么呢?其中一种是使用WebGL在网页中创建高性能3D图形。
OpenGL,WebGL到Three.js
OpenGL是最常用的跨平台图形库。
WebGL是基于OpenGL设计的面向Web的图形标准,提供一系列JavaScript API,通过这些API可以使用图形硬件实现图形渲染,以达到更高的性能。
three.js是一个易于使用的图形库,由包和简化WebGL接口组成。
简单的公式是: threejs=three + js,三表示三维。js代表javascript。那么合起来,three.js意味着使用JavaScript来编写一个3D程序。而javascript的计算能力因为google的V8引 擎得到了迅猛的增强,做3D程序,做服务器是没问题的。
WebGL阈值相对较高,它需要较多的数学知识(线性代数、分析几何)。因此,在短期内很难在WebGL上表现得很好。Three.js对WebGL提供的接口进行了很好的封印,简化了很多细节,它大大降低了学习的成本。并且,WebGL的灵活性几乎没有损失。
因此,从三点开始。 js的可用性是推荐的,它使你能够在较短的学习期间处理最复杂的场景。
学习JS的问题
到学校的门相对简单,但当我们真正去学校时,我们发现一个非常尴尬的问题:关于学校的资料很少。
通常这种流行的库都有很完善的文档,很多时候跟着官方的文档或官方的入门教程学习就是最好的路线。但Three不是的,它的文档对初学者来说太过简明扼要。
不过官方提供了非常丰富的examples,几乎所有你需要的用法都在某个example中有所体现。但这些example不太适合用来入门,倒是适合入门之后的进一步学习。
这里有一些相对好的教程:
Three.js入门指南 :这是一份很好的Three.js 轻量级入门教程,作者文笔很好,基础知识讲解得简明易懂。
Three.js开发指南(中文版I)
Learning Three.js- Second Edition
Learning Three.js:The JavaScript 3D Library for WebGL是现在不多的也是最好的Three.js入门书,这些三个函数的解释更为全面,Js的各个功能。 如果有能力的话,建议阅读英文版本2,出版于2015年,现在是三点。 差别很小。中文版自2012年首次出版的原版出版以来一直被翻译。大多数概念都是适用的,但许多细节都发生了变化。
Three.js入门教程 :这是对国外一份教程的翻译,一共六篇文章。讲解不多,更多的是展示各个基本功能怎么用。更适合有一些图形基础的同学。
当然,在实际学习过程中,这些信息绝非足够,如果有问题, 请亲自查找信息.但这里有一个提醒,Three.js更新非常频繁,现在是r80版本,自2010年4月 r1发布以来,这是第72版(一些中版本的数字已经跳过了)。因此,互联网上所找到的一些信息可能不适合当前版本,小心选择(在先前建议的信息中有一些类似的问题)。
剖析源目录结构
首先下载代码及其地址是: https://github."com/mrdoob/three".js。如图所示:
用压缩软件解封源包。每个目录如下显示:
Build目录:包含两个文件,three.js 和three.min.js 。这是three.js最终被引用的文件。一个已经压缩,一个没有压缩的js文件。
Docs目录:这里是three.js的帮助文档,里面是各个函数的api,可惜并没有详细的解释。试图用这些文档来学会three.js是不可能的。
编辑目录:类似于3D-max的简单编辑程序,可以创建一些3D对象。
例如目录:一些非常有趣的实例演示,不幸没有文档描述。 学习的成本非常高,对于那些不深入理解图形的学生。
Src目录: 包含所有源代码的源代码目录.
测试目录: 一些测试代码, 基本上毫无用处.
Utils目录:用于保存一些脚本、Python文件的工具目录。例如,转换一个3D - Max模型到3.js有一个特殊的json模型。
.gitignore文件:Git工具的滤波规则文件,没有用处。
CONTRIBUTING.md文件:说明如何报告错误和如何获得帮助的文档。
著作权文件: 版权信息.
README.md文件:三.A js文件的介绍,它也包含每个版本的更新列表。
一些概念在Js中
为了在屏幕上显示3D图形,这个想法一般是如下:
建立一个3D空间
Three中称之为场景(Scene)
选择观察点,确定观察方向/角度
Three中称之为相机(Camera)
在现场观察的对象
在三维中有许多类型的对象,包括 Mesh 、 Line 、 Points 等,它们都来自Object3D类
4.将观察到的场景映射到屏幕上的指定区域
使用 Renderer完成任务
Scene
场景是所有物体的容器,和我们创造的三维世界相符。
Camera
坐标系
Camera是三维世界中的观察者,为了观察这个世界,首先我们要描述空间中的位置。 Three中使用采用常见的右手坐标系定位。

三维投影
Three中的相机有两种,分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera。
正交投影与透视投影的区别如上图所示,左图是正交投影,物体发出的光平行地投射到屏幕上,远近的方块都是一样大的;右图是透视投影,近大远小,符合我们平时看东西的感觉。
1)正交投影相机
注:图中的“视角”与三维相机相符。
这里是可视对象的概念的补充:可视对象是几何对象,只有可视对象内部的对象会被看见,而可视对象以外的对象会被切断,这是为了消除不必要的操作。
正交投影相机的视景体是一个长方体,OrthographicCamera的构造函数是这样的:
OrthographicCamera( left, right, top, bottom, near, far )
摄像机本身可以被看作一个点,而左边显示左平面与摄像机之间的距离是左方向和右方向。 许多其他参数都是相同的,因此六个参数分别定义了视觉对象的六面的位置。
类似地,视觉对象中的对象被投影平行于近平面,而近平面上的图像被渲染到屏幕上。
2)透视投影相机
镜头投影仪的视角是矩形平台,其施工功能如下:
PerspectiveCamera( fov, aspect, near, far )
fov对应着图中的视角,是上下两面的夹角。aspect是近平面的宽高比。在加上近平面距离near,远平面距离far,就可以唯一确定这个视景体了。
透镜投影相机非常符合我们通常看到的事物感,所以在大多数情况下,我们都用透镜投影相机显示3D效果。
Objects
用摄像机, 你总是想看到什么? 把一些东西添加到场景中.
在“三”中显示的对象很多,它们都继承了Object3D类,这里我们主要看 Mash 和 Points。
1)Mesh
我们都知道,计算机的世界里,一条弧线是由有限个点构成的有限条线段连接得到的。线段很多时,看起来就是一条平滑的弧线了。
计算机中的三维模型也是类似的,普遍的做法是用三角形组成的网格来描述,我们把这种模型称之为Mesh模型。
这是著名的斯坦福兔,它在3D图形中的地位与著名的莱娜在数字图像处理领域的地位相似。
看这只兔子,随着三角形的数量增加,它的表面变得更加平滑和精确。
在三维中,梅什的构造函数如下:
Mesh( geometry, material )
geometry是它的形状,material是它的材质。
除了 Mash 之外, 许多对象都是使用这两个属性创建的.让我们看下面的两个重要属性.
2)Geometry
Geometry,形状,相当直观。Geometry通过存储模型用到的点集和点间关系(哪些点构成一个三角形)来达到描述物体形状的目的。
三个提供许多基本形状,如三角形(实际上是矩形),平面(实际上是矩形),球形,圆形,柱形,表格等;
还可以通过定义每个点的位置来构造形状;
对于更复杂的形状, 我们也可以通过外部模型文件导入.
3)Material
材料,材料,它没有那种直观的形状。
材料实际上是所有视觉属性的集合,如颜色、纹理、滑度、透明度、反射率、折射率和发光,除了形状之外。
这里讲一下材质(Material)、贴图(Map)和纹理(Texture)的关系。
上面提到的材料, 包括贴纸和其他.
卡片实际上是“卡片”和“图片”,包括图片和该贴在哪里。
这是纹身,实际上是一张照片。
三个提供广泛的材料选择,并可以自由选择材料如扩散反射/镜反射。
4)Points
讲完了Mesh,我们来看看另一种Object——Points。
点实际上是点的集合,它在之前很长时间都被称为ParticleSystem(粒子系统),r68版本时更名为PointCloud,r72版本时才更名为Points。更名主要是因为,在杜布的意见中,粒子系统应该是一个完整的系统,包括处理粒子和相关物理性质。这些三点都比较简单。因此,该班最终被命名为Points。
5)Light
神说:要有光!
光学效应是丰富屏幕的重要因素.
Three提供了包括环境光AmbientLight、点光源PointLight、 聚光灯SpotLight、方向光DirectionalLight、半球光HemisphereLight等多种光源。
只要把所需的光源添加到现场.
6)Renderer
在场景中,各种物体被创造出来,有光线,还有摄像机观察这些物体,现在是将你看到的物体映入屏幕的时候了。
Renderer绑定一个canvas对象,并可以设置大小,默认背景颜色等属性。
调用Renderer的render函数,传入scene和camera,就可以把图像渲染到canvas中了。
让画面动起来
现在一个静态的屏幕已经获得, 如何使它移动?
很简单的想法,改变场景中object的位置啊角度啊各种属性,然后重新调用render函数渲染就好了。
那么你如何确定重新交还的时间?
HTML5提供了 requestAnimFrame,它在每页重新绘制之前自动调用功能。
如果我们用这个渲染开始:
function render()
{
renderer.render(scene, camera);
}
只需要改成这样:
function render()
{
requestAnimationFrame(render);
object.position.x += 1;
renderer.render(scene, camera);
}
这个对象可以移动!
举个例子
这里是一个简单的例子来说明这个过程。
首先用Canvas元素写一页。
function initRenderer() {
width = document.getElementById(‘three_canvas’).clientWidth;
height = document.getElementById(‘three_canvas’).clientHeight;
renderer = new THREE.WebGLRenderer({
//将Canvas绑定到渲染器
canvas: document.getElementById(‘three_canvas’)
});
renderer.setSize(width, height);//将渲染的大小设为与Canvas相同
renderr.SetClearColor(0xFF, 1.0);//设置默认的颜色和透明度
}
初始化场景:
function initScene() {
scene = new THREE.Scene();
}
初始化相机:
function initCamera() {
//简单的正交投影相机,正对着视口的中心,视口大小与Canvas大小相同。
camera = new THREE.OrthographicCamera(width / -2, width / 2, height / 2, height / -2, 1, 1000);
//设置相机的位置
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 200;
//设置摄像机
camera.up.x = 0;
camera.up.y = 1;
camera.up.z = 0;
//设置摄像机的焦点(事实上,确定方向)
camera.lookAt({
x: 0,
y: 0,
z: 0
});
}
为了确定一个相机的位置和方向,三个属性位置、上、和LookAt都无法使用。
这里我们创建了一个正交投影相机,我将视角的大小与屏幕分辨率保持一致,只是为了方便,所以坐标系统中的一个单位长度与屏幕的一个像素相符。
我们将把摄像机放在Z轴上,面向坐标源点,摄像机的上方向是Y轴方向,并且注意,上方向和LookAt方向必须垂直(类比自己的头更了解)。
下面将一个方形添加到场景:
function initObject() {
//创建一个边界100的矩形
var geometry = new THREE.CubeGeometry(100, 100, 100);
object = new THREE.Mesh(geometry, new THREE.MeshNormalMaterial());
scene.add(object);
}
注意,我们使用方法性材料 MashNormalMaterial,使方块的每个面部的颜色与面部的方向有关,这更容易观察/调试。
在这个简单的演示中,我不会添加照片效果,而且定位材料也不会对光作出反应。最后,创建一个动画循环
function render() {
requestAnimationFrame(render);
object.rotation.x += 0.05;
object.rotation.y += 0.05;
renderer.render(scene, camera);
}
每次重新绘制时,立方体会稍微移动。当页面被正确加载时,请在其前面调用函数。
function threeStart() {
initRenderer();
initCamera();
initScene();
initObject();
render();
}
window.onload = threeStart();
本文由 在线网速测试 整理编辑,转载请注明出处。