Three.js入门-常见几何体

news/2025/2/13 5:03:54/文章来源:https://www.cnblogs.com/zsboy/p/18579087

这章节,我们将介绍 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); // 将立方体添加到场景中

file

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); // 将球体添加到场景中

file

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); // 将圆柱体添加到场景中

file

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); // 将平面添加到场景中

file

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); // 将圆环体添加到场景中

file

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); // 将圆锥添加到场景中

file

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

函数

THREE.BufferGeometry();

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

- `position`:顶点的位置数据。
- `normal`:法线数据。
- `uv`:纹理坐标数据。
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([0,0,0, // 顶点11,0,0, // 顶点20,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); // 添加到场景

file

8. 总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初三小孩NOEP吃饭记

推一波我的blog 正经版我是初三的小孩 哇我来参加NOEP(National Olympiad in Eating in Provinces)啦 体验组是在福州第三饭堂 哇哇哇 我要表扬一下举办方:时间正好是8:30-13:00,早饭和午饭可以一起吃 杜子德叔叔真好 要进考场啦 为什么别人都只带了一两块面包 这怎么吃得饱的…

【CameraPoseRefinement】以BARF为例介绍三维重建中的位姿优化

Introduction在计算机视觉三维重建中,求解3D场景的表示和定位给定的相机帧的相机位姿是两个非常重要的任务,这两个问题互为依赖,一方面,恢复3D场景的表示需要使用已知的相机位姿进行观察;另一方面,定位相机需要来自特征点的可靠对应。 错误的相机位姿会对重建的输出和性能…

【Proteus 8.17软件下载与安装教程】

Proteus 8.17是一款集电路仿真、PCB设计和虚拟模型仿真于一体的电子设计自动化(EDA)软件工具‌。它广泛应用于电子设计、嵌入式系统开发等领域,是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台‌12。 主要功能 Proteus 8.17的主要功能包括:‌电…

ABC382

上午 NOIP 太憋屈了,我要切水恢复一下信心( 希望 cy 别看见A - Daily Cookie 在题目限制中,已经确定 \(S\) 中 @ 字符的个数多于 \(D\)。所以我们直接数 . 的个数加上 \(D\) 就可以。 时间复杂度 \(O(n)\)。点击查看代码 #include <iostream> #include <cstdio>…

kali 安装 shodan

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!网络安全工具:通过百度网盘…

攻防世界misc部分

信女愿要一台永远不会报错的电脑[攻防世界]1-misc 解题根据提示“生日”,猜测8位数暴力破解,大概试一下20000000开始,不然一个小时太久了得到口令20001228又是压缩包,注意CRC,与上图2.zip中相同,猜测明文破解 [攻防世界]BotW- 题目 MASTER USING IT AND YOU CAN HAVE THI…

Shell编程 - 函数篇

自建函数库 - 颜色字符串颜色 字符串输出颜色,有时候关键地方需要醒目,颜色是最好的方式:字体颜色 字体背景颜色 显示方式30:黑 40:黑 0:终端默认设置31:红 41:深红 1:高亮显示32:绿 42:绿 4:下划线33:黄 43:黄色 5:闪烁34:蓝色 44:蓝色 7:反白显示35:紫色 …

[NCTF2019]Fake XML cookbook

题目链接:[NCTF2019]Fake XML cookbook。 打开题目后,环境如下。随便发送一个登陆包后,查看请求包与响应包。尝试 XXE。 POST /doLogin.php HTTP/1.1 Host: f2f80df1-2df7-4b45-a1da-b06e22a5b17a.node5.buuoj.cn:81 Content-Length: 155 Accept: application/xml, text/xml…

9.2

import pandas as pd import scipy.stats as stats data = pd.read_excel(9.2.xlsx) data_values = data.values.flatten().tolist() statistic, p_value = stats.shapiro(data_values) print("Shapiro-Wilk 统计量:", statistic) print("p 值:", p_valu…

Java日志手机号脱敏工具类

背景 在开发过程中,很容易将用户敏感信息,例如手机号码、身份证等,打印在日志平台。为了保护用户数据,又不影响日志的打印,需要将日志中的敏感信息进行脱敏。效果没看明白,强烈建议 pull项目,执行一下项目中SensitiveUtils#main方法。特性支持多层级Json/对象字段脱敏 支…

SSM项目出现的依赖问题

在ssm项目中,整合后,依赖出现问题导致出现了一堆bug 例如:Controller扫描不到、TomCat启动时报错Listener一个或多个启动失败、spring配置文件找不到、TomCat启动时提示启动XXX功能失败 诸如此类一堆问题。。。。 找了很久发现是依赖的问题,项目使用的依赖过多,把之前项目…

高级语言程序设计第九次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C/ 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13311 学号:092300125 姓名:张天荣 14.17 3. struct Month {char name[12];char nmee2[4];int day;int id; };#include <stdi…