当前位置: 首页 > article >正文

Three.js 入门(几何体不同顶点组、设置不同材质、常见几何体)

本篇主要学习内容 :

  1. 几何体顶点、索引、面和geometry的顶点概念
  2. 几何体划分定点组设置不同材质
  3. 常见的几何体

点赞 + 关注 + 收藏 = 学会了

1.几何体顶点、索引、面

1.1)缓冲类型几何体BufferGeometry顶点和面的关系

threejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BufferGeometry (opens new window)类构建的,BufferGeometry是一个没有任何形状的空几何体,你可以通过BufferGeometry自定义任何几何形状,具体一点说就是定义顶点数据

//创建一个空的几何体对象
const geometry = new THREE.BufferGeometry(); 
//创建顶点数据// 定点有顺序,逆时针为正面
const vertices = new Float32Array([
   -1.0, -1.0,  0.0,
    1.0, -1.0,  0.0, 
    1.0,  1.0,  0.0, 
    1.0,  1.0,  0.0,
   -1.0,  1.0,  0.0, 
   -1.0, -1.0,  0.0,
   ])
// 设置几何体顶点                                         创建顶点属性
geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))
1.2)缓冲类型几何体BufferGeometry索引和面的关系
//创建一个空的几何体对象
const geometry = new THREE.BufferGeometry(); 
// 使用索引绘制
const vertices = new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0])
// 创建顶点属性
geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))
// 创建索引
const indices = new Uint16Array([0, 1, 2, 2, 3, 0])
// 创建索引属性
geometry.setIndex(new THREE.BufferAttribute(indices, 1))

2.几何体划分定点组设置不同材质

2.1)创建几何体区分多个材质
// 创建几何体
const geometry1 = new THREE.BoxGeometry(1, 1, 1)
// 多个材质
const material4 = new THREE.MeshBasicMaterial({
    color: 'aqua',
})
const material5 = new THREE.MeshBasicMaterial({
    color: 'pink',
})
const material6 = new THREE.MeshBasicMaterial({
    color: 'green',
})
const material7 = new THREE.MeshBasicMaterial({
    color: 'yellow',
})
const material8 = new THREE.MeshBasicMaterial({
    color: 'blue',
})
const material9 = new THREE.MeshBasicMaterial({
    color: 'red',
})
let cube = new THREE.Mesh(geometry1, [
    material4,
    material5,
    material6,
    material7,
    material8,
    material9,
])
cube.position.x = 2
scene.add(cube)
2.1)设置多个定点组
// 创建几何体三角形
const geometry = new THREE.BufferGeometry()
// 使用索引绘制
const vertices = new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0])
// 创建顶点属性
geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))
// 创建索引
const indices = new Uint16Array([0, 1, 2, 2, 3, 0])
// 创建索引属性
geometry.setIndex(new THREE.BufferAttribute(indices, 1))


// 设置两个定点组,形成两个材质 多个材质对应索引
geometry.addGroup(0, 3, 0)
geometry.addGroup(3, 3, 1)

// 创建材质
const material = new THREE.MeshBasicMaterial({
    color: 0x00ff00,
    //两面都看到得到
    // side: THREE.DoubleSide
    // 线框
    wireframe: true,
})
// 多个材质
const material1 = new THREE.MeshBasicMaterial({
    color: 0xff0000,
    // 线框
    // wireframe: true,
})
// 创建网络    多个材质对应索引
const plane = new THREE.Mesh(geometry, [material, material1])

scene.add(plane)

3.1. 常见的几何体

three.js提供的矩形平面PlaneGeometry、长方体BoxGeometry、球体SphereGeometry等各种形状的几何体,他们都有一个共同的父类BufferGeometry。这意味着这些几何体有哪些属性或方法,你可以查询文档关于BufferGeometry的介绍。

请添加图片描述

几何体细分数

Three.js很多几何体都提供了细分数相关的参数,这里以矩形平面几何体PlaneGeometry为例介绍。

矩形平面几何体至少需要两个三角形拼接而成。

 //矩形几何体PlaneGeometry的参数3,4表示细分数,默认是1,1
const geometry = new THREE.PlaneGeometry(100,50,1,1);

把一个矩形分为2份,每个矩形2个三角形,总共就是4个三角形

const geometry = new THREE.PlaneGeometry(100,50,2,1);

把一个矩形分为4份,每个矩形2个三角形,总共就是8个三角形

const geometry = new THREE.PlaneGeometry(100,50,2,2);

球体SphereGeometry细分数

球体SphereGeometry参数2、3分别代表宽、高度两个方向上的细分数,默认32,16,具体多少以你所用版本为准。

const geometry = new THREE.SphereGeometry( 50, 32, 16 );

如果球体细分数比较低,表面就不会那么光滑。

const geometry = new THREE.SphereGeometry( 15, 8, 8 );

三角形数量与性能

对于一个曲面而言,细分数越大,表面越光滑,但是三角形和顶点数量却越多。

几何体三角形数量或者说顶点数量直接影响Three.js的渲染性能,在不影响渲染效果的情况下,一般尽量越少越好。

感谢:b站up主:老陈打码 以及 threejs中文网 教学及参考文档
到此基础入门(四)学习告一段落,道阻且长,行则将至。与诸君共勉。 ⭐️


http://www.kler.cn/a/565367.html

相关文章:

  • CDN与群联云防护的技术差异在哪?
  • Java内存的堆(堆内、堆外)、栈含义理解笔记
  • 端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port
  • 机器学习(模型的保存和加载)
  • 【版本控制安全简报】Perforce Helix Core安全更新:漏洞修复与国内用户支持
  • nginx 动态计算拦截非法访问ip
  • 【Linux】ubuntu server扩容硬盘
  • 树莓百度百科更新!宜宾园区业务再添新篇
  • 【Python爬虫(96)】从0到1:打造爬虫驱动的数据分析平台
  • 联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘
  • 以太坊测试网
  • YOLOv8+QT搭建目标检测项目
  • ruoyi vue el-elementui el-tree 自适应宽度向左浮动
  • 从扫描到建模:盎锐UCL360PRO如何实现隧道的数字化重建运维
  • MinIO整合SpringBoot实现文件上传、下载
  • 服务器广播需要广播的服务器数量
  • DOM 事件 HTML 标签属性速查手册
  • 【无监督学习】主成分分析步骤及matlab实现
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 4
  • 神经网络 - 激活函数(ReLU 函数)