THREE.JS之几何体(Geometry)

      众所周知,在3D世界里,物体都是有网格构成的,而网格的组织规则是通过几何体(Geometry)来定义。在three.js中,有两类几何体,我把它们叫做基本几何体和buffer几何体。基本几何体的顶点位置,缩放,旋转角,颜色,法线信息都是保存在特定的类里面,比如顶点位置使用Vector3,颜色信息使用Color。而buffer类的都是使用数组存储的,并且缓存在了内存缓冲区里,减低了对GPU的消耗。正是由于基本几何体和Buffer几何体的特点,决定了他们各自的使用场景:基本集合使用类来管理自身信息,便于操作,用来创建经常变化的物体;buffer几何体由于使用数组来管理,如果需要操作,必须去除其原始信息,很难操作,而且buffer几何体的信息被缓存在缓冲区中,减低了对GPU的消耗,所以Buffer几何体适用于创建那种一旦创建就不需要修改的物体。

      three.js中基本上是每个基本几何体都有一个buffer几何体与之对应,而且两者的创建方式和参数基本一致,这里只对基本集合体作说明。

在下面的例子中,使用的是同一个材质:

var material = new THREE.MeshPhongMaterial({
    color: 0xffffff,
    wireframe:false,
})

BoxGeometry立方体
BoxGeometry(width, height, depth, widthSegments, heightSegments, depthSegments)

width — X轴方向上的长.
height — Y轴方向上的高.
depth — Z轴方向上的宽.
widthSegments — 可选项,x轴方向的切割面,默认是1.
heightSegments — 可选项,y轴上的切割面,默认是1.
depthSegments — 可选项,z轴上的切割面,默认是1.

例子

var box = new THREE.Mesh(new THREE.BoxBufferGeometry(100,100,100,10,10,10),material);
    scene.add(box); 

这里写图片描述

这里写图片描述

CircleGeometry/圆盘

CircleGeometry(radius, segments, thetaStart, thetaLength)

radius — 圆盘的半径,默认是20.
segments —三角形切割面的数量,最小值是3,默认是8.
thetaStart — 第一个三角形切割面的其实位置,默认是0,三点钟方向.
thetaLength —圆心角的大小,默认是2PI,一个正圆.

例子

var circle = new THREE.Mesh(new THREE.CircleGeometry(100,100,0,Math.PI*7/4),material);
    scene.add(circle);

这里写图片描述

这里写图片描述

ConeGeometry/锥体

ConeGeometry(radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength)

radius — 底面半径,默认是20.
height — 高,默认是100.
radiusSegments —底面的三角形切割面,默认是8
heightSegments —斜面的切割线数量,默认是1.
openEnded — 指定锥体底面是否打开,默认是false,表示封闭.
thetaStart — 锥体底面第一个三角形切割面的起始位置,默认是0,三点钟方面,沿逆时针方向绘制.
thetaLength — 底面圆心角,默认是2PI,完整的锥体.

例子

var cone = new THREE.Mesh(new THREE.ConeGeometry(100,100,100,10,false,0,Math.PI*3/2),material);
    scene.add(cone);

这里写图片描述

这里写图片描述

CylinderGeometry/圆柱体
CylinderGeometry(radiusTop, radiusBottom, height, radiusSegments, heightSegments, openEnded, thetaStart, thetaLength)

radiusTop — 上底面半径,默认是20.
radiusBottom —下底面半径,默认是20.
height — 高,默认是100.
radiusSegments — 底面三角形切割面的数量,默认是8
heightSegments — 侧面切割面数量,默认是1.
openEnded — 指定底面是否打开,默认是false,标识封闭.
thetaStart — 底面第一个三角形切割面的起始位置,默认是0,三点钟方向.
thetaLength — 底面圆心角的大小.

例子

var cylinder = new THREE.Mesh(new THREE.CylinderGeometry(50,100,100,10,10,false,0,Math.PI*3/2),material);
    scene.add(cylinder);

这里写图片描述

这里写图片描述

DodecahedronGeometry/十二面体

DodecahedronGeometry(radius, detail)

radius — 十二面体的半径,默认是1.
detail — 默认是0,设置为n时,几何体的面是12的n倍.

例子

var dodecahed = new THREE.Mesh(new THREE.DodecahedronGeometry(50,0),material);
    scene.add(dodecahed);

这里写图片描述

这里写图片描述

ExtrudeGeometry

ExtrudeGeometry(shapes, options)

shapes — Shape 或者Shape数组
options — 包括下面的数组.
curveSegments — int. 圆角的层数
steps — int. 物体本身在厚度上的分层数量
amount — 整型,物体的厚度
bevelEnabled — bool. 是否允许边角圆滑过度(开启bevelEnabled,其实物体本身是没有变化的,而是在物体的前后加上一个薄层,用来实现圆角)
bevelThickness — float. 附加层的厚度
bevelSize — float. 附加层的圆角的斜面长度
bevelSegments — int. 附加的圆角的层数
extrudePath — THREE.CurvePath. 3d spline path to extrude shape along. (creates Frames if (frames aren’t defined)
frames — THREE.TubeGeometry.FrenetFrames. containing arrays of tangents, normals, binormals
material — int. material index for front and back faces
extrudeMaterial — int. material index for extrusion and beveled faces
UVGenerator — Object. object that provides UV generator functions

例子

var heartShape = new THREE.Shape();
heartShape.moveTo( 0, 50,0);
    heartShape.lineTo(50,100,0);
    heartShape.lineTo(100,50,0);

    heartShape.lineTo(0,-50,0);

    heartShape.lineTo(-100,50,0);

    heartShape.lineTo(-50,100,0);
    heartShape.lineTo(0, 50,0);

var extrudeSettings = { amount: 10, bevelEnabled: true, bevelSegments: 10, steps: 10, bevelSize: 10, bevelThickness: 10 };

var extrude = new THREE.Mesh(new THREE.ExtrudeGeometry(heartShape,extrudeSettings),material);
    scene.add(extrude);

这里写图片描述

这里写图片描述

IcosahedronGeometry/二十面体
IcosahedronGeometry(radius, detail)

radius — 十二面体的半径,默认是1.
detail — 默认是0,设置为n时,几何体的面是20的n倍.

例子

var icosahedron = new THREE.Mesh(new THREE.IcosahedronGeometry(50,0),material);                             scene.add(icosahedron);

这里写图片描述

这里写图片描述

LatheGeometry/Y轴的轴对称图形
LatheGeometry(points, segments, phiStart, phiLength)

points — X0Y平面上的Vector2点的集合,x坐标不能小于0
segments — 图像的切线数量
phiStart — 轴对称图形的开始绘制方向,默认是0,六点钟方向.
phiLength — 周对称图形的圆心角大小,默认是2PI.

例子

var points = [];
for(var i=0; i<20;i++){
    points.push(new THREE.Vector2(i,i*i-2*i));
}
var lathe = new THREE.Mesh(new THREE.LatheGeometry( points,10,0,Math.PI),material);
    scene.add(lathe);

这里写图片描述

这里写图片描述

OctahedronGeometry/八面体
OctahedronGeometry(radius, detail)

radius — 十二面体的半径,默认是1.
detail — 默认是0,设置为n时,几何体的面是8的n倍.

例子

var octahedron = new THREE.Mesh(new THREE.OctahedronGeometry(50,0),material);
    scene.add(octahedron);

这里写图片描述

这里写图片描述

PlaneGeometry/平面
PlaneGeometry(width, height, widthSegments, heightSegments)

width — 平面的宽度(X轴).
height — 平面的长度(Y轴).
widthSegments — 可选项,宽的切割线数量,默认是1.
heightSegments —可选项,长的切割线数量,默认是1.

var plane = new THREE.Mesh(new THREE.PlaneGeometry(100,100,5,5),material);
    scene.add(plane);

这里写图片描述

这里写图片描述

PolyhedronGeometry/多面体

PolyhedronGeometry(vertices, faces, radius, detail)

vertices — 顶点的数组,如[1,1,1, -1,-1,-1,…],则第一个顶点的坐标是(1,1,1),第二个顶点的坐标是(-1,-1,-1)
faces —面的顶点坐标的索引,应用vertices的顶点,如[0,1,2, 3,4,5,…],则第一个面由顶点0,1,2构成,第二个面由顶点3,4,5构成
radius — Float - 多面体的半径
detail — Integer - 设置为n时,多面体的面的数量增加基础面的n倍.

例子

var verticesOfCube = [
  -1,-1,-1,    1,-1,-1,    1, 1,-1,    -1, 1,-1,
    -1,-1, 1,    1,-1, 1,    1, 1, 1,    -1, 1, 1,
];

var indicesOfFaces = [
    2,1,0,    0,3,2,
    0,4,7,    7,3,0,
    0,1,5,    5,4,0,
    1,2,6,    6,5,1,
    2,3,7,    7,6,2,
    4,5,6,    6,7,4
];

var polyhedron = new THREE.Mesh( new THREE.PolyhedronGeometry( verticesOfCube, indicesOfFaces, 50, 1),material);
    scene.add(polyhedron);

这里写图片描述

这里写图片描述

RingGeometry/圆环面

RingGeometry(innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength)

innerRadius — 内环的半径,设置为0时无用
outerRadius — 外环半径,默认是50.
thetaSegments — 径向切割面,值越大,越圆滑,最小是3,默认是8
phiSegments — 环向切割线,最小是1,默认是8.
thetaStart — 起始角度,默认是0,三点钟方向.
thetaLength — 圆心角大小,默认是2*PI.

例子

var ring = new THREE.Mesh(new THREE.RingGeometry(20,50,10,20,0,Math.PI),material);
    scene.add(ring);

这里写图片描述

这里写图片描述

ShapeGeometry/自定义图像
shapes — shape对象或shape对象数组
options — 可选配置项
curveSegments - Integer - 通常不用-默认是12
material - Integer - material 在material 列表中的索引
UVGenerator - A UV generator, defaults to ExtrudeGeometry’s WorldUVGenerator

例子

var rectShape = new THREE.Shape();
    rectShape.moveTo(-50,-50);
    rectShape.lineTo(-50,50);
    rectShape.lineTo(50,50);
    rectShape.lineTo(50,-50);
    rectShape.lineTo(-50,-50);

var shape = new THREE.Mesh(new THREE.ShapeGeometry(rectShape),material);
    scene.add(shape);

这里写图片描述

这里写图片描述

SphereGeometry/球体
SphereGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength)

radius — 球体半径,默认是50.
widthSegments — 水平方向上的切割线,最小值是3,默认是8.
heightSegments — 竖直方向上的切割线,最小值是2,默认值是6.
phiStart —水平方向的其实位置,默认是0,九点钟方向.
phiLength — 水平方向的圆心角,默认是2*PI.
thetaStart — 竖直方向上的起始角度,默认是0,y轴正方向.
thetaLength — 竖直方向上的圆心角,默认是PI.

例子:

var sphere = new THREE.Mesh(new THREE.SphereGeometry(50,10,10,0,Math.PI*2, 0, Math.PI/2),material);
    scene.add(sphere);

这里写图片描述

这里写图片描述

TetrahedronGeometry/四面体
TetrahedronGeometry(radius, detail)

radius — 十二面体的半径,默认是1.
detail — 默认是0,设置为n时,几何体的面增加4的n倍.

这里写图片描述

这里写图片描述

TorusGeometry/圆环面

TorusGeometry(radius, tube, radialSegments, tubularSegments, arc)

radius — 圆环的半径.
tube — 圆环截面半径.
radialSegments —管段表面三角形切割面的数量
tubularSegments — 管段数量,默认是6.
arc — 圆心角,默认是2PI.

例子

var torus = new THREE.Mesh(new THREE.TorusGeometry(100,30,30,20,Math.PI*2),material);
    scene.add(torus);

这里写图片描述

这里写图片描述

TorusKnotGeometry/环形纽面
TorusKnotGeometry(radius, tube, tubularSegments, radialSegments, p, q)

radius — 半径,默认是100.
tube — 管道截面半径,默认是40.
radialSegments —管段表面三角形切割面的数量
tubularSegments — 管段数量,默认是6.
p — 该值决定图形围绕中心轴的环的数量.
q — 该值决定环的起伏数量

注意:如果p和q不互质,那么自动将p=p/最大公因数;q=q/最大公因数

例子

var torusKnot = new THREE.Mesh(new THREE.TorusKnotGeometry(60,10,60,8,2,5),material);
    scene.add(torusKnot);

这里写图片描述

这里写图片描述

以上就是three.js常用的几何体,当然还有几个不是很常用的,而且官方文档上也没有详细介绍,这里就不做介绍了,向要了解的朋友可以到官网上看看。

最后吐槽一下csdn的博客编辑器,没有自动保存功能真的是把朕害苦了,前后共编辑了三次才完成。由于博文太长,没法一次写完,第一次写的时候,没有保存到草稿箱,关闭浏览器之后所有内容都丢掉了。第二次编辑的时候只保存一半到草稿箱,丢了一大半。希望csdn官方能解决这个问题。

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Three.js是一个用于创建和展示3D图形的JavaScript库。它基于WebGL技术,可以在现代浏览器中实现高性能的3D渲染效果。Three.js提供了丰富的功能和API,使得开发者可以轻松地创建复杂的3D场景、模型和动画。 心几何图形是指以心形为基础的几何形状。在Three.js中,你可以使用几何体Geometry)和材质(Material)来创建心几何图形。通过定义顶点坐标和面的连接关系,可以构建出心形的几何体。然后,通过给几何体添加材质,可以设置心形的颜色、纹理等属性。 补光(Ambient Lighting)是一种用于模拟环境光照效果的光照技术。在Three.js中,你可以通过设置场景(Scene)的环境光(AmbientLight)来实现补光效果。环境光会均匀地照亮场景中的所有物体,使其不会完全黑暗,增加整体的可见性和真实感。 以下是使用Three.js创建心几何图形并添加补光效果的代码示例: ```javascript // 创建场景 var scene = new THREE.Scene(); // 创建相机 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; // 创建渲染器 var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建心几何体 var geometry = new THREE.ShapeGeometry(new THREE.Shape().fromPoints([ new THREE.Vector2(0, 1), new THREE.Vector2(1, 0), new THREE.Vector2(0, -1), new THREE.Vector2(-1, 0) ])); var material = new THREE.MeshBasicMaterial({ color: 0xff0000 }); var heart = new THREE.Mesh(geometry, material); scene.add(heart); // 添加环境光 var ambientLight = new THREE.AmbientLight(0xffffff, 0.5); scene.add(ambientLight); // 渲染循环 function animate() { requestAnimationFrame(animate); heart.rotation.x += 0.01; heart.rotation.y += 0.01; renderer.render(scene, camera); } animate(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值