第2章 还记得点,线,面吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第2章 还记得点,线,面吗相关的知识,希望对你有一定的参考价值。

参考技术A

1、因为精彩,所以值得

还记得2000年左右有一个很不错的OpenGL教程《Nehe OpenGL》,大学时,我才有机会读到那么好的教程。那时,废寝忘食,花了一个月的时间看完了整个教程。觉得不过瘾,又读了一遍师兄翻译的中文教程。在当时,Nehe教程实为经典,第一个原因是当时OpenGL的资料非常罕见,无论是新华书店,还是互联网上都很难找到一本详尽的OpenGL教程。第二个原因是NeHe教程的作者确实非常用心,写出来很精彩的实例,并浅显易懂的讲解了它。

我一直认为,我写《WebGL中文网》的目的是为3D爱好者们提供一套精彩的入门和精通资料,这套资料不仅包含基础知识,而且包含工程级别的实例,更重要的是,那能让大家理解图形学知识。长此以来,很多同学在学习了计算机图形学后,对图形学的知识还是不能应用。有很大的原因,就是缺少理论化的实践,所以,这点,我们也考虑到了,一定在讲解示例的过程中,将其中的图形学原理也给阐述清楚。

以使大家认真学习后,能够在较短的时间学到我所学习的知识。

关于图形学这些知识,我是用了很多时间去摸索的,在资料匮乏的时候去掌握一门新的知识,确实是很费时间和脑力的事情,但是现在,有了本教程,你可以直通光明顶,学到可以胜任WebGL工作的技能。我想,这也是《WebGL中文网》的宗旨吧。

2、不从画鸡蛋开始,我们从画点开始

睁开您的眼睛,看看你的周围,它是一个多么美妙的3D世界啊。3D世界由什么组成,除了上帝,还有谁能够回答呢?

是的,没有人能够回答这个问题。但是在计算机世界里,3D世界由什么组成就很好回答。

1、3D世界的组成

在计算机世界里,3D世界是由点组成,两个点能够组成一条直线,三个不在一条直线上的点就能够组成一个三角形面,无数三角形面就能够组成各种形状的物体,如下图:

我们通常把这种网格模型叫做Mesh模型。给物体贴上皮肤,或者专业点就叫做纹理,那么这个物体就活灵活现了。最后无数的物体就组成了我们的3D世界。

那么3D世界的组成,是否真的这样简单?是的,从编程的角度,目前为此,你只需要知道这些。下一节,我们从点说起。

2、在Threejs中定义一个点

在三维空间中的某一个点可以用一个坐标点来表示。一个坐标点由x,y,z三个分量构成。在three.js中,点可以在右手坐标系中表示:

空间几何中,点可以用一个向量来表示,在Three.js中也是用一个向量来表示的,代码如下所示:

View Raw Code?

1

2

3

4

5

6

7

THREE.Vector3 = function ( x, y, z )
   

   

this.x = x || 0;
   

this.y = y || 0;
   

this.z = z || 0;
   

   

;    


我们来分析这段代码:前面我们已经知道了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。

3、点的操作

在3D世界中点可以用THREE.Vector3D来表示。对应源码为/src/math/Vector3.js(注意:源码所在的位置,可能不同版本不一样,请自己搜索Vector3关键词来确定)。在您继续学习之前,你可以打开该文件浏览一下,推荐使用WebStorm,如果没有,你也可以用NotePad++。

现在来看看怎么定义个点,假设有一个点x=4,y=8,z=9。你可以这样定义它:

var point1 = new THREE.Vecotr3(4,8,9);

另外你也可以使用set方法,代码如下:

var point1 = new THREE.Vector3();

point1.set(4,8,9);

我们这里使用了set方法,为了以后深入学习的方便,这里将Vector3的常用方法列出如下,为了不影响文章的连贯性,我们专门列出了一个网页来介绍它。

3、实例:画一条彩色线

初中数学中有一个定理:两个不重合的点能够决定一条直线。在three.js中,也可以通过定义两个点,来画一条直线。我们先看看,这一节,我们要完成实例的效果图:

例子说明:这是一条每个点不同颜色的线条

这个例子的代码如下所示,可以在“【初级教程\\chapter2\\2-1.html】”中找到这份代码:在线浏览

View Raw Code?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

<!DOCTYPE html>
   

<html>
   

   <head>
   

       <meta charset="UTF-8">
   

       <title>Three框架</title>
   

       <script src="js/Three.js"></script>
   

       <style type="text/css">
   

           div#canvas-frame
   

               border: none;
   

               cursor: pointer;
   

               width: 100%;
   

               height: 600px;
   

               background-color: #EEEEEE;
   

           
   

   

       </style>
   

       <script>
   

           var renderer;
   

           function initThree()
   

               width = document.getElementById('canvas-frame').clientWidth;
   

               height = document.getElementById('canvas-frame').clientHeight;
   

               renderer = new THREE.WebGLRenderer(
   

                   antialias : true
   

               );
   

               renderer.setSize(width, height);
   

               document.getElementById('canvas-frame').appendChild(renderer.domElement);
   

               renderer.setClearColor(0xFFFFFF, 1.0);
   

           
   

   

           var camera;
   

           function initCamera()
   

               camera = new THREE.PerspectiveCamera(45, width / height, 1, 10000);
   

               camera.position.x = 0;
   

               camera.position.y = 1000;
   

               camera.position.z = 0;
   

               camera.up.x = 0;
   

               camera.up.y = 0;
   

               camera.up.z = 1;
   

               camera.lookAt(
   

                   x : 0,
   

                   y : 0,
   

                   z : 0
   

               );
   

           
   

   

           var scene;
   

           function initScene()
   

               scene = new THREE.Scene();
   

           
   

   

           var light;
   

           function initLight()
   

               light = new THREE.DirectionalLight(0xFF0000, 1.0, 0);
   

               light.position.set(100, 100, 200);
   

               scene.add(light);
   

           
   

   

           var cube;
   

           function initObject()
   

   

               var geometry = new THREE.Geometry();
   

               var material = new THREE.LineBasicMaterial( vertexColors: true );
   

               var color1 = new THREE.Color( 0x444444 ), color2 = new THREE.Color( 0xFF0000 );
   

   

               // 线的材质可以由2点的颜色决定
   

               var p1 = new THREE.Vector3( -100, 0, 100 );
   

               var p2 = new THREE.Vector3(  100, 0, -100 );
   

               geometry.vertices.push(p1);
   

               geometry.vertices.push(p2);
   

               geometry.colors.push( color1, color2 );
   

   

               var line = new THREE.Line( geometry, material, THREE.LinePieces );
   

               scene.add(line);
   

           
   

   

           function threeStart()
   

               initThree();
   

               initCamera();
   

               initScene();
   

               initLight();
   

               initObject();
   

               renderer.clear();
   

               renderer.render(scene, camera);
   

           
   

   

       </script>
   

   </head>
   

   

   <body onload="threeStart();">
   

       <div id="canvas-frame"></div>
   

   </body>
   

</html>
   

看看A begin 和A end之间的代码,就是画线的代码。

本回答被提问者采纳

第11章

多个命令执行用分号
date ; who
创建shell脚本文件
开头是 ?#!/bin/bash?
新建的脚本文件记得赋予执行权限 ?chmod u+x test1.sh?
这里 u for user g for group o for other a for all , default is a






以上是关于第2章 还记得点,线,面吗的主要内容,如果未能解决你的问题,请参考以下文章

图2

第6章

第1章学习小结

第1章Git分布式版本控制系统

第1章 计算机网络

在三维空间中,向量a与b共面吗?