封面图

第177期:threejs中的几何体(二)_Math

这一小节接着说几何体。

EdgesGeometry

边缘几何体,用来绘制物体的边缘线,可以用来框住某个具体的物体,比如官方案例:

第177期:threejs中的几何体(二)_Math_02

它的使用流程稍微复杂一些,首先要声明一个几何体,然后给这个几何体包裹一层边,再给这层边添加线条。

示例代码如下:

const geometry = new THREE.BoxGeometry( 100, 100, 100 ); 
const edges = new THREE.EdgesGeometry( geometry ); 
const line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial( { color: 0xffffff } ) ); 
scene.add( line );

LatheGeometry

车削几何体、旋转几何体,主要用来创建具有轴对称性的网格对象,比如花瓶、冷却塔等。

第177期:threejs中的几何体(二)_前端_03

它的构造器接收以下参数:

  • points-二维向量矩阵。每个点的x坐标必须大于零。默认值是一个具有(0,-0.5)、(0.5,0)和(0,0.5)的数组,它可以创建一个简单的菱形。
  • segments—要生成的圆周线段数。默认值为12。
  • phiStart-以弧度为单位的起始角度。默认值为0。
  • phiLength-车削部分的弧度(0到2PI)。默认值为2PI。

它的使用方式如下:

const points = [];
for ( let i = 0; i < 10; i ++ ) {
	points.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
}
const geometry = new THREE.LatheGeometry( points );
const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
const lathe = new THREE.Mesh( geometry, material );
scene.add( lathe );

示例代码:

// 创建样条曲线的点集
const points = []
const height = 5
const count = 30
for (let i = 0; i < count; i++) {
  points.push(
    new THREE.Vector3(
      (Math.sin(i * 0.2) + Math.cos(i * 0.3)) * height + 12,
      i - count + count / 2,
      0
    )
  )
}
// 绘制样条曲线产生的图形
const geom = new THREE.LatheGeometry(points,12,0,Math.PI*2)

示例效果:

第177期:threejs中的几何体(二)_前端_04

RingGeometry

环形几何体。主要用来生成二维的环形平面图形。

第177期:threejs中的几何体(二)_Math_05

它的构造器参数如下:

  • innerRadius-默认值为0.5。
  • outerRadius-默认值为1。
  • thetaSsegments(分段数)-分段数。数字越大,戒指就越圆。最小值为3。默认值为32。
  • phiSegments-最小值为1。默认值为1。
  • θ开始-开始角度。默认值为0。
  • thetaLength-中心角。默认值为Math.PI*2。

使用方式如下:

const geometry = new THREE.RingGeometry( 1, 5, 32 ); 
const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );
const mesh = new THREE.Mesh( geometry, material ); 
scene.add( mesh );

SphereGeometry

球体。球体是一个非常常用的几何体。

第177期:threejs中的几何体(二)_Math_06

它的构造器参数为:

  • radius-球体半径。默认值为1。
  • widthSegments—水平线段的数量。最小值为3,默认值为32。
  • heightSegments—垂直线段的数量。最小值为2,默认值为16。
  • phiStart-指定水平起始角度。默认值为0。
  • phiLength-指定水平扫描角度大小。默认值为Math.PI*2。
  • θ开始-指定垂直开始角度。默认值为0。
  • thetaLength-指定垂直扫掠角度的大小。默认值为Math.PI。

这个几何体是通过扫描和计算Y轴(水平扫描)和Z轴(垂直扫描)周围的顶点来创建的。因此,可以通过使用phiStart、phiLength、thetaStart和thetaLength的不同值来创建不完整的球体(类似于“球体切片”),以便定义开始(或结束)计算这些顶点的点,比如:

第177期:threejs中的几何体(二)_JavaScript_07

它的使用方式如下:

const geometry = new THREE.SphereGeometry( 15, 32, 16 ); 
const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } ); 
const sphere = new THREE.Mesh( geometry, material ); 
scene.add( sphere );

TorusGeometry

圆环几何体,用于生成圆环体几何图形,如:

第177期:threejs中的几何体(二)_Math_08

它的构造器参数为:

  • radius-圆环体的半径,从圆环体的中心到管的中心。默认值为1。
  • tube-管道的半径。默认值为0.4。
  • radialSegments-默认值为12
  • tubularSegments-默认值为48。
  • 弧度-中心角。默认值为Math.PI*2。

它的使用方式如下:

const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 ); 
const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } ); 
const torus = new THREE.Mesh( geometry, material ); 
scene.add( torus );

TorusKnotGeometry

圆环结几何体。

用来创建一个圆环结,其特定形状由一对互质整数p和q定义。

如果p和q不是互质的,则结果将是圆环链接。

比如:p=4,q=2

第177期:threejs中的几何体(二)_JavaScript_09

比如:p=4,q=4

第177期:threejs中的几何体(二)_Math_10

比如:p=5,q=4

第177期:threejs中的几何体(二)_前端_11

其构造器参数如下:

  • radius—圆环体的半径。默认值为1。
  • tube-管道的半径。默认值为0.4。
  • tubularSegments-默认值为64。
  • radialSegments-默认值为8。
  • p-该值决定几何体绕其旋转对称轴旋转的次数。默认值为2。
  • q-该值决定了几何体在圆环体内部绕一个圆缠绕的次数。默认值为3。

其使用方式如下:

const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 ); 
const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } ); 
const torusKnot = new THREE.Mesh( geometry, material ); 
scene.add( torusKnot );

TubeGeometry

管道几何体。可以沿着3d曲线创建一个管道,比如:

第177期:threejs中的几何体(二)_前端_12

它的构造器参数如下:

  • path-从Curve基类继承的三维路径。默认为二次贝塞尔曲线。
  • tubularSegments-Integer-组成管道的管段数。默认值为64。
  • radius-管道的半径。默认值为1。
  • radialSegments-组成横截面的线段数量。默认值为8。
  • closed-管道是打开的还是关闭的。默认值为false。

示例代码如下:

class CustomSinCurve extends THREE.Curve {

	constructor( scale = 1 ) {
		super();
		this.scale = scale;
	}

	getPoint( t, optionalTarget = new THREE.Vector3() ) {

		const tx = t * 3 - 1.5;
		const ty = Math.sin( 2 * Math.PI * t );
		const tz = 0;

		return optionalTarget.set( tx, ty, tz ).multiplyScalar( this.scale );
	}
}

const path = new CustomSinCurve( 10 );
const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );
const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
const mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );

其基本使用过程为:

  1. 先创建曲线
  2. 再创建管道几何体
  3. 然后设置正常的网格物体

WireframeGeometry

线框几何体。主要用作辅助对象,以线框的形式查看几何体。

以其他几何体作为参数。

示例代码如下:

const geometry = new THREE.SphereGeometry( 100, 100, 100 );

const wireframe = new THREE.WireframeGeometry( geometry );

const line = new THREE.LineSegments( wireframe );
line.material.depthTest = false;
line.material.opacity = 0.25;
line.material.transparent = true;

scene.add( line );

官方示例:

第177期:threejs中的几何体(二)_Math_13