三角形外做两个正方形=三个○!

WebGL是在浏览器中实现三维效果的一套规范
  • 想要使用WebGL原生的API来写3D效果的话,很吃力。three.js是WebGL的一个开源框架,它省去了不少麻烦的细节。
  • Javascript是运行在网页端的脚本语言,那么毫无疑问Three.js也是运行在浏览器上的。
  • Build目录: 包含两个文件,three.js 和three.min.js 。这是three.js最终被引用的文件。一个已经压缩,一个没有压缩的js文件。
  • Docs目录: 这里是three.js的帮助文档,里面是各个函数的api,惋惜并无详细的解释。试图用这些文档来学会three.js是不可能的。
  • Editor目录: 一个相似3D-max的简单编辑程序,它能建立一些三维物体。
  • Examples目录: 一些颇有趣的例子demo,惋惜没有文档介绍。对图像学理解不深刻的同窗,学习成本很是高。
  • Src目录: 源代码目录,里面是全部源代码。
  • Test目录: 一些测试代码,基本没用。
  • Utils目录: 存放一些脚本,python文件的工具目录。例如将3D-Max格式的模型转换为three.js特有的json模型。
  • .gitignore文件: git工具的过滤规则文件,没有用。
  • CONTRIBUTING.md文件: 一个怎么报bug,怎么得到帮助的说明文档。
  • README.md文件: 介绍three.js的一个文件,里面还包含了各个版本的更新内容列表。
  • 浏览器: 推荐使用高版本的浏览器,谷歌、火狐、360等,对于前端开发者来讲,chrome是不二的选择
  • Three.js 调试: 利用谷歌浏览器的调试窗口,使用断点调试的方法
WebGL 的渲染是须要HTML5 中的 Canvas元素的,你能够手动在HTML的 <body>部分中使用canvas标签,或者让Three.js帮你生成。这两种选择,通常没有多大差异。咱们先手动定义一个canvas标签:
在js里面定义一个函数,将全部执行的代码放在函数里,在html加载完成后,执行该函数
// 全部须要执行的代码
渲染器决定了 渲染的结果应该画在 页面的什么元素上面,而且 以怎样的方式来绘制
若是想要 Three.js生成Canvas元素的时候,在html中就不须要在定义一个canvas标签了,直接在javascript代码中写道:
咱们可使用下面的代码(用于清除画面的颜色)将背景色设置为黑色:
在Three.js中 添加物体都是添加到 场景中的,所以它至关于一个大容器。通常说,场景里没有很复杂的操做,只要new一个对象就能够了,而后将物体添加到场景中便可。
在介绍照相机以前,咱们先来介绍一下坐标系。
  • three.js中使用的是右手坐标系,X轴水平向右,y轴垂直向上,Z轴的方向就是屏幕由里往外的方向
这里咱们定义一个 透视相机(相机也须要添加到场景中):
// 将相机添加到场景中
这里咱们先介绍一个长方体,建立一个x、y、z方向长度分别为一、二、3的长方体,并设置为红色。
  • CubeGeometry是一个正方体或者长方体,到底是什么,由它的3个参数所决定
width:立方体x轴的长度
height:立方体y轴的长度
depth:立方体z轴的深度,也就是长度
想想你们就明白,以上3个参数就可以肯定一个立方体。
剩下的几个参数就要费解和复杂一些了,不事后面咱们会本身来写一个立方体,到时候,你会更明白这些参数的意义,这里你能够将这些参数省略。
  • 你能够在里面设置物体的颜色
  • 必定不要忘了,将物体添加到场景
在定义了场景中的物体,设置好的照相机以后,渲染器就知道如何渲染出二维的结果了。这时候,咱们只须要调用渲染器的渲染函数,就能使其渲染一次了。
// 定义一个透视相机 // 将相机添加到场景中
下面介绍下Three.js官网文档中的一些重要的对象,在你须要寻求帮助时,就可以知道关键词是什么。
  • Cameras(照相机,控制投影方式)git

  • Core(核心对象)程序员

  • Clock(用来记录时间)
  • Raycaster(计算鼠标拾取物体时颇有用的对象)
  • Materials(材质,控制物体的颜色、纹理等)算法

  • Math(和数学相关的对象)

  • Mesh(网格,最经常使用的物体)
  • Renderers(渲染器,能够渲染到不一样对象上)

  • WebGLRenderer(使用WebGL渲染,这是本书中最经常使用的方式)
  • WebGLShaders(着色器,在最后一章做介绍)

咱们看到,Three.js功能是十分丰富的,一时间想所有掌握有些困难。在接下来的章节中,咱们将会先详细介绍照相机、几何形状、材质、物体等入门级知识;而后介绍使用动画、模型导入、加入光照等功能;最后,对于学有余力的读者,咱们将介绍着色器,用于更高级的图形渲染。

本章将介绍照相机的概念,以及如何使用Three.js设置相应的参数。

4.1 什么是照相机?

在图形学中,照相机可没有生活中的照相机那么简单
  • 咱们使用的Three.js建立的场景是三维的,而一般状况下显示器是二维的,那么三维的场景怎么在二维的显示器上显示呢?照相机就是一个抽象,它定义了三维空间到二维屏幕投影的方式,用“照相机”这样一个类比,可使咱们直观地理解这一投影方式。
  • 而针对投影方式的不一样,照相机又分为正交投影照相机透视投影照相机。咱们须要为本身的程序选择合适的照相机。这二者分别是什么,以及二者有何差别,咱们将在下节中做介绍。

4.2 正交投影和透视投影

举个简单的例子来讲明正交投影与透视投影照相机的区别。使用 透视投影照相机得到的结果是 相似人眼在真实世界中看到的有“近大远小”的效果(以下图中的(a));而使用 正交投影照相机得到的结果就像咱们在数学几何学课上老师教咱们画的效果,对于 三维空间内平行的线,投影到 二维空间中也必定是平行的(以下图中的(b))。

通常说来,对于制图、建模软一般使正交投影,这样不会由于投影而改变物体比例;而对于其余大多数应用,一般使用 透视投影,由于这更接近人眼的观察效果。固然,照相机的选择并无对错之分,你能够更具应用的特性,选择一个效果更佳的照相机。

4.3 正交投影照相机

这六个参数分别表明正交投影照相机拍摄到的空间的六个面的位置,这六个面围成一个长方体,咱们称其 视景体(Frustum)。只有在视景体内部(下图中的灰色部分)的物体才可能显示在屏幕上,而视景体外的物体会在显示以前被裁减掉。

near与far都是指到照相机位置在深度平面的位置,而照相机不该该拍摄到其后方的物体,所以这两个值应该均为正值。为了保证场景中的物体不会由于太近或太远而被照相机忽略,通常near的值设置得较小far的值设置得较大,具体值视场景中物体的位置等决定。

下面咱们经过一个具体的例子来了解正交投影照相机的设置
  • 在原点处建立一个边长为1的正方体,为了和透视效果作对比,这里咱们使用wireframe而不是实心的材质,以便看到正方体后方的边:
  • 咱们看到正交投影的结果是一个正方形,后面的边与前面彻底重合了,这也就是正交投影与透视投影的区别所在。
这里,咱们的Canvas宽度是800px,高度是600px,照相机水平方向距离4,垂直方向距离3,所以长宽比例保持不变。为了试验长宽比例变化时的效果,咱们将照相机水平方向的距离减少为2(right-left = 2):
  • 效果图(此时水平方向的距离就被拉长了):
接下来,咱们来看看照相机位置对渲染结果的影响。在以前的例子中,咱们将照相机设置在(0, 0, 5)位置,而因为照相机默认是 面向z轴负方向放置的,因此能看到在原点处的正方体。如今,若是咱们将照相机 向右移动1个单位:
// 向右移动一个单位的位置
  • 效果图(物体看上去向左移动了)
  • 其实照相机就比如人的眼睛,当咱们身体往右移动的时候,看到的物体就好像向左移了。
正交投影摄像机在设置时,是否须要保证 left 和 right 互为相反数呢?
  • 效果图(与以前相机向右的效果是同样的)
到目前为止,咱们使用照相机,都是 沿着Z轴负方向观察的,所以看到的都是一个正方形,如今咱们尝试一下 仰望这个正方体,改变照相机的位置:
照相机默认是沿着z轴的负方向观察的,所以观察不到正方体,只看到一片黑。咱们能够经过 lookAt函数指定它 看着原点方向

4.4 透视投影照相机

让咱们经过一张透视照相机投影的图来了解这些参数。
  • 透视图中,灰色的部分是视景体,是可能被渲染的物体所在的区域。fov是视景体竖直方向上张角(是角度制而非弧度制),如侧视图所示。
  • aspect等于width / height,是照相机水平方向和竖直方向长度的比值,一般设为Canvas的横纵比例
  • near和far分别是照相机到视景体 最近、最远的距离,均为正值,且far应大于near
下面咱们经过一个例子来学习透视投影照相机
  • 设置一个在原点处的边长为1的正方体:
  • 对比正交透视照相机下正方形的效果,透视投影能够看到所有的12条边,并且有近大远小的效果,这也就是与正交投影的区别。
  • 接下来,咱们来看下fov的改变对渲染效果的影响。咱们将原来的45改成60
  • 为何正方体显得更小了呢?咱们从下面的侧视图来看,虽然正方体的实际大小并未改变,可是将照相机的竖直张角设置得更大时,视景体变大了,于是正方体相对于整个视景体的大小就变小了,看起来正方形就显得变小了。
  • 注意,改变fov不会起画面横竖比例的变化,而改变aspect改变横竖比例。
在计算机世界里,3D世界由点组成,两个点能组成一条直线,三个不在一条直线上的点,就能组成一个三角面, 无数的三角面就能组成 各类各样的物体,以下图:
  • 咱们一般把这种网络模型叫作Mesh模型。给物体贴上皮肤,或者专业点就叫作纹理,那么这个物体就活灵活现了。最后无数的物体就组成了咱们的3D世界。
在三维空间中的某一个点能够用一个坐标点来表示。一个坐标点由 x, y, z三个份量构成。在three.js中,点能够在右手坐标系中表示:

空间几何中,点能够用一个向量来表示,在Three.js中也是用一个向量来表示的

  • 咱们来分析这段代码:前面咱们已经知道了THREE是Three.js引擎的一个全局变量。只要你想用它,就能够在任何地方用它。
  • 那么THREE.Vector3呢,就是表示Vector3是定义在THREE下面的一个。之后要用Vector3,就必须要加THREE前缀。固然Three.js的设计者,也能够不加THREE这个前缀,可是他们预见到,Three.js引擎中会有不少类型,最好给这些类型加一个前缀,以避免与开发者的代码产生冲突。
  • THREE.Vector3被赋值为一个函数。这个函数有3个参数,分别表明x坐标y坐标z坐标的份量。函数体内的代码将他们分别赋值给成员变量x,y,z。看看上面的代码,中间使用了一个“||”(或)运算符,就是当x=null或者undefine时,this.x的值应该取0
  • 如今来看看怎么定义个点,假设有一个点x=4,y=8,z=9。你能够这样定义它:
  • 另外你也可使用set方法,代码以下:
两个不重合的点可以决定一条直线。在three.js中,也能够经过定义两个点,来画一条直线。
  • 一、首先,声明一个几何体geometry
  • 几何体里面有个vertices变量,能够用来存放点
// 几何体里面有个vertices变量,能够用来存放点
  • 二、定义一种线条的材质,使用THREE.LineBasicMaterial类型来定义,它接受一个集合做为参数,其原型以下:
  • parameters 是定义材质外观的对象,它包含多个属性来定义材质,这些属性是:

    • Color 线条的颜色,用16进制表示,默认都是白色
    • Linewidth 线条的宽度,默认是1个单位宽度
    • Linecap 线条两端的外观,默认是圆角端点,当线条较粗的时候才能看到效果
    • Linejoin 两个线条的链接点处的外观,默认是“round”,表示圆角。
    • VertexColors 定义线条材质是否使用顶点颜色,这是一个boolean值。意思是,线条各部分的颜色会根据顶点的颜色来进行插值。
    • Fog 定义材质的颜色是否受全局雾效的影响。
  • 注意: 关于线宽的坑,WebGLRender渲染方式是不之持绘制线宽的,要想支持,须要将渲染方式设置为CanvasRenderer
  • 三、接下来,定义两种颜色,分别表示线条两个端点的颜色,
  • 四、定义2个顶点的位置,并放到geometry中,代码以下:
  • 五、为4中定义的2个顶点,设置不一样的颜色,代码以下所示:
  • 定义线条,使用THREE.Line类,代码以下所示:
  • 第一个参数是几何体geometry,里面包含了2个顶点和顶点的颜色
  • 第二个参数是线条的材质,或者是线条的属性,表示线条以哪一种方式取色。
  • 第三个参数是一组点的链接方式。
  • 七、而后,将这条线加入到场景中,代码以下:
// 定义模型的类型是线段 而且设置其材质 // 将新建的两个点添加到几何体中 // 将两个颜色添加到几何体中

5.5 线条的深度理解

在Threejs中,一条线由点,材质和颜色组成。
  • 一、为了绘制一条直线,首先咱们须要定义两个点
  • 四、最终咱们经过THREE.Line绘制了一条线:
咱们要画一个网格的坐标,那么咱们就应该找到线的点。把网格虚拟成正方形,在正方形边界上找到几个等分点,用这些点两两链接,就可以画出整个网格来。
  • 这两个点决定了x轴上的一条线段,将这条线段复制20次,分别平行移动到z轴的不一样位置,就可以造成一组平行的线段。
  • 同理,将p1p2这条线先围绕y轴旋转90度,而后再复制20份,平行于z轴移动到不一样的位置,也能造成一组平行线。
// for循环出来六条线段 // 每条线段之间的间隔为0.8,-2是为了达到田字格的效果
在建立物体时,须要传入两个参数,一个是 几何形状(Geometry),另外一个是 材质(Material),这一章将着重介绍几何形状的建立,第6章介绍材质,第7章介绍如何使用二者建立网格。
  • 几何形状(Geometry)最主要的功能是储存了一个物体的顶点信息。WebGL须要程序员指定每一个顶点的位置,而在Three.js中,能够经过指定一些特征来建立几何形状,例如使用半径建立一个球体,从而省去程序员一个个指定顶点的工做量。
  • 本章节将分别介绍立方体、平面、球体、圆柱体、四面体、八面体等几何形状,以及以三维文字做为几何形状的方法。本节还会介绍经过手动定义 顶点位置面片信息组成几何形状。
虽然这形状的名字叫作立方体( CubeGeometry),但实际上是长方体,也就是长宽高能够设置不一样的值:
  • 这里,widthx方向上的长度;heighty方向上的长度;depthz方向上的长度;后三个参数分别是在三个方向上的分段数,如widthSegments为3的话,表明x方向上水平分为三份。通常状况下不须要分段的话,能够不设置后三个参数,后三个参数的缺省值为1。其余几何形状中的分段也是相似的,下面不作说明。
  • 建立立方体直观简单,如:new THREE.CubeGeometry(1, 2, 3);能够建立一个x方向长度为1,y方向长度为2,z方向长度为3的立方体。
// 新建一个几何体(长方体)
  • 为了更好地表现参数效果,咱们在场景中用长度为3红、绿、蓝线段分别表示x、y、z三个轴(这里不须要深究,后面会详细介绍):
// 封装一个坐标系函数
// 在init 函数里调用这个函数 便可在屏幕上显示一个坐标系了
 
  • 在设置材质,并添加到场景以后具体的效果是:
 
  • 物体的默认位置原点,对于立方体而言,是其几何中心在原点的位置。
 
 
// x轴分两段 y轴分两段 z轴分三段
 
 
  • 注意这个分段是对六个面进行分段,而不是对立方体的体素分段,所以在立方体的中间是不分段的,只有六个侧面被分段。
 
 
这里的平面( PlaneGeometry)实际上是一个长方形,而并不是是数学意义上无限大的平面:
 
  • 其中,widthx方向上的长度;heighty方向上的长度;后两个参数一样表示分段
 
 
  • 若是须要建立的平面在x轴和z轴所在的平面内,能够经过物体的旋转来实现,具体的作法将在下面章节介绍到。
 
 
 
 
    6)能够建立一个半径为2经度划分红8份,纬度划分红6份的球体
 
 
 
 
  • segmentsWidth至关于经度被切成了几瓣,而segmentsHeight至关于纬度被切成了几层。由于在图形底层的实现中,并没有曲线的概念,曲线都是由多个折线近似构成的。对于球体而言,当这两个值较大的时候,造成的多面体就能够近似看作是球体了。
 
 
 
  • 值得注意的是,这里的SegmentsWidth8意味着对于经度从Math.PI / 2跨过Math.PI / 3区域内划分为8块,而不是整个球体的经度划分红8块后再判断在此经度范围内的部分。
 
 // 经度起始弧度为0度,经度跨度为 180*2
 
 
 
 
 
圆形( CircleGeometry)能够建立 圆形或者扇形,其构造函数是:
 
  • 这里的参数跟绘制圆是同样的,咱们再来熟悉一下。radius是半径;segments表示切片数;thetaStart表示纬度开始的弧度thetaLength表示纬度跨过的弧度
 
 
 
 
  • 其中,radiusTopradiusBottom分别是顶面和底面的半径,由此可知,当这两个参数设置为不一样的值时,实际上建立的是一个圆台;height是圆柱体的高度radiusSegmentsheightSegments可类比球体中的分段,一个表示底面、顶面的分段,另外一个表示环面的分段;openEnded是一个布尔值,表示是否没有顶面和底面,缺省值为false,表示有顶面和底面。
 
 
 

 
 

 
 

6.1.6 正四面体、正八面体、正二十面体

 
 
  • 其中,radius是半径;detail是细节层次(Level of Detail)的层数,对于大面片数模型,能够控制在视角靠近物体时,显示面片数多的精细模型,而在离物体较远时,显示面片数较少的粗略模型。这里咱们不对detail多做展开,通常能够对这个值缺省。
 
 
 

 
 

 
 
 
圆环面( TorusGeometry)就是甜甜圈的形状,其构造函数是:
 
 
 
 

 
 

 
 
 
若是说圆环面是甜甜圈,那么圆环结( TorusKnotGeometry)就是打告终的甜甜圈,其构造参数为:
 
  • 前四个参数在圆环面中已经有所介绍,pq是控制其样式的参数,通常能够缺省,若是须要详细了解,请;heightScale是在z轴方向上的缩放。
 
 
 
文字形状( TextGeometry)能够用来建立三维的文字形状。
 
 
使用文字前,须要下载和引用额外的字体库。字体库在 目录下,下载里面的 json文件,放在你的目录下,而后加载。
 
  • 这里,咱们就以helvetiker字体为例。咱们在刚刚的字体库目录下,下载helvetiker_regular.typeface.json文件放在你的目录下,而后用如下方法加载:
 
// 调用一个字体加载函数
 // 写在loader函数里面 不然不显示
 
  • 以前用的73dev版本的three.js,执行代码的时候发现报错,多是尚未添加这个功能,因此建议去下载。
  • json配置文件,须要在本地服务器打开,推荐使用webstorm编辑器,由于它打开html文件时,就是以本地服务器的方式打开的。或者在cmd命令行中输入live-server,但须要配置,具体方法。
 
 
建立文字形状的流程和以前介绍的基本几何形状是相似的,其构造函数是:
 
  • 其中,text是要显示的文字字符串,parameters是如下参数组成的对象:

    • size:字号大小,通常为大写字母的高度
    • curveSegments:弧线分段数,使得文字的曲线更加光滑
    • font:字体,默认是'helvetiker',需对应引用的字体文件
    • bevelEnabled:布尔值,是否使用倒角,意为在边缘处斜切
 
 
 // 中文字符不能解析
 // 渲染必定要在load函数里面
 
 
  • 咱们能够改变材质和添加光照来改变显示效果(灯光、材质没必要深究,后面会细讲)
 
 
  • 这里只是给你们看了一个效果,具体材质、灯光的原理不要去深究,直接跳过,看下面的知识点。
 
 
对于Three.js没有提供的形状,能够经过自定义形状来建立。
 
  • 因为自定义形状须要手动指定每一个顶点位置,以及顶点链接状况,若是该形状很是复杂,程序员计算量就会比较大。这种状况,建议使用建模工具,建立好以后,再经过three.js导入到场景中,这样会十分高效、方便。
 
  • 咱们以建立一个梯台为例,首先,初始化一个几何形状,而后设置顶点位置以及顶点链接状况。

    • 顶面建立4个点,底面建立4个点,按照顺时针的顺序逐个建立
    • 因此这8个点,按照顺序都有一个对应的索引值
    • 利用Face3的方法将3点连成一个三角面
 
// 设置顶点链接状况
 
 
 
 
 
 
材质( material),是独立于物体顶点信息以外的与渲染效果相关的属性。经过设置材质能够改变物体颜色、纹理贴图、光照模式等。
 
  • 下面将会为你们介绍基本材质两种基于光照模型材质法向量做为材质图像做为材质
 
 
使用基本材质( BasicMaterial)的物体,渲染后物体的颜色,始终为 该材质的颜色,不会因为光照产生明暗、阴影效果。若是没有指定材质的颜色,则颜色是随机的,构造函数以下:
 
  • 其中参数opt能够缺省,或者为包含各属性的值。如,为一个黄色正方体添加一个1不透明度 (opacity)
 
 
 
 
 
 
  • 下面,介绍几个经常使用的属性

    • map:使用纹理贴图(下面会着重讲解)
  • 对于基本材质,即便改变场景中的光源,使用该材质的物体也始终为颜色到处相同的效果。固然,这不是很具备真实感,所以,接下来咱们将介绍更为真实的光照模型:Lambert光照模型以及Phong光照模型。
 
 
Lambert材质( MeshLambertMaterial)是符合Lambert光照模型的材质。Lambert光照模型的主要特色是只考虑 漫反射而不考虑 镜面反射的效果,于是对于金属、镜子等须要镜面反射效果的物体就 不适应,对于其余大部分物体的漫反射效果都是适用的。
 
  • 它的光照模型的公式为:
 
  • 其中,Idiffuse是漫反射光强,Kd是物体表面的漫反射属性,Id是光强,theta是光的入射角弧度。
  • 固然,对于使用Three.js的Lambert材质,不须要了解以上公式就能够直接使用。建立Lambert材质的构造函数以下:
 
  • 示例代码(建立一个黄色并使用光照的立方体):

    • 光照这里不细讲,后面会着重讲解,这里你们只须要知道是干什么用的就行
 
 
 
 
 
 
  • 下面,介绍几个经常使用的属性:

    • color是用来表现材质对散射光的反射能力,也是最经常使用来设置材质颜色的属性。除此以外,还能够用ambientemissive控制材质的颜色。
    • ambient表示对环境光反射能力,只有当设置了AmbientLight后,该值才是有效的,材质对环境光的反射能力与环境光强相乘后获得材质实际表现的颜色。
    • emissive是材质的自发光颜色,能够用来表现光源的颜色。
 
 
  • 若是同时使用红色的自发光与黄色的散射光:
 
 
  • 这样就会出现一个渐变色的效果,咱们能够新建一个球体:
 
 
 
Phong材质( MeshPhongMaterial)是符合Phong光照模型的材质。和Lambert不一样的是,Phong模型考虑了 镜面反射的效果,所以对于金属、镜面的表现尤其适合。
 
  • 漫反射部分和Lambert光照模型是相同的,镜面反射模型的公式为:
 
  • 其中,Ispecular是镜面反射的光强Ks是材质表面镜面反射系数Is是光源强度alpha是反射光与视线的夹角n高光指数,越大则高光光斑越小。
  • 因为漫反射部分与Lambert模型是一致的,所以,若是不指定镜面反射系数,而只设定漫反射,其效果与Lambert是相同的:
 
 
 
 
 
 
 
  • 下面,介绍几个经常使用的属性:

    • 一样地,能够指定emissiveambient值,这里再也不说明。
    • 下面就specular值指定镜面反射系数做说明。
  • 首先,咱们只使用镜面反射(specular),将高光设为红色,应用于一个球体:
 
 
  • 能够经过shininess属性控制光照模型中的n值*(高光指数,光斑),当shininess值越大时,高光的光斑越小,默认值为30。咱们将其设置为1000时:
 
 
  • 使用黄色的镜面光,红色的散射光:
 
 
 
法向材质能够将材质的颜色设置为其 法向量的方向,有时候对于调试颇有帮助。
 
  • 法向材质的设定很简单,不须要设置参数。构造函数以下:
 
材质的颜色与照相机与该物体的角度相关,下面咱们只改变照相机位置,观察两个角度的颜色变化:
 /* 修改这里如下的值 */ 
 /* 修改这里以上的值 */
 
 
 
  • 咱们观察的是一样的三个面,可是因为观察的角度不一样,物体的颜色就不一样了。所以,在调试时,要知道物体的法向量,使用法向材质就颇有效。
 

7.5 材质的纹理贴图

 
在此以前,咱们使用的材质都是单一颜色的,有时候,咱们却但愿使用图像做为材质。这时候,就须要导入图像做为纹理贴图,并添加到相应的材质中。
 

7.5.1 单张图像应用于长方体

 
  • 首先,咱们须要选择一张长宽均为128像素的图像:
 
  • 将其导入到纹理texture中:
 
  • 而后,将材质的map属性设置为texture
 
  • 这样就完成了将图片应用于材质的基本步骤。可是因为如今咱们还没使用动画,画面只被渲染了一次,而在导入纹理以前,已经完成了此次渲染,所以看到的只是一片黑。因此,若是没有重绘函数(将在下一章介绍),就须要在完成导入纹理的步骤后,从新绘制画面,这是在回调函数中实现的:
 
  • 注意:须要在本地服务器运行。
 
 // 纹理(须要重绘函数)
 
  • 如今,就能看到这样的效果了:
 
  • 相似地,若是将其应用于球体,将会把整个球体应用该图像:
 

7.5.2 六张图像应用于长方体

 
有时候,咱们但愿长方体的六面各类的贴图都不一样。所以,咱们首先准备了六张颜色各异的图像,分别写了数字01到06。而后,分别导入图像到六个纹理,并设置到六个材质中:
 
 
 
用黑白相间的图片绘制一副棋盘
 
 
 
 

但是,棋盘格是8横8纵64个小方格组成的,那应该怎么办呢?
  • 首先,咱们须要指定重复方式为两个方向(wrapSwrapT)都重复:
 
  • 而后,设置两个方向上都重复4次,因为咱们的图像原本是有2行2列,因此重复4次即为8行8列:
 
 
 
在学习了几何形状和材质以后,咱们就能使用他们来建立物体了。最经常使用的一种物体就是网格(Mesh),网格是由顶点、边、面等组成的物体;其余物体包括线段( Line)、骨骼( Bone)、粒子系统( ParticleSystem)等。建立物体须要指定几何形状和材质,其中,几何形状决定了物体的 顶点位置等信息,材质决定了物体的 颜色、纹理等信息。
 
  • 本章将介绍建立较为经常使用的物体:网格,而后介绍如何修改物体的属性。
 
 
在上两节中,咱们学习了如何建立几何形状与材质,而网格的建立很是简单,只要把几何形状与材质传入其构造函数。最经常使用的物体是网格( Mesh),它表明包含 点、线、面的几何体,其构造函数是:
 
  • 下面,让咱们经过一个具体的例子了解如何建立网格:
 
// 几何体(长方体)
 
  • 若是materialgeometry以后不会复用的话,也能够合在一块儿写为:
 
 
 
 
 
除了在构造函数中指定材质,在网格被建立后,也能对材质进行修改:
 
 
  • 最终会显示红色,缘由很简单,在js语言预解析中,下面材质从新赋值后,就覆盖了上面定义的材质。
 

8.2.2 位置、缩放、旋转

 
位置、缩放、旋转是物体三个经常使用属性。因为 THREE.Mesh基础自 THREE.Object3D,所以包含 scale、rotation、position三个属性。它们都是 THREE.Vector3实例,所以修改其值的方法是相同的,这里以 位置为例。
 
  • THREE.Vector3x、y、z三个属性,若是只设置其中一个属性,则能够用如下方法:
 
  • 若是须要同时设置多个属性,可使用如下两种方法:
 
 
  • 示例代码(修改位置):
 
 
  • 缩放对应的属性是scale旋转对应的属性是rotation,具体方法与上例相同,分别表示沿x、y、z三轴缩放或旋转。

}

五年级数学期末试卷关注基础,凸显学生对知识技能的正确理解和熟练掌握。命题点多、面广,针对性强,难度适宜。有些题目具有实践性、可操作性。下面就是小编给大家带来的五年级上册数学期末试卷带答案,希望能帮助到大家!

五年级上册数学期末试卷带答案

一、填空(每小题2分,共20分)

}

|不将就的人生,才值得一过

资料都从互联网上收集而来,整理不易,电子版仅供家长或老师预览参考,资源版权属于原出版机构,倡导家长购买纸质版本,如有侵权,请联系删除。谢谢!

01、40个梨分给3个班,分给一班20个,其余平均分给二班和三班,二班分到( )个。

【解析】分给一班后还剩下40-20=20个梨,因为其余平均分给二班和三班,所以二班分到20÷2=10个。

02、7年前,妈妈年龄是儿子的6倍,儿子今年12岁,妈妈今年( )岁。

【解析】年龄问题,7年前,儿子年龄为12-7=5岁,而妈妈年龄是儿子的6倍,所以妈妈七年前的年龄为5×6=30

岁,那么妈妈今年37岁。

03、同学们进行广播操比赛,全班正好排成相等的6行。小红排在第二行,从头数,她站在第5个位置,从后数她站在第3个位置,这个班共有( )人

【解析】站队问题,要注意不要忽略本身。从头数,她站在第5个位置,说明她前面有5-1=4个人,从后数她站在第3个位置,说明她后面有3-1=2人,所以这一行的人数为4+2+1=7人,所以这个班的人数为7×6=42人。

04、有一串彩珠,按“2红3绿4黄”的顺序依次排列。第600颗是( )颜色。

【解析】周期循环问题,以2+3+4=9个一循环,600÷9=66....6,余数为6,所以第600颗是黄颜色。

05、用一根绳子绕树三圈余30厘米,如果绕树四圈则差40厘米,树的周长有( )厘米,绳子长( )厘米。

【解析】绕树三圈余30厘米,绕树四圈则差40厘米,所以树的周长为30+40=70厘米,绳子长为3×70+30=240厘米。

06、一只蜗牛在12米深的井底向上爬,每小时爬上3米后要滑下2米,这只蜗牛要( )小时才能爬出井口。

【解析】每小时爬上3米后要滑下2米,相当于每小时向上爬了1米,那么7小时后,蜗牛向上爬了7米,离井口还差3米,所以只需要再1小时,蜗牛就可爬出井口,因此需要的总时间为8小时。

07、锯一根10米长的木棒,每锯一段要2分钟。如果把这根木棒锯成相等的5段,一共要( )分钟。

【解析】把这根木棒锯成相等的5段,只需要锯4次,每次要2分钟,所以一共需要4×2=8分钟。

08、3只猫3天吃了3只老鼠,照这样的效率,9只猫9天能吃( ) 只。

【解析】事情发生的同时性,3只猫3天吃了3只老鼠,说明1只猫1天吃了1只老鼠,所以9只猫9天能吃9只。

09、 ┖┴┴┴┴┴┴┴┴┴┚图中共有( )条线段。

【解析】几何计数,数线段,直接利用公式,这条线段分成了10份,所以图中线段的总条数为:

10、有10把不同的锁,开这10把锁的10把钥匙混在一起了,最多要试多少次,才能把这10把锁和钥匙全部配对。

【解析】抽屉原理,考虑最不利的情况,第一把最多尝试9次,第二把最多尝试8次,以此类推,得出最多需要尝试的次数为:1+2+3+4+5+6+7+8+9=45次。

11、文具店有600本练习本,卖出一些后,还剩4包,每包25本,卖出多少本?

【解析】还剩下的本数为4×25=100本,所以卖出去的本数为600-100=500本。

12、三年级同学种树80颗,四、五年级种的棵树比三年级种的2倍多14棵,三个年级共种树多少棵?

【解析】四、五年级种的棵树为:2×80+14=174棵,所以三个年级共种树的棵数为:80+174=254棵。

13、学校有808个同学,分乘6辆汽车去春游,第一辆车已经接走了128人,如果其余5辆车乘的人数相同,最后一辆车乘了几个同学?

【解析】学校有808个同学,第一辆车已经接走了128人,那么还剩下的人数为:808-128=680人,而剩下的这些人被平分到了5辆车上,所以最后的一辆车有680÷5=136个同学。

14、学校里组织兴趣小组,合唱队的人数是器乐队人数的3倍,舞蹈队的人数比器乐队少8人,舞蹈队有24人,合唱队有多少人?

【解析】因为舞蹈队有24人,舞蹈队的人数比器乐队少8人,所以器乐队有24+8=32人;又因为合唱队的人数是器乐队人数的3倍,所以合唱队的人数是32×3=96人。

15、小强在计算除法时,把除数76写成67,结果得到的商是15还余5。正确的商应该是几?

因为....22,所以正确的商为13

16、一个书架有3层书,共有270本,从第一层拿出20本放到第二层,从第三层拿出17本放到第二层,这时三层书架中书的本数相等,原来每层各有几本书?

【解析】三层书架中书的本数相等时每层书架有书的本数为:270÷3=90本;

17、箱里放着同样个数的铅笔盒,如果从每只里拿出60个,那么5只箱里剩下铅笔盒的个数的总和等于原来2只箱里个数的和。原来每只箱里有多少个铅笔盒?

【解析】原来5只箱里个数的和-5×60=原来2只箱里个数的和; 所以原来3只箱里个数的和=300;

所以原来每只箱里有300÷3=100个铅笔盒

18、参加四年级数学竞赛同学中,男同学获奖人数比女同学多2人,女同学获奖人数比男同学人数的一半多2人,男女同学各有多少人获奖?

【解析】男同学=女同学+2;女同学=男同学÷2+2;

所以男同学=男同学÷2+2+2; 所以男同学的人数等于2×(2+2)=8人, 女同学的人数为6人

19、两块同样长的布,第一块用去32米,第二块用去20米,结果所余的米数第二块是第一块的3倍。两块布原来各长多少米?

20、一个正方形,被分成5个相等的长方形,每个长方形的周长是60厘米,正方形的周长是多少厘米

【解析】假设正方形的边长为x厘米

所以,解得x=25厘米

因此正方形的周长为25×4=100厘米

21、 从10000里面连续减25,减多少次差是0?

【解析】1,所以减400次差是0

22、 在一道没有余数的除法算式里,被除数(不为零)加上除数和商的积,得到的和,除以被除数,所得的商是多少?

【解析】因为被除数÷除数=商,即被除数=除数×商

23、 明明和花花用同一个数做除法,明明用12去除,花花用15去除。明明除得商是32余数是6,花花计算的结果应是多少?

24、 三棵树上停着24只鸟。如果从第一棵树上飞4只鸟到第二棵树上去,再从第二棵树飞5只鸟到第三树上去,那么三棵树上的小鸟的只数都相等,第二棵树上原有几只?

【解析】三棵树上的小鸟的只数都相等时每棵树上的只数为24÷3=8只;

所以第二棵原有的只数为:8-4+5=9只。

25、 两袋糖,一袋是84粒,一袋是20粒,每次从多的一袋里拿出8粒糖放到少的一袋里去,拿几次才能使两袋糖的粒数同样多。

【解析】一袋是84粒,一袋是20粒,多的比少的多了84-20=64粒;

当两袋糖的粒数同样多时,拿动的粒数为64÷2=32粒,也就是每袋有20+32=52粒;

每次拿出8粒一共需要的次数为:32÷8=4次

26、 小强、小清、小玲、小红四人中,小强不是最矮的,小红不是最高的,但比小强高,小玲不比大家高。请按从高到矮的顺序,把名子写出来。

【解析】简单逻辑推理题,因为小强不是最矮的,小红不是最高的,但比小强高,所以小强只能是第三高的,小红是第二高的;而小玲不比大家高,说明小玲最矮,此外就是小清最高;即从高到矮的顺序为:小清、小红、小强、小玲。

27、 用0、6、7、8、9这五个数字组成各个数位上数字不相同的两位数共有多少个?

【解析】两位数由个位和十位组成,而十位上一定不能为0,所以可能有6、7、8、9中的4种情况;

而个位上除掉十位上的数字以外,还有4种可能,所以根据乘法原理可得:组成各个数位上数字不相同的两

位数共有4×4=16个。

28、 五个同学参加乒乓球赛,每两人都要赛一场,一共要赛多少场?

【解析】排列组合,一共需要赛的场次为1+2+3+4=10次

29、2把小刀与3本笔记本的价钱相等,3本笔记本与6支铅笔的价钱相等,一把小刀1角8分,一支铅笔多少钱?

【解析】因为2把小刀与3本笔记本的价钱相等,3本笔记本与6支铅笔的价钱相等;

所以2把小刀与6支铅笔的价钱相等,即1把小刀与3支铅笔的价钱相等;

因为一把小刀1角8分,所以一支铅笔3角24分,即5角4分

30、两筐水果共重124千克,第一筐比第二筐多8千克,两筐水果各重多少千克?

【解析】和差问题,第一筐重量为(124+8)÷2=66千克,第二筐重量为(124-8)÷2=58千克

31、梨树比苹果树多78棵,梨树是苹果树的4倍,梨树、苹果树各有多少棵?

【解析】差倍问题,因为梨树是苹果树的4倍,所以梨树比苹果树多3倍的苹果树棵数;

所以苹果树棵数为78÷3=26棵,梨树棵数为78+26=104棵。

32、姐姐和妹妹共有书39本,如果姐姐给妹妹7本后就比妹妹少3本,那么姐姐和妹妹原来各有书多少本?

【解析】因为姐姐给妹妹7本后就比妹妹少3本,所以姐姐比妹妹原来多7+7-3=11本;

这时候就转化成了和差问题,所以姐姐原有书的本数为:(39+11)÷2=25本;

33、甲、乙、丙三个数,甲、乙的和比丙多59,乙、丙的和比甲多49,甲、丙的和比乙多85,求这三个数。

34、小明期末考试语文、数学、英语的平均分是95分,数学比语文多6分,英语比语文多9分,求三门功课各多少分?

【解析】数学=语文+6,英语=语文+9,数学+语文+英语=3×95=285

35、小军一家四口的年龄之和是129岁,小军7岁,妈妈30岁,小军与爷爷的年龄之和比他父母之和大5岁,爷爷和爸爸的年龄各几岁?

所以爷爷年龄是60岁,爸爸年龄是32岁。

36、一根木头锯成3段要10分钟,如果每次锯的时间相同,那么锯成10段要多少分钟?

【解析】一根木头锯成3段需要锯2次,也就是说锯1次需要的时间是5分钟;

那么锯成10段需要锯9次,所以需要的时间是5×9=45分钟。

37、食堂买了一批大米,第一次吃了全部的一半少10千克,第二次吃了余下的一半多10千克,这时还剩20千克,这批

【解析】倒推法,最后剩下了20千克,因为第二次吃了余下的一半多10千克,所以第二次吃之前剩下的重量为:2×(20+10)=60千克;

又因为第一次吃了全部的一半少10千克,所以这批大米共有2×(60-10)=100千克。

38、将被除数个位的0去掉与除数相等,被除数与除数和为374,则被除数、除数各是多少?

【解析】将被除数个位的0去掉与除数相等,说明被除数是除数的10倍;

所以被除数与除数和等于11倍的除数,所以除数等于374÷11=34,被除数等于340

39、鸡和兔共有34只,鸡比兔的2倍多4只。鸡、兔各有几只?

【解析】因为鸡比兔的2倍多4只,所以鸡和兔共有兔的3倍多4只;

40、合唱队男生人数比女生人数多46人,而且男生人数比女生的2倍少4人,问男生、女生各有多少人?

41、甲布比乙布长12米,丙布比甲布长28米,丙布的长是乙布的3倍,问甲、乙、丙布各长多少米?

将(3)代人(4)中得:3×乙布-乙布=40,解得乙布=20米

42、甲袋盐的重量是乙袋盐的3倍,如果从甲袋中取出15千克盐倒入乙袋中,那么两袋盐的重量就相等了,问两袋盐有重量多少千克?

【解析】因为从甲袋中取出15千克盐倒入乙袋中,那么两袋盐的重量就相等了,说明甲袋盐的重量比乙袋多15×2=30千克,又因为甲袋盐的重量是乙袋盐的3倍,即甲袋比乙袋多2倍的乙袋盐,所以乙袋盐的重量为30÷2=15千克,甲袋盐的重量为15×3=45千克

43、两堆煤重量相等,现从甲堆运走24吨煤,乙堆又运入8吨,这时乙堆煤的重量是甲堆的3倍,问两堆煤原来各有多少吨煤?

【解析】设原来两堆煤重量都是x吨,那么甲堆运走24吨煤后剩下x-24吨,乙堆又运入8吨还有x+8吨,所以x+8=3×(x-24),解得x=40吨

44.找规律填后面的数:1,4,9,16,( ),36……

【解析】第一个:分别是1、2、3、4、...的平方数,所以()处填5的平分,即25;

第二个:从第三项开始,每一项都是前两项的和,所以()处填5和8的和,即13

45.运动场上有一条长45米的跑道,两端已插了二面彩旗,体育老师要求在这条跑道上每5米隔再插一面彩旗,还需要彩旗( )面。

【解析】间隔问题,45÷5=9,所以包括两段有9+1=10个,那么还需要彩旗10-2=8面。

46.一条毛毛虫长到成虫,每天长一倍,10天能长到10厘米,长到20厘米时要( )天。

【解析】因为每天长一倍,所以当10天能长到10厘米,只需要再一天就能到20厘米,所以长到20厘米时要11天.

【解析】因为AB×3=111,根据积的个位是1,可得B=7,那么A=3

48. 下图中小格都是正方形,图中共有( )正方形。

【解析】有14个(9+4+1=14),分别是9个格子、左上左下右上右下各1个、还有1个最大的外框。

49. 王勤同学的储蓄箱内有2分和5分的硬币20个,总计人民币7角6分,其中2分硬币有( )个。

【解析】假设其中2分硬币有x个,那么5分的硬币有20-x个

50. 一个钥匙开一把锁,现在有8把钥匙和8把锁被搞乱了,要把它们重新配对,最多试( )次,最少( )次。

【解析】抽屉原理,首先考虑最不利的情况,第一把钥匙最多尝试7次,第二把钥匙最多尝试6次,以此类推,一共最多需要尝试1+2+3+4+5+6+7=28次;

其次考虑最有利的情况,也就是每次都是第一下就配对了,由于第7把配对完后,最后一把也就无需尝试了,所以最少只需要试7次即可。

以上内容均来源于网络收集整理,仅供交流和分享,部分源于互联网无法核实真实出处,如有涉及侵权,请及时联系我们予以删除,谢谢~!

}

我要回帖

更多关于 三角形外做两个正方形 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信