【three.js】模型-几何体Geometry,材质Material

news2025/1/8 17:44:05

模型

        在现实开发中,有时除了需要用代码创建模型之外,多数场景需要加载设计师提供的使用设计软件导出的模型。此时就需要使用模型加载器去加载模型,不同格式的模型需要引入对应的模型加载器,虽然加载器不同,但是使用方式基本上是相同的。下面就是使用 OBJLoader 加载 .obj 格式模型的过程

var loader = new THREE.OBJLoader();
loader.load(model, function (object) {
  object.traverse(function (child) {
    if (child.isMesh) {
      // 对模型子网格的一些操作
    }
  });
  scene.add(object);
});

        模型对象主要包括点模型(Points)、线模型(Line)、网格模型(Mesh)等,它们的父类都是Object3D。这意味着可以对这些模型进行旋转、缩放、平移等操作。这些操作通常通过修改模型的属性(如位置position、缩放scale等)或使用相关方法(如translateX、rotateY等)来实现。

        

点模型(Points):点模型是由几何体的每一个顶点数据渲染为一个方形区域构成的,方形区域的大小可以设置。通常使用点材质(PointsMaterial)来渲染点模型。

线模型(Line):线模型是使用线条去连接几何体的顶点数据构成的。根据顶点的连接方式,线模型可以分为闭环线渲染(LineLoop)和间断性渲染(LineSegments)等类型。

网格模型(Mesh):网格模型是由三个顶点确定一个三角形,通过三角形面绘制渲染几何体的所有顶点,通过一系列的三角形拼接出来一个曲面构成的。如果设置网格模型的wireframe属性为true,所有三角形会以线条形式绘制出来。网格模型通常与各种网格材质(如MeshBasicMaterial、MeshLambertMaterial、MeshPhongMaterial等)一起使用。

Three.js 支持的模型格式:3ds (.3ds)、amf (.amf)、3mf (.3mf)、assimp & assimp2json (.assimp |.json)、awd (.awd)、Babylon (.babylon)、BVH (.bvh)、Collada(.dae |.xml)、OpenCTM (.ctm)、draco(.drc)、FBX(.fbx)、GCode (.gcode)、glTF (.gltf)、Clara(.json)、KMZ(.kmz)、LDraw(.mpd)、LightWave(.lwo)、MD2 (.md2)、MMD(.pmd | .vmd)、nrrd (.nrrd)、obj/obj2 (.obj)、pcd (.pcd)、PDB(.pdb)、PlayCanvas(.json)、ply (.ply)、prwm(.prwm)、sea3d(.sea3d)、stl(.stl)、vrm(.vrm)、vrml(.vrml)、vtk、x等

一、几何体

二维几何体模型 

PlaneGeometry(平面几何体)

描述:平面是一个二维的几何体,在three.js中常用于常见地板或背景

PlaneGeometry(width : Float, height : Float, widthSegments : Integer, heightSegments : Integer)

width — 平面沿着 X 轴的宽度。默认值是 20
height — 平面沿着 Y 轴的高度。默认值是 20
widthSegments — (可选)平面的宽度分段数,默认值是 30
heightSegments — (可选)平面的高度分段数,默认值是 30

const geometry = new THREE.PlaneGeometry(20, 20, 30, 30); 
// 创建一个宽度和高度均为5,水平和垂直分段数均为32的平面
const material = new THREE.MeshBasicMaterial({ 
    color: 0xffffff, 
    side: THREE.DoubleSide 
}); // 创建一个白色基本材质,并设置双面渲染
const plane = new THREE.Mesh(geometry, material); 
// 将几何体和材质组合成一个网格对象
scene.add(plane); 
// 将网格对象添加到场景中

CircleGeometry(圆形几何体)

创建圆形平面,如圆形的标志、按钮或其他平面圆形物体

new THREE.CircleGeometry(radius, segments, thetaStart, thetaLength)

radius:圆的半径,默认为1。

segments:沿着圆周的分割段数,默认为8。更大的分割段数会使圆形看起来更平滑。

thetaStart:起始角(弧度),默认为0。可以用来创建一个不完整的圆形。

thetaLength:圆弧的角度长度(弧度),默认为2 * Math.PI(完整圆形)。可以用来创建一个扇形或不完整的圆形。

CircleGeometry(radius : Float, segments : Integer, thetaStart : Float, thetaLength : Float)

radius — 圆形的半径,默认值为12
segments — 分段(三角面)的数量,最小值为3,默认值为32。
thetaStart — 第一个分段的起始角度,默认为0。(three o'clock position)
thetaLength — 圆形扇区的中心角,通常被称为“θ”(西塔)。默认值是2*Pi,这使其成为一个完整的圆。

// 创建一个基本的圆形几何体
const geometry = new THREE.CircleGeometry(12, 32);
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const circle = new THREE.Mesh(geometry, material);
circle.rotation.x = -Math.PI / 2; // 使圆形垂直于地面
scene.add(circle);

RingGeometry(圆环几何体)

环形几何体是一个具有内径和外径的圆环面,可以用于创建戒指、轮子或其他圆形结构。

new THREE.RingGeometry(innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength)

innerRadius:环形的内半径,默认为0.5。

outerRadius:环形的外半径,默认为1。

thetaSegments:沿环形周长的分割段数,默认为8。增加此值可以提高环形的平滑度。

phiSegments:沿环形厚度方向的分割段数,默认为8。增加此值可以提高环形侧面的平滑度。

thetaStart:环形起始角度(弧度),默认为0。可以用来创建一个不完整的环形。

thetaLength:环形的弧长(弧度),默认为Math.PI * 2(即360度)。可以用来创建一个不完整的环形。

// 创建一个基本的环形几何体
const geometry = new THREE.RingGeometry(1, 5, 32, 8);
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const ring = new THREE.Mesh(geometry, material);
scene.add(ring);

ShapeGeometry(形状几何体)

描述:从一个或多个路径形状中创建一个单面多边形几何体

const x = 0, y = 0;

const heartShape = new THREE.Shape();

heartShape.moveTo( x + 5, y + 5 );
heartShape.bezierCurveTo( x + 5, y + 5, x + 4, y, x, y );
heartShape.bezierCurveTo( x - 6, y, x - 6, y + 7,x - 6, y + 7 );
heartShape.bezierCurveTo( x - 6, y + 11, x - 3, y + 15.4, x + 5, y + 19 );
heartShape.bezierCurveTo( x + 12, y + 15.4, x + 16, y + 11, x + 16, y + 7 );
heartShape.bezierCurveTo( x + 16, y + 7, x + 16, y, x + 10, y );
heartShape.bezierCurveTo( x + 7, y, x + 5, y + 5, x + 5, y + 5 );

const geometry = new THREE.ShapeGeometry( heartShape );
const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
const mesh = new THREE.Mesh( geometry, material ) ;
scene.add( mesh );

ShapeGeometry(shapes : Array, curveSegments : Integer)

shapes — 一个单独的shape,或者一个包含形状的Array。Default is a single triangle shape.
curveSegments - Integer - 每一个形状的分段数,默认值为12。

三维几何体模型

BoxGeometry(立方几何体)

描述:立方体是最简单的三维几何体之一,有六个面组成

BoxGeometry(width : Float, height : Float, depth : Float, widthSegments : Integer, heightSegments : Integer, depthSegments : Integer)

width — X 轴上面的宽度,默认值为 15
height — Y 轴上面的高度,默认值为 15
depth — Z 轴上面的深度,默认值为 15
widthSegments — (可选)宽度的分段数,默认值是 1
heightSegments — (可选)高度的分段数,默认值是 1
depthSegments — (可选)深度的分段数,默认值是 1

const geometry = new THREE.BoxGeometry(15, 15, 15); 
// 创建一个边长为1的立方体
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); 
// 创建一个绿色基本材质
const cube = new THREE.Mesh(geometry, material); 
// 将几何体和材质组合成一个网格对象
scene.add(cube); 
// 将网格对象添加到场景中

 ConeGeometry(圆锥缓冲几何体)

描述:一个用于生成圆锥几何体的类。

ConeGeometry(radis : Float, height : Float, radialSegments : Integer, heightSegments : Integer, openEnded : Boolean, thetaStart : Float, thetaLength : Float)

radius — 圆锥底部的半径,默认值为1。
height — 圆锥的高度,默认值为1。
radialSegments — 圆锥侧面周围的分段数,默认为32。
heightSegments — 圆锥侧面沿着其高度的分段数,默认值为1。
openEnded — 一个Boolean值,指明该圆锥的底面是开放的还是封顶的。默认值为false,即其底面默认是封顶的。
thetaStart — 第一个分段的起始角度,默认为0。(three o'clock position)
thetaLength — 圆锥底面圆扇区的中心角,通常被称为“θ”(西塔)。默认值是2*Pi,这使其成为一个完整的圆锥。

const geometry = new THREE.ConeGeometry( 5, 20, 32 );
const material = new THREE.MeshBasicMaterial( {color: 0xffff00} );
const cone = new THREE.Mesh( geometry, material );
scene.add( cone );

SphereGeometry(球几何体)

描述:球体是一个完美的立体图形,所有点到中心的距离都相等。

SphereGeometry(radius : Float, widthSegments : Integer, heightSegments : Integer, phiStart : Float, phiLength : Float, thetaStart : Float, thetaLength : Float)

radius — 球体半径,默认为1。
widthSegments — 水平分段数(沿着经线分段),最小值为3,默认值为32。
heightSegments — 垂直分段数(沿着纬线分段),最小值为2,默认值为16。
phiStart — 指定水平(经线)起始角度,默认值为0。。
phiLength — 指定水平(经线)扫描角度的大小,默认值为 Math.PI * 2。
thetaStart — 指定垂直(纬线)起始角度,默认值为0。
thetaLength — 指定垂直(纬线)扫描角度大小,默认值为 Math.PI。

const geometry = new THREE.SphereGeometry(0.5, 32, 32); 
// 创建一个半径为0.5,经度和纬度分段数均为32的球体
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 }); 
// 创建一个红色基本材质
const sphere = new THREE.Mesh(geometry, material); 
// 将几何体和材质组合成一个网格对象
scene.add(sphere); 
// 将网格对象添加到场景中

CapsuleGeometry(胶囊图形)

描述:CapsuleGeometry是一个胶囊图形类,通过半径和高度来进行构造。使用lathe来进行构造

CapsuleGeometry(radius : Float, length : Float, capSegments : Integer, radialSegments : Integer)

radius — 胶囊半径。可选的; 默认值为5。

length — 中间区域的长度。可选的; 默认值为10。

capSegments — 构造盖子的曲线部分的个数。可选的; 默认值为10。

radialSegments — 覆盖胶囊圆周的分离的面的个数。可选的; 默认值为20。

const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8 ); 
const material = new THREE.MeshBasicMaterial( {color: 0x00ff00} ); 
const capsule = new THREE.Mesh( geometry, material ); scene.add( capsule );

CylinderGeometry(圆柱几何体)

描述:圆柱体由一个顶面,一个底面和一个侧面组成。

CylinderGeometry(radiusTop : Float, radiusBottom : Float, height : Float, radialSegments : Integer, heightSegments : Integer, openEnded : Boolean, thetaStart : Float, thetaLength : Float)

radiusTop — 圆柱的顶部半径,默认值是1。
radiusBottom — 圆柱的底部半径,默认值是1。
height — 圆柱的高度,默认值是1。
radialSegments — 圆柱侧面周围的分段数,默认为32。
heightSegments — 圆柱侧面沿着其高度的分段数,默认值为1。
openEnded — 一个Boolean值,指明该圆锥的底面是开放的还是封顶的。默认值为false,即其底面默认是封顶的。
thetaStart — 第一个分段的起始角度,默认为0。(three o'clock position)
thetaLength — 圆柱底面圆扇区的中心角,通常被称为“θ”(西塔)。默认值是2*Pi,这使其成为一个完整的圆柱。

const geometry = new THREE.CylinderGeometry(1, 1, 1, 32); 
// 创建一个顶部和底部半径均为0.5,高度为1,圆周分段数为32的圆柱体
const material = new THREE.MeshBasicMaterial({ color: 0x0000ff }); 
// 创建一个蓝色基本材质
const cylinder = new THREE.Mesh(geometry, material); 
// 将几何体和材质组合成一个网格对象
scene.add(cylinder); 
// 将网格对象添加到场景中

ExtrudeGeometry(挤压几何体)

描述:从一个形状路径中,挤压

const length = 12, width = 8;

const shape = new THREE.Shape();
shape.moveTo( 0,0 );
shape.lineTo( 0, width );
shape.lineTo( length, width );
shape.lineTo( length, 0 );
shape.lineTo( 0, 0 );

const extrudeSettings = {
	steps: 2,
	depth: 16,
	bevelEnabled: true,
	bevelThickness: 1,
	bevelSize: 1,
	bevelOffset: 0,
	bevelSegments: 1
};

const geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings );
const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
const mesh = new THREE.Mesh( geometry, material ) ;
scene.add( mesh );

ExtrudeGeometry(shapes : Array, options : Object)

shapes — 形状或者一个包含形状的数组。
options — 一个包含有下列参数的对象:

curveSegments — int,曲线上点的数量,默认值是12。

steps — int,用于沿着挤出样条的深度细分的点的数量,默认值为1。

depth — float,挤出的形状的深度,默认值为1。

bevelEnabled — bool,对挤出的形状应用是否斜角,默认值为true。

bevelThickness — float,设置原始形状上斜角的厚度。默认值为0.2。

bevelSize — float。斜角与原始形状轮廓之间的延伸距离,默认值为bevelThickness-0.1。

bevelOffset — float. Distance from the shape outline that the bevel starts. Default is 0.

bevelSegments — int。斜角的分段层数,默认值为3。

extrudePath — THREE.Curve对象。一条沿着被挤出形状的三维样条线。Bevels not supported for path extrusion.

UVGenerator — Object。提供了UV生成器函数的对象。

TorusGeometry(圆环几何体)

创建缓慢几何体类似于甜甜圈

new THREE.TorusGeometry(radius, tube, radialSegments, tubularSegments, arc)

radius:环面的半径(即从环面中心到管中心的距离),默认为100。

tube:管的半径(即管的厚度),默认为40。

radialSegments:沿环面径向的分割段数,默认为8。增加此值可以提高环面的平滑度。

tubularSegments:沿环面管方向的分割段数,默认为6。增加此值可以提高环面的平滑度。

arc:环面旋转的角度(弧度),默认为Math.PI * 2(即360度)。可以用来创建一个不完整的环面

TorusGeometry(radius : Float, tube : Float, radialSegments : Integer, tubularSegments : Integer, arc : Float)

radius - 环面的半径,从环面的中心到管道横截面的中心。默认值是1。
tube — 管道的半径,默认值为0.4。
radialSegments — 管道横截面的分段数,默认值为12。
tubularSegments — 管道的分段数,默认值为48。
arc — 圆环的圆心角(单位是弧度),默认值为Math.PI * 2。

// 创建一个基本的环面几何体
const geometry = new THREE.TorusGeometry(10, 3, 32, 32);
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const torus = new THREE.Mesh(geometry, material);
scene.add(torus);

TorusKnotGeometry(圆环几何体)

描述:创建一个圆环扭结,其特殊形状由一对互质的整数,p和q所定义。如果p和q不互质,创建出来的几何体将是一个环面链接。

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 );

TorusKnotGeometry(radius : Float, tube : Float, tubularSegments : Integer, radialSegments : Integer, p : Integer, q : Integer)

radius - 圆环的半径,默认值为1。

tube — 管道的半径,默认值为0.4。

tubularSegments — 管道的分段数量,默认值为64。

radialSegments — 横截面分段数量,默认值为8。

p — 这个值决定了几何体将绕着其旋转对称轴旋转多少次,默认值是2。

q — 这个值决定了几何体将绕着其内部圆环旋转多少次,默认值是3。

TetrahedronGeometry(四面几何体)

描述:一个用于生成四面几何体的

TetrahedronGeometry(radius : Float, detail : Integer)

radius — 四面体的半径,默认值为1。

detail — 默认值为0。将这个值设为一个大于0的数将会为它增加一些顶点,使其不再是一个四面体。

OctahedronGeometry(八面几何体)

描述:一个用于创建八面体的

OctahedronGeometry(radius : Float, detail : Integer)

radius — 八面体的半径,默认值为1。
detail — 默认值为0,将这个值设为一个大于0的数将会为它增加一些顶点,使其不再是一个八面体

DodecahedronGeometry(十二面几何体)

描述:一个用于创建十二面几何体的类

DodecahedronGeometry(radius : Float, detail : Integer)

radius — 十二面体的半径,默认值为1。
detail — 默认值为0。将这个值设为一个大于0的数将会为它增加一些顶点,使其不再是一个十二面体。

IcosahedronGeometry(二十面几何体)

描述:一个用于生成二十面体的类

IcosahedronGeometry(radius : Float, detail : Integer)

radius — 二十面体的半径,默认为1。
detail — 默认值为0。将这个值设为一个大于0的数将会为它增加一些顶点,使其不再是一个二十面体。当这个值大于1的时候,实际上它将变成一个球体。

LatheGeometry(车削几何体)

描述:创建具有轴对称的网格,比如花瓶。车削绕着Y轴来进行旋转。

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 );

LatheGeometry(points : Array, segments : Integer, phiStart : Float, phiLength : Float)

points — 一个Vector2对象数组。每个点的X坐标必须大于0。 Default is an array with (0,-0.5), (0.5,0) and (0,0.5) which creates a simple diamond shape.
segments — 要生成的车削几何体圆周分段的数量,默认值是12。
phiStart — 以弧度表示的起始角度,默认值为0。
phiLength — 车削部分的弧度(0-2PI)范围,2PI将是一个完全闭合的、完整的车削几何体,小于2PI是部分的车削。默认值是2PI。

名称构造器参数
ShapeGeometry【形状几何体】 shapes — 一个单独的 shape,或者一个包含形状的 Array。 curveSegments - Integer - 每一个形状的分段数,默认值为 12
TextGeometry

【文本几何体】 fontTHREE.Font 的实例。sizeFloat。字体大小,默认值为 100heightFloat。挤出文本的厚度。默认值为 50curveSegmentsInteger。曲线上点的数量。默认值为 12bevelEnabledBoolean。是否开启斜角,默认为 falsebevelThicknessFloat。文本上斜角的深度,默认值为 20bevelSizeFloat。斜角与原始文本轮廓之间的延伸距离。默认值为 8bevelSegmentsInteger。斜角的分段数。默认值为 3

TetrahedronGeometry【四面几何体】 radius — 四面体的半径,默认值为 1detail — 默认值为 0。将这个值设为一个大于 0 的数将会为它增加一些顶点,使其不再是一个四面体
OctahedronGeometry【八面几何体】 radius — 八面体的半径,默认值为 1detail — 默认值为 0,将这个值设为一个大于 0 的数将会为它增加一些顶点,使其不再是一个八面体
DodecahedronGeometry【十二面几何体】 radius — 十二面体的半径,默认值为 1detail — 默认值为 0。将这个值设为一个大于 0 的数将会为它增加一些顶点,使其不再是一个十二面体
IcosahedronGeometry【二十面几何体】 radius — 二十面体的半径,默认为 1detail — 默认值为 0。将这个值设为一个大于 0 的数将会为它增加一些顶点,使其不再是一个二十面体。当这个值大于 1 的时候,实际上它将变成一个球体
TorusKnotGeometry

【圆环扭结几何体】 radius - 圆环的半径,默认值为 1tube — 管道的半径,默认值为 0.4tubularSegments — 管道的分段数量,默认值为 64radialSegments — 横截面分段数量,默认值为 8p — 这个值决定了几何体将绕着其旋转对称轴旋转多少次,默认值是 2q — 这个值决定了几何体将绕着其内部圆环旋转多少次,默认值是 3

PolyhedronGeometry

【多面几何体】 vertices — 一个顶点 Array[1,1,1, -1,-1,-1, … ]indices — 一个构成面的索引 Array[0,1,2, 2,3,0, … ]radiusFloat - 最终形状的半径。detailInteger - 将对这个几何体细分多少个级别。细节越多,形状就越平滑

TubeGeometry(管道几何体)

创建管状几何体,根据给定的路径曲线创建一个三维管状物体。

广泛应用于创建管道、血管、电缆等

new THREE.TubeGeometry(path, tubularSegments, radius, [closed])

path:一个THREE.Curve对象,定义了管状几何体沿着的路径。

tubularSegments:沿路径方向的分割段数,默认为64。增加此值可以提高管状几何体的平滑度。

radius:管状几何体的半径,默认为1。这是指从路径到管壁的距离。

closed:布尔值,指示路径是否应该被视为闭合路径,默认为false。如果为true,则路径的第一个点和最后一个点会被连接起来。

TubeGeometry(path : Curve, tubularSegments : Integer, radius : Float, radialSegments : Integer, closed : Boolean)

path — Curve - 一个由基类Curve继承而来的3D路径。 Default is a quadratic bezier curve.
tubularSegments — Integer - 组成这一管道的分段数,默认值为64。
radius — Float - 管道的半径,默认值为1。
radialSegments — Integer - 管道横截面的分段数目,默认值为8。
closed — Boolean 管道的两端是否闭合,默认值为false。

//1、
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 );




// 2、创建一个基本的管状几何体
const points = [];
points.push(new THREE.Vector3(0, 0, 0));
points.push(new THREE.Vector3(2, 0, 0));
points.push(new THREE.Vector3(2, 2, 0));
points.push(new THREE.Vector3(0, 2, 0));
const path = new THREE.CatmullRomCurve3(points);
const geometry = new THREE.TubeGeometry(path, 64, 0.2);
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const tube = new THREE.Mesh(geometry, material);
scene.add(tube);

二、材质

名称描述
MeshBasicMaterial基础网格基础材质,用于给几何体赋予一种简单的颜色,或者显示几何体的线框
MeshDepthMaterial网格深度材质,这个材质使用从摄像机到网格的距离来决定如何给网格上色。
MeshStandardMaterial标准网格材质,一种基于物理的标准材质,使用 Metallic-Roughness 工作流程
MeshPhysicalMaterial物理网格材质,MeshStandardMaterial 的扩展,能够更好地控制反射率。
MeshNormalMaterial网格法向材质,这是一种简单的材质,根据法向向量计算物体表面的颜色
MeshLambertMaterial网格 Lambert 材质,这是一种考虑光照影响的材质,用于创建暗淡的、不光亮的物体。
MeshPhongMaterial网格 Phong 式材质,这是一种考虑光照影响的材质,用于创建光亮的物体
MeshToonMaterial网格 Phong 式材质,MeshPhongMaterial 卡通着色的扩展。
ShaderMaterial着色器材质,这种材质允许使用自定义的着色器程序,直接控制顶点的放置方式以及像素的着色方式
LineBasicMaterial直线基础材质,这种材质可以用于 THREE.Line 直线几何体,用来创建着色的直线。

基础网格材质(MeshBasicMaterial)【常用】

一个以简单着色(平面或线框)方式来绘制几何体的材质,这种材质不受光照的影响。常用于背影、2D图形等场景。

参数

color:材质颜色。

opacity:透明度,取值范围为0(完全透明)到1(完全不透明)。

transparent:布尔值,指示材质是否透明。如果设置为true,则材质将考虑透明度的影响。

map:纹理贴图。

示例

const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ 
    color: 0x00ff00, 
    transparent: true, 
    opacity: 0.5 
});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);


网格材质(MeshLambertMaterial)【常用】

一种非光泽表面的材质,没有镜面高光。适用于模拟一些表面(如未经处理的木材或石材),但不能模拟具有镜面高光的光泽表面。

受光照影响—— 漫反射

参数(继承自THREE.Material):

color:材质颜色。

map:纹理贴图。

alphaMap:透明度贴图。

emissive:自发光颜色。

示例

const material = new THREE.MeshLambertMaterial({ color: 0x00ff00 });

网格材质(MeshPhongMaterial)

支持漫反射和镜面反射光照模型,可以模拟物体表面对光线的漫反射和镜面反射效果。相比于Lambert材质,效果较好,但性能开销较大。

受光照影响——高光

参数

color:材质颜色。

specular:镜面反射颜色。

shininess:光泽度,控制镜面高光的大小。

示例

const material = new THREE.MeshPhongMaterial({ 
    color: 0x00ff00, 
    specular: 0x111111, 
    shininess: 30 
});

法线网格材质(MeshNormalMaterial)【拓展:不常用】

根据法向向量来计算物体表面的颜色。这种材质可以显示网格的法线方向,常用于调试或特殊效果。

注意:法线材质并不支持镜面反射,这里的描述有误。正确的描述应该是它直接显示法线的方向,颜色通常与法线的方向有关。

示例

const material = new THREE.MeshNormalMaterial();

物理材质(MeshStandardMaterial)

一种高度可配置的材质,专为基于物理的渲染(PBR)设计。通过调整金属度、粗糙度等参数,可以模拟出从非金属到金属的各种材质效果。

受光照影响——物理材质

参数

color:材质颜色。

metalness:金属度,取值范围为0(非金属)到1(金属)。

roughness:粗糙度,取值范围为0(光滑)到1(粗糙)。

map:漫反射贴图。

envMap:环境贴图。

示例

const material = new THREE.MeshStandardMaterial({ 
    color: 0x00ff00, 
    metalness: 0, 
    roughness: 0.5 
});

物理材质(MeshPhysicalMaterial)

MeshPhysicalMaterial是Three.js中一种基于物理的材质类型,它提供了更多的物理属性来模拟现实世界中的材料特性。

与MeshStandardMaterial相比,MeshPhysicalMaterial具有额外的物理属性,如清漆层、透光率、反射率、光泽、折射率等,使其更适合模拟具有特定光学特性的材料,如透明材料、半透明材料等。

受光照影响——物理材质

参数

color:基础颜色,默认为白色(0xffffff)。

map:基础颜色贴图,可以用来替代材质的颜色。

roughness:粗糙度,默认为0.5。粗糙度定义了表面的光滑程度,数值越高,表面越粗糙。

metalness:金属度,默认为0.5。金属度定义了表面的金属程度,数值越高,表面越像金属。

emissive:自发光颜色,默认为黑色(0x000000)。即使在没有光源的情况下,也会显示这个颜色。

clearcoat:清漆层厚度,默认为0。定义了表面的额外涂层,通常用于模拟汽车油漆的效果。

clearcoatRoughness:清漆层粗糙度,默认为0。定义了清漆层的粗糙程度。

ior(Index of Refraction):折射率,默认为1.5。定义了材料的折射率,对于透明或半透明材料特别重要。

transmission:透射,默认为0。定义了光线透过材料的程度,对于透明或半透明材料特别重要。

其他:还包括normalMap(法线贴图)、roughnessMap(粗糙度贴图)、metalnessMap(金属度贴图)、emissiveMap(自发光贴图)、alphaMap(透明度贴图)、displacementMap(置换贴图)等纹理贴图属性,以及opacity(全局透明度)、transparent(是否开启透明模式)、side(指定材质在哪一面渲染)等通用属性。

适用于汽车油漆效果、玻璃、水、金属等材质的创建。

// 创建几何体
const geometry = new THREE.BoxGeometry(1, 1, 1);

// 加载基础颜色贴图
const textureLoader = new THREE.TextureLoader();
const colorTexture = textureLoader.load('path/to/color_texture.jpg');

// 创建 MeshPhysicalMaterial
const material = new THREE.MeshPhysicalMaterial({
    map: colorTexture,         // 基础颜色贴图
    color: 0xffffff,           // 基础颜色(这里会被贴图覆盖,但可用于没有贴图的部分)
    emissive: 0x000000,        // 自发光颜色
    metalness: 0.5,            // 金属度
    roughness: 0.5,            // 粗糙度
    transmission: 1,           // 启用透射
    ior: 1.5,                  // 折射率
    thickness: 0.1,            // 厚度(对于透射效果重要)
    side: THREE.DoubleSide     // 双面渲染
});

// 创建网格对象
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);


MeshToonMaterial

这种材质使用卡通渲染效果,通常用于游戏和动画中。通过梯度纹理来控制阴影效果。

参数

color:材质颜色。

gradientMap:梯度纹理,用于卡通阴影效果。

示例

const gradientTexture = new THREE.TextureLoader()
.load('path/to/gradient.png');
const material = new THREE.MeshToonMaterial({ 
    color: 0x00ff00, 
    gradientMap: gradientTexture 
});


ShaderMaterial

        通过自定义着色器来创建材质,适用于需要高级图形效果的情况。需要编写顶点和片段着色器代码。

参数

vertexShader:顶点着色器代码。

fragmentShader:片段着色器代码。

示例

const vertexShader = `
    varying vec2 vUv;
    void main() {
        vUv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }
`;

const fragmentShader = `
    varying vec2 vUv;
    void main() {
        gl_FragColor = vec4(vUv, 0.5, 1.0);
    }
`;

const material = new THREE.ShaderMaterial({
    vertexShader: vertexShader,
    fragmentShader: fragmentShader
});

线基础材质(LineBasicMaterial)

用于线条几何体的基本材质。

参数

color:线条颜色。

linewidth:线条宽度(注意:在某些设备上可能不支持,默认为1)。

示例

const material = new THREE.LineBasicMaterial({ color: 0xff0000 });
const geometry = new THREE.BufferGeometry().setFromPoints([
    new THREE.Vector3(-10, 0, 0),
    new THREE.Vector3(0, 10, 0),
    new THREE.Vector3(10, -10, 0)
]);
const line = new THREE.Line(geometry, material);
scene.add(line);


注意linewidth参数在某些渲染器和设备上可能不起作用,如果需要更粗的线条,可以考虑使用其他方法,如创建多边形来模拟线条。

LineDashedMaterial

用于创建虚线效果的材质。

参数

color:线条颜色。

dashSize:虚线的线段长度。

gapSize:虚线的间隔长度。

scale:缩放比例,用于调整虚线的密度。

示例

const material = new THREE.LineDashedMaterial({ 
    color: 0xff0000, 
    dashSize: 3, 
    gapSize: 1, 
    scale: 1 
});

点材质(PointsMaterial)

用于点云(点几何体)的材质。

参数

color:点的颜色。

size:点的大小。

map:点的纹理贴图(注意:在某些情况下可能不支持)。

示例

const material = new THREE.PointsMaterial({ color: 0xffffff, size: 0.05 });
const geometry = new THREE.BufferGeometry().setFromPoints([
    new THREE.Vector3(-10, 10, 0),
    new THREE.Vector3(-10, -10, 0),
    new THREE.Vector3(10, -10, 0)
]);
const points = new THREE.Points(geometry, material);
scene.add(points);


请注意,示例代码中的路径和参数可能需要根据实际情况进行调整。

精灵材质(SpriteMaterial)

SpriteMaterial是Three.js中的一种材质类型,用于创建二维精灵(Sprite)。

精灵材质常用于渲染图标、粒子系统、UI元素等。

与普通的三维材质不同,SpriteMaterial通常与Sprite对象一起使用,它不支持光照模型,也不考虑摄像机的方向,总是面向摄像机展示其纹理。

参数

map:基础颜色贴图,用于定义精灵的外观。

color:基础颜色,默认为白色(0xffffff)。

opacity:材质的全局透明度,默认为1(不透明)。

transparent:是否开启透明模式,默认为true。如果设置为true,则需要设置opacity或者使用alphaMap。

blending:混合模式,默认为THREE.NormalBlending。可以设置为THREE.AdditiveBlending、THREE.SubtractiveBlending等。

sizeAttenuation:是否启用尺寸衰减,默认为true。如果启用,则精灵的大小会根据距离摄像机的距离自动调整。

rotation:旋转角度,默认为0。用于控制精灵的旋转角度。

其他:还包括depthTest(是否进行深度测试)、depthWrite(是否写入深度缓冲区)、toneMapped(是否进行色调映射)、fog(是否应用雾效)等属性。

应用场景

SpriteMaterial适用于需要快速实现图标、粒子系统、UI元素等二维元素的场景。

// 加载纹理
const textureLoader = new THREE.TextureLoader();
const spriteTexture = textureLoader.load('path/to/sprite_texture.png');

// 创建 SpriteMaterial
const spriteMaterial = new THREE.SpriteMaterial({
    map: spriteTexture,          // 基础颜色贴图
    color: 0xffffff,             // 基础颜色(这里会与贴图混合)
    opacity: 0.5,                // 透明度
    transparent: true,           // 开启透明模式
    sizeAttenuation: false,      // 禁用尺寸衰减(精灵大小不会随距离变化)
    rotation: Math.PI / 4        // 旋转45度
});

// 创建 Sprite
const sprite = new THREE.Sprite(spriteMaterial);
sprite.scale.set(100, 100, 1);  // 设置精灵的大小(X和Y方向上的大小,Z方向通常保持为1)
sprite.position.set(0, 0, 0);   // 设置精灵的位置
scene.add(sprite);

友友们的每一次点赞,都是对我莫大的支持与激励!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

彻底学会Gradle插件版本和Gradle版本及对应关系

看完这篇&#xff0c;保你彻底学会Gradle插件版本和Gradle版本及对应关系&#xff0c;超详细超全的对应关系表 需要知道Gradle插件版本和Gradle版本的对应关系&#xff0c;其实就是需要知道Gradle插件版本对应所需的gradle最低版本&#xff0c;详细对应关系如下表格&#xff0…

预测facebook签到位置

1.11 案例2&#xff1a;预测facebook签到位置 学习目标 目标 通过Facebook位置预测案例熟练掌握第一章学习内容 1 项目描述 本次比赛的目的是预测一个人将要签到的地方。 为了本次比赛&#xff0c;Facebook创建了一个虚拟世界&#xff0c;其中包括10公里*10公里共100平方公里的…

【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题

Linux to go制作流程 0.写在前面 关于教程Why Linux to go&#xff1f;实际效果 1.准备工具2.制作步骤 下载系统镜像硬盘分区准备启动U盘安装系统重启完成驱动安装将系统启动引导程序迁移到移动硬盘上 3.可能出现的问题 3.1.U盘引导系统安装时出现崩溃3.2.不影响硬盘里本身已有…

在 macOS 上,你可以使用系统自带的 终端(Terminal) 工具,通过 SSH 协议远程连接服务器

文章目录 1. 打开终端2. 使用 SSH 命令连接服务器3. 输入密码4. 连接成功5. 使用密钥登录&#xff08;可选&#xff09;6. 退出 SSH 连接7. 其他常用 SSH 选项8. 常见问题排查问题 1&#xff1a;连接超时问题 2&#xff1a;权限被拒绝&#xff08;Permission denied&#xff09…

Linux CentOS 7系统如何修改panel 重新打开最小化的界面/软件/程序

CentOS 7系统下&#xff0c;部分用户可能一开始打开界面没有类似Windows的下方菜单栏&#xff0c;只有一个浮动的panel。一旦打开软件&#xff0c;然后点击最小化后&#xff0c;找不到重新打开的方法。 右键panel&#xff0c;点击Add New Items… 选择以下三个基本就可以了&am…

打造三甲医院人工智能矩阵新引擎(二):医学影像大模型篇--“火眼金睛”TransUNet

一、引言 1.1 研究背景与意义 在现代医疗领域,医学影像作为疾病诊断与治疗的关键依据,发挥着不可替代的作用。从传统的X射线、CT(计算机断层扫描)到MRI(磁共振成像)等先进技术,医学影像能够直观呈现人体内部结构,为医生提供丰富的诊断信息,涵盖疾病识别、病灶定位、…

基于Arduino的FPV头部追踪相机系统

构建FPV头部追踪相机&#xff1a;让你置身于遥控车辆之中&#xff01; 在遥控车辆和模型飞行器的世界中&#xff0c;第一人称视角&#xff08;FPV&#xff09;体验一直是爱好者们追求的目标。通过FPV头部追踪相机&#xff0c;你可以像坐在车辆或飞行器内部一样&#xff0c;自由…

使用 Three.js 创建动态粒子效果

今天&#xff0c;带大家使用粒子实现一个粒子飞毯的效果&#xff0c;我们先来看一下效果。 实现 初始化场景 首先创建一个场景&#xff0c;所有 3D 对象都会被添加到这个场景中。 const scene new THREE.Scene();相机和渲染器 配置相机和渲染器来捕捉和显示场景。 相机…

Linux双端口服务器:端口1的文件系统目录挂载到端口2

目录 一、服务器安装NFS服务并配置二、文件挂载三、持久化挂载总结为什么服务器配置多个端口 目前有一台服务器&#xff0c;不过他设置了两个SSH的端口&#xff0c;通过下面方法可以让这两个端口连接的主机能够共享同一个文件系统&#xff0c;原本这两个端口的文件系统是隔离的…

机器学习算法---贝叶斯学习

1.了解相关概念 先验概率&#xff1a;有数据集d,以及假设h,此时h是不确定的。在还没有训练数据之前h的初始概率记为P(h),类似地我们把P(d)表示训练数据d在任何假设都未知或不确定时的概率。P(d|h)表示已知假设h成立时d的概率。 后验概率&#xff1a;就是在数据d上经过学习之后…

[paddle] 非线性拟合问题的训练

利用paddlepaddle建立神经网络&#xff0c;模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ⁡ ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x)​ 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…

GWAS数据和软件下载

这部分主要是数据获取,以及软件配置方法。 一、配套数据和代码 数据和代码目前在不断的更新,最新的教程可以私信,我通过后手动发送最新版的pdf和数据代码。发送的压缩包,有电子版的pdf和数据下载链接,里面是最新的百度网盘的地址,下载到本地即可。然后根据pdf教程,结合配套的…

win32汇编环境,在对话框中画五边形与六边形

;运行效果 ;win32汇编环境,在对话框中画五边形与六边形 ;展示五边形与六边形的画法 ;将代码复制进radasm软件里,直接编译可运行.重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>>>>&g…

springcloud 介绍

Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合&#xff0c;它提供了一套完整的工具集&#xff0c;用于快速构建分布式系统。在Spring Cloud的架构中&#xff0c;服务被拆分为一系列小型、自治的微服务&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过…

如何进行千万级别数据跑批优化

目录 背景问题分析解决方案 数据库问题分片广播分批获取事务控制充分利用服务器资源MQ消费任务并行动态调整并发度失败任务如何继续下游接口时间线程安全异常 & 监控 总结 背景 定义&#xff1a;跑批是指在特定日期对大量数据进行定时处理的过程。在金融领域&#xff0c;…

电脑提示wlanapi.dll丢失怎么办?wlanapi.dll丢失的多种解决方法

电脑提示wlanapi.dll丢失&#xff1f;别担心&#xff0c;这里有多种解决方法&#xff01; 作为软件开发领域的从业者&#xff0c;我深知电脑在运行过程中可能会遇到的各种问题&#xff0c;其中“wlanapi.dll丢失”这一报错信息就常常让用户感到困惑和不安。今天&#xff0c;我…

刷服务器固件

猫眼淘票票 大麦 一 H3C通用IP 注:算力服务器不需要存储 二 刷服务器固件 1 登录固定IP地址 2 升级BMC版本 注 虽然IP不一致但是步骤是一致的 3 此时服务器会出现断网现象&#xff0c;若不断网等上三分钟ping一下 4 重新登录 5 断电拔电源线重新登录查看是否登录成功

深入Android架构(从线程到AIDL)_13 线程安全的化解之例

目录 7、 线程安全的化解之例 复习&#xff1a;Android单线程环境 非单线程环境的线程安全议题 范例-1 范例-2​编辑 同步(Synchronization)化解线程安全的问题 7、 线程安全的化解之例 复习&#xff1a;Android单线程环境 View是一个单线程的类&#xff1b;其意味着&…

每日AIGC最新进展(80): 重庆大学提出多角色视频生成方法、Adobe提出大视角变化下的人类视频生成、字节跳动提出快速虚拟头像生成方法

Diffusion Models专栏文章汇总:入门与实战 Follow-Your-MultiPose: Tuning-Free Multi-Character Text-to-Video Generation via Pose Guidance 在多角色视频生成的研究中,如何实现文本可编辑和姿态可控的角色生成一直是一个具有挑战性的课题。现有的方法往往只关注单一对象的…

【多线程初阶篇¹】线程理解| 线程和进程的区别

目录 一、认识线程Thread 1.为啥引入线程 2.线程理解 &#x1f525; 3.面试题&#xff1a;线程和进程的区别 一、认识线程Thread 1.为啥引入线程 为了解决进程太重量的问题 解释&#xff08;为什么说线程比进程更轻量&#xff1f;/为什么说线程创建/销毁开销比进程小&#…