Three.js基础探寻四——立方体、平面与球体

  前面简单介绍了webGL和Three.js的背景以及照相机的设定,接下来介绍一些Three.js中的几何形状。

1.立方体

  虽然这一形状的名字叫立方体(CubeGeometry),但它其实是长方体,也就是长宽高可以设置为不同的值。其构造函数是:

THREE.CubeGeometry(width,height,depth,widthSegments,heightSegments, depthSegments)

  width:x方向上的长度

  height:y方向上的长度

  depth:z方向上的长度

  widthSegments:x方向上的分段数(可选,缺省值1)

  heightSegments:y方向上的分段数(同上)

  depthSegments:z方向上的分段数(同上)

  未分段:

var material = new THREE.MeshBasicMaterial({

  color: 0xffff00,

  wireframe: true

});

drawCube(scene, material);

function drawCube(scene, material) {

  var cube = new THREE.Mesh(new THREE.CubeGeometry(1, 2, 3), material);

  scene.add(cube);

}

  物体的默认位置是原点,对于立方体而言,是其几何中心在原点的位置。

  分段:

var cube = new THREE.Mesh(new THREE.CubeGeometry(1, 2, 3, 2, 2, 3), material);

  为什么会有这么多邪线呢?版本问题。R73版本:

  注意这个分段是对六个面进行分段,而不是对立方体的体素分段,因此在立方体的中间是不分段的,只有六个侧面被分段。

2.平面

  这里的平面(PlaneGeometry)其实是一个长方形,而不是数学意义上无限大小的平面。其构造函数为:

THREE.PlaneGeometry(width, height, widthSegments, heightSegments)  

  width:x方向上的长度

  height:y方向上的长度

  widthSegments:x方向上的分段数(可选,缺省值1)

  heightSegments:y方向上的分段数(同上)

  new THREE.PlaneGeometry(2, 4);创建的平面在x轴和y轴所在平面内,效果如下:

3.球体

  球体(SphereGeometry)的构造函数是:

THREE.SphereGeometry(radius,segmentsWidth,segmentsHeight,phiStart, phiLength, thetaStart, thetaLength)

// radius:半径

// segmentsWidth:经度上的分段数

// segmentsHeight:纬度上的分段数

// phiStart:经度开始的弧度

// phiLength:经度跨过的弧度

// thetaStart:纬度开始的弧度

// thetaLength:纬度跨过的弧度

  3.1 经纬度分段数

  首先,我们来理解下segmentsWidth和segmentsHeight。使用var sphere = new THREE.SphereGeometry(3, 8, 6)可以创建一个半径为3,经度划分成8份,纬度划分成6份的球体,如下图所示。

  segmentsWidth相当于经度被切成了几瓣,而segmentsHeight相当于纬度被切成了几层。

  new THREE.SphereGeometry(3, 5, 4)的效果:

  new THREE.SphereGeometry(3, 8, 6)的效果:

  new THREE.SphereGeometry(3, 18, 12)的效果:

  在图形底层的实现中,并没有曲线的概念,曲线都是由多个折线近似构成的。对于球体而言,当这两个值较大的时候,形成的多面体就可以近似看做是球体了。

  3.2 经度弧度

  new THREE.SphereGeometry(3, 8, 6, Math.PI / 6, Math.PI / 3)表示起始经度为Math.PI / 6,经度跨度为Math.PI / 3。效果如下:

  注意,这里segmentsWidth为8意味着对于经度从Math.PI / 6跨过Math.PI / 3的区域内划分为8块,而不是整个球体的经度划分成8块后再判断在此经度范围内的部分。

  3.3 纬度弧度

  纬度弧度同理。new THREE.SphereGeometry(3, 8, 6, 0, Math.PI * 2, Math.PI / 6, Math.PI / 3)表示纬度从Math.PI / 6跨过Math.PI / 3。效果如下:

  new THREE.SphereGeometry(3, 8, 6, Math.PI / 2, Math.PI, Math.PI / 6, Math.PI / 2)的效果:

4.源码

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>3.js测试四</title>
 6     </head>
 7     <body onload="init()">
 8         <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
 9     </body>
10     <script type="text/javascript" src="js/three.min.js"></script>
11     <script type="text/javascript">
12         function init() {
13             var renderer = new THREE.WebGLRenderer({
14                 canvas: document.getElementById(‘mainCanvas‘)
15             });
16             renderer.setClearColor(0x000000);
17             var scene = new THREE.Scene();
18
19             // camera
20             var camera = new THREE.OrthographicCamera(-5, 5, 3.75, -3.75, 0.1, 100);
21             camera.position.set(25, 25, 25);
22             camera.lookAt(new THREE.Vector3(0, 0, 0));
23             scene.add(camera);
24
25             // 材质
26             var material = new THREE.MeshBasicMaterial({
27                 color: 0xffff00,
28                 wireframe: true
29             });
30
31             drawCube(scene, material);        //立方体
32 //          drawPlane(scene, material);        //平面
33 //          drawSphere(scene, material);    //球体
34
35             // render
36             renderer.render(scene, camera);
37         }
38
39         function drawCube(scene, material) {
40             var cube = new THREE.Mesh(new THREE.CubeGeometry(1, 2, 3, 2, 2, 3), material);
41             scene.add(cube);
42         }
43
44         function drawPlane(scene, material) {
45             var plane = new THREE.Mesh(new THREE.PlaneGeometry(2, 4), material);
46             scene.add(plane);
47         }
48
49         function drawSphere(scene, material) {
50             var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 18, 12), material);
51 //          var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 8, 6, Math.PI / 6, Math.PI / 3), material);
52 //          var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 8, 6, 0, Math.PI * 2, Math.PI / 6, Math.PI / 3), material);
53 //            var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 8, 6, Math.PI / 2, Math.PI, Math.PI / 6, Math.PI / 2), material);
54             scene.add(sphere);
55         }
56     </script>
57 </html>

整理自张雯莉《Three.js入门指南》

时间: 2024-10-16 15:21:42

Three.js基础探寻四——立方体、平面与球体的相关文章

Three.js基础探寻一

1.webGL 一种网络标准,定义了一些较底层的图形接口. 2.Three.js 一个3Djs库,webGL开源框架中比较优秀的一个.除了webGL以外,Three.js还提供了基于Canvas.SVG标签的渲染器. 这是一个开源项目. 3.环境 找一个喜欢的jsIDE.调试建议使用Chrome或者Firefox. 4.下载 传送门 5.使用 <head> <script type="text/javascript" src="js/three.js&quo

Three.js基础探寻九——网格

在学习了几何形状和材质之后,我们就能使用他们来创建物体了.最常用的一种物体就是网格(Mesh),网格是由顶点.边.面等组成的物体:其他物体包括线段(Line).骨骼(Bone).粒子系统(ParticleSystem)等.创建物体需要指定几何形状和材质,其中,几何形状决定了物体的顶点位置等信息,材质决定了物体的颜色.纹理等信息. 本篇将介绍创建较为常用的物体:网格,然后介绍如何修改物体的属性. 1.创建网格 在前几篇中,我们学习了如何创建几何形状与材质,而网格的创建非常简单,只要把几何形状与材质

js基础教程四之无缝滚动

前面学习了相关js的一些基础知识,这节主要针对定时器作综合运用: 无缝滚动-基础 效果演示: *物体运动基础 *让div移动起来 *offsetLeft的作用 *用定时器让物体连续移动 <style type="text/css"> #div1{ width:100px; height:100px; background:#CCC; margin-top:10px; position:absolute; left:0px;} </style> <scrip

React.js 基础入门四--要点总结

JSX语法,像是在Javascript代码里直接写XML的语法,实质上这只是一个语法糖,每一个XML标签都会被JSX转换工具转换成纯Javascript代码,React 官方推荐使用JSX, 当然你想直接使用纯Javascript代码写也是可以的,只是使用JSX,组件的结构和组件之间的关系看上去更加清晰. 1. HTML 标签 和 React 组件 在JS中写HTML标签,也许小伙伴们都惊呆了,那么React又是怎么区分HTML标签,React组件标签? HTML标签: var myDivEle

js基础第四天

多个tab栏切换class封装 <style>         *{margin:0;padding:0;}         ul{list-style:none;}         .box {             width: 350px;             height: 300px;             border:1px solid #ccc;             margin: 100px auto;             overflow: hidden; 

Three.js基础探寻十——动画

本篇将介绍如果使用Three.js进行动态画面的渲染.此外,将会介绍一个Three.js作者写的另外一个库stat.js,用来观测每秒帧数(FPS). 1.实现动画效果 1.1 动画原理 对于Three.js程序而言,动画的实现是通过在每秒中多次重绘画面实现的. 为了衡量画面切换速度,引入了每秒帧数FPS(Frames Per Second)的概念,是指每秒画面重绘的次数.FPS越大,则动画效果越平滑,当FPS小于20时,一般就能明显感受到画面的卡滞现象. 那么FPS是不是越大越好呢?其实也未必

JS基础(四)运算符

一.比较运算符 1.== : 判断两边值是否相等 2.>= : 判断左边的值是否大于或等于右边的值 3.<= : 判断左边边的值是否小于或等于右边的值 4.>   : 判断左边的值是否大于右边的值 5.<   : 判断右边的值是否大于左边的值 6.!=  : 判断两边的值是否不相等 7.===: 判断两边的值是否绝对相等 8.!==: 判断两边的值是否绝对不相等(绝对相等或绝对不相等,判断除了值以外还需要判断数据类型) 二.逻辑运算符 1.&&:逻辑与,两边的结果必

JS基础四

1.函数是一组可以随时随地运行的语句. 函数是 ECMAScript 的核心. 函数是由这样的方式进行声明的:关键字 function.函数名.一组参数,以及置于括号中的待执行代码. 2.闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量. 3.把对象的所有引用都设置为 null,可以强制性地废除对象.object  设置为null, 4.本地对象(native object) Object Function Array String Boolean Numb

JS基础知识回顾:引用类型(四)

每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法. 由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 函数的声明有以下三种形式: function sum(num1,num2){return num1+num2;}//利用函数声明语法定义 var sum=function(num1,num2){return num1+num2;}//利用函数表达式定义 var sum=new Function("num1","nu