这章节,我们将介绍 Three.js 中常见的几何体(Geometry),包括立方体、球体、圆柱体、平面、圆环、圆锥体等。几何体是构建 3D 模型的基础元素,通过不同的几何体可以创建出各种形状的物体。

在 Three.js 中,几何体是由顶点、面、法线等数据组成的,通过材质(Material)的渲染,可以将几何体显示在屏幕上。不同的几何体有不同的属性和用途,可以根据需求选择合适的几何体来构建 3D 场景。

1. BoxGeometry(立方体几何体)

函数

THREE.BoxGeometry(
width,
height,
depth,
widthSegments,
heightSegments,
depthSegments
);

参数

  • width:立方体的宽度(默认为 1)。
  • height:立方体的高度(默认为 1)。
  • depth:立方体的深度(默认为 1)。
  • widthSegments:水平分段数(默认为 1)。
  • heightSegments:垂直分段数(默认为 1)。
  • depthSegments:深度分段数(默认为 1)。
const geometry = new THREE.BoxGeometry(5, 5, 5); // 创建一个宽为5、高为5、深为5的立方体
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 }); // 创建支持灯光的绿色材质
const cube = new THREE.Mesh(geometry, material); // 将几何体和材质组合成网格物体
scene.add(cube); // 将立方体添加到场景中

2. SphereGeometry(球体几何体)

  • 函数
THREE.SphereGeometry(
radius,
widthSegments,
heightSegments,
phiStart,
phiLength,
thetaStart,
thetaLength
);
  • 参数

    • radius:球体的半径(默认值为 1)。
    • widthSegments:球体的经度分段数,越大越平滑(默认值为 8)。
    • heightSegments:球体的纬度分段数,越大越平滑(默认值为 6)。
    • phiStart:开始的经度角度(默认为 0)。
    • phiLength:经度的弧长(默认为 Math.PI * 2)。
    • thetaStart:开始的纬度角度(默认为 0)。
    • thetaLength:纬度的弧长(默认为 Math.PI)。
const geometry = new THREE.SphereGeometry(5, 32, 32); // 创建半径为5的球体,32段纬度和经度
const material = new THREE.MeshStandardMaterial({ color: 0x0000ff }); // 创建蓝色材质
const sphere = new THREE.Mesh(geometry, material); // 创建球体物体
scene.add(sphere); // 将球体添加到场景中

3. CylinderGeometry(圆柱体几何体)

函数

THREE.CylinderGeometry(
radiusTop,
radiusBottom,
height,
radialSegments,
heightSegments,
openEnded,
thetaStart,
thetaLength
);

参数

  • radiusTop:圆柱顶部的半径(默认值为 1)。
  • radiusBottom:圆柱底部的半径(默认值为 1)。
  • height:圆柱的高度(默认值为 1)。
  • radialSegments:圆柱的圆周分段数(默认值为 8)。
  • heightSegments:圆柱的垂直分段数(默认值为 1)。
  • openEnded:是否是开口的圆柱(默认为 false)。
  • thetaStart:开始的角度(默认为 0)。
  • thetaLength:角度的弧长(默认为 Math.PI * 2)。
const geometry = new THREE.CylinderGeometry(3, 3, 10, 32); // 创建半径为3,高度为10的圆柱体
const material = new THREE.MeshStandardMaterial({ color: 0xff0000 }); // 创建红色材质
const cylinder = new THREE.Mesh(geometry, material); // 创建圆柱体物体
scene.add(cylinder); // 将圆柱体添加到场景中

4. PlaneGeometry(平面几何体)

函数

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

参数

  • width:平面的宽度(默认值为 1)。
  • height:平面的高度(默认值为 1)。
  • widthSegments:平面的水平分段数(默认值为 1)。
  • heightSegments:平面的垂直分段数(默认值为 1)。
  • side:平面材质的显示面,THREE.FrontSide(正面),THREE.BackSide(背面),THREE.DoubleSide(两面)。
const geometry = new THREE.PlaneGeometry(10, 10); // 创建宽为10,高为10的平面
const material = new THREE.MeshStandardMaterial({
color: 0x00ffff,
side: THREE.DoubleSide,
}); // 创建青色材质,双面渲染
const plane = new THREE.Mesh(geometry, material); // 创建平面物体
scene.add(plane); // 将平面添加到场景中

5. TorusGeometry(圆环几何体)

函数

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

参数

  • radius:圆环的主半径(默认值为 1)。
  • tube:圆环的管道半径(默认值为 0.4)。
  • radialSegments:圆环的径向分段数(默认值为 8)。
  • tubularSegments:管道的圆周分段数(默认值为 6)。
  • arc:圆环的弧度范围(默认为 Math.PI * 2)。
const geometry = new THREE.TorusGeometry(5, 1, 16, 100); // 创建半径为5,管道半径为1的圆环
const material = new THREE.MeshStandardMaterial({ color: 0xffff00 }); // 创建黄色材质
const torus = new THREE.Mesh(geometry, material); // 创建圆环体
scene.add(torus); // 将圆环体添加到场景中

6. ConeGeometry(圆锥体几何体)

函数

THREE.ConeGeometry(
radius,
height,
radialSegments,
heightSegments,
openEnded,
thetaStart,
thetaLength
);

参数

- `radius`:圆锥底部的半径(默认值为 1)。
- `height`:圆锥的高度(默认值为 1)。
- `radialSegments`:圆锥底部的分段数(默认值为 8)。
- `openEnded`:是否是开口的圆锥(默认为 `false`)。
- `thetaStart`:圆锥开始的角度(默认为 0)。
- `thetaLength`:圆锥的角度弧长(默认为 Math.PI * 2)。
const geometry = new THREE.ConeGeometry(5, 10, 32); // 创建半径为5,高度为10的圆锥
const material = new THREE.MeshStandardMaterial({ color: 0xff00ff }); // 创建紫色材质
const cone = new THREE.Mesh(geometry, material); // 创建圆锥物体
scene.add(cone); // 将圆锥添加到场景中

7. Custom Geometry(自定义几何体)

函数

THREE.BufferGeometry();

参数THREE.BufferGeometry 是一个高级构造器,允许你手动指定顶点数据和其他几何信息。常见的自定义属性包括:

- `position`:顶点的位置数据。
- `normal`:法线数据。
- `uv`:纹理坐标数据。
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([
0,
0,
0, // 顶点1
1,
0,
0, // 顶点2
0,
1,
0, // 顶点3
]);
geometry.setAttribute("position", new THREE.BufferAttribute(vertices, 3)); // 设置顶点数据
const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 }); // 创建材质
const mesh = new THREE.Mesh(geometry, material); // 创建网格物体
scene.add(mesh); // 添加到场景

8. 总结

  • 在 Three.js 中,几何体是构建 3D 模型的基础元素。通过组合不同的几何体,可以构建出更复杂的物体。对不同几何体的熟悉和应用,可以帮助我们快速构建 3D 场景。
  • 除了标准几何体外,BufferGeometry 提供了更强的定制能力,可以满足更复杂的需求。
  • 通过调整不同几何体的细节(如分段数、参数等),可以在性能和渲染效果之间找到平衡。

Three.js学习:https://www.threejs3d.com/

Three.js入门-常见几何体的更多相关文章

  1. 1. web前端开发分享-css,js入门篇

    关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...

  2. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  3. web前端开发分享-css,js入门篇(转)

    转自:http://www.cnblogs.com/jikey/p/3600308.html 关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人 ...

  4. web前端开发分享-css,js入门篇

    学习没有捷径,但学习是有技巧与方法.   一,css入门篇:   推荐书籍:css哪些事儿,精通css. 理由:css那些事儿,他是一本介绍css基础类的书,是入门的经典读物. 系统的介绍了css的选 ...

  5. 极简 Node.js 入门 - 1.2 模块系统

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  6. 极简 Node.js 入门 - 4.3 可读流

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  7. 极简 Node.js 入门 - 4.4 可写流

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  8. 极简 Node.js 入门 - 4.5 双工流

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  9. Ember.js入门教程、博文汇总

    第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properti ...

  10. JS入门之ActiveXObject对象(转载)

    JS入门之ActiveXObject对象   此对象提供自动化对象的接口.   function ActiveXObject(ProgID : String [, location : String] ...

随机推荐

  1. [Tkey] 生日礼物

    题意简述 彩珠有 \(n\) 个 \(k\) 种,每个珠子都有一个坐标 \(p_{i}\),求最小的区间长度,使得这个区间包含全部的 \(k\) 种彩珠. 分析 发现我们可以维护每一种颜色的最近出现坐 ...

  2. 智和信通搭建高可靠、真稳定IT运维平台,助力能源行业高效生产

    在能源企业信息化高度发展的背景下,北京智和信通有限公司推出全栈式运维管控平台--"智和网管平台",助力能源企业搭建高可靠.真稳定的IT运维平台,实现高效稳定生产. 信息化飞速发展, ...

  3. gadget驱动框架(二)

    usb_composite_driver的创建于注册 源码:drivers/usb/legacy/serial.c //创建usb_composite_driver static struct usb ...

  4. 解决Spring Data JPA Hibernate的N+1查询问题的性能优化最佳方法

    最佳方法:定制@NamedEntityGraph.定制查询和定制VO,可以做到按照需要最佳查询,需要注意的地方:定制VO的字段一定要等于或小于实际查询的字段,才不会复制的时候触发N+1查询. 1 问题 ...

  5. 数据库日常实操优质文章分享(含Oracle、MySQL等) | 2023年2月刊

    本文为大家整理了墨天轮数据社区2023年2月发布的优质技术文章,主题涵盖Oracle.MySQL.PostgreSQL等数据库的环境搭建.故障处理等日常实践操作,以及概念梳理.常用脚本等总结记录,分享 ...

  6. HRM平台 - 组织结构的渲染

    组织结构是一个公司的灵魂 ,多使用树型结构 : 页面格式: 渲染头部 : 头部代码: <template> <el-row type="flex" justify ...

  7. 谈一谈 vuex 的运行机制

    Vuex提供数据(state)来驱动视图(vue components),通过dispath派发actions,在其中可以做一些异步的操作,然后通过commit来提交mutations,最后mutat ...

  8. 1001 Attention 和 Self-Attention 的区别(还不能区分我就真的无能为力了)

    通过 pytorch 去构建一个 transformer 的框架 不是导包,不是调包侠 注意力机制是一个很宽泛(宏大)的一个概念,QKV 相乘就是注意力,但是他没有规定 QKV是怎么来的 通过一个查询 ...

  9. Required request parameter ‘xxx‘ for method parameter type xxxx is not present 解决方式

    我在controller层传实体参数时加了@RequestParam,结果报Required request parameter 'pointlist' for method parameter ty ...

  10. Taylor series Explicit Euler Implicit Euler

    1 Taylor series \[\begin{gathered}\sum_{n=0}^{\infty}\frac{f^{(n)}\left(a\right)}{n!}\left(x-a\right ...