前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Threejs入门之七:Threejs中的几何体

Threejs入门之七:Threejs中的几何体

作者头像
九仞山
修改2023-05-19 09:29:05
1.3K0
修改2023-05-19 09:29:05
举报
文章被收录于专栏:前端漫步前端漫步

前面的代码中我们一直使用立体缓冲几何体BoxGeometry来构造物体,这样构造出来的是一个长方体或正方体,Threejs提供了很多几何体的API,如圆形缓冲几何体、圆锥缓冲几何体、圆柱缓冲几何体等,下面一一进行介绍 1.立方缓冲几何体(BoxGeometry),立方缓冲几何体我们前面已经使用过了,它是四边形的原始几何类,它通常使用构造函数所提供的“width”、“height”、“depth”参数来创建立方体或者不规则四边形。 BoxGeometry可以接收6个参数,具体如下 BoxGeometry(width : Float, height : Float, depth : Float, widthSegments : Integer, heightSegments : Integer, depthSegments : Integer) width — X轴上面的宽度,默认值为1。 height — Y轴上面的高度,默认值为1。 depth — Z轴上面的深度,默认值为1。 widthSegments — (可选)宽度的分段数,默认值是1。 heightSegments — (可选)高度的分段数,默认值是1。 depthSegments — (可选)深度的分段数,默认值是1。 添加立方缓冲几何体到场景中,前面也使用过,使用下面的代码可以将立方缓冲几何体添加到场景中

代码语言:javascript
复制
// 创建一个几何体,相当于在画布上想要呈现的物体
const geometry = new THREE.BoxGeometry(100,100,100) 

const material = new THREE.MeshLambertMaterial({
  color:0x0000ff
})  
const mesh = new THREE.Mesh(geometry,material)
 scene.add(mesh)  
在这里插入图片描述
在这里插入图片描述

注意这里的分段数代表这个几何体可以分为几段,如果 widthSegments 设置为2,则代表这个几何体在宽度方向上分为两段,可能这个分段数不好理解,我们可以借助MeshLambertMaterial中的一个属性wireframe进行理解,wireframe属性是一个布尔值,开启wireframe属性可将几何体渲染为线框。默认值为false(即渲染为平面多边形)。我们在材质中添加wireframe属性为true,可以看到三维图形变成了线框组成的立体图形

代码语言:javascript
复制
const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,//设置颜色 
  wireframe:true,//线条模式渲染mesh对应的三角形数据
})
在这里插入图片描述
在这里插入图片描述

观察图形发现,这个立方体的每一个面都是有两个三角形组成的,如果我们把widthSegments 的值设置为2,

代码语言:javascript
复制
const geometry = new THREE.BoxGeometry(100,100,100,2) 

我们发现,在宽度方向上,立方体从宽度的中间被一分为二了,这就是分段数的意思。如果设置为3,则在宽度方向上被一分为三

在这里插入图片描述
在这里插入图片描述

2.圆形缓冲几何体(CircleGeometry):CircleGeometry由围绕着一个中心点的三角分段的数量所构造,由给定的半径来延展。 同时它也可以用于创建规则多边形,其分段数量取决于该规则多边形的边数。 CircleGeometry接收四个参数,各参数定义如下 radius — 圆形的半径,默认值为1 segments — 分段(三角面)的数量,最小值为3,默认值为8。 thetaStart — 第一个分段的起始角度,默认为0。(three o’clock position) thetaLength — 圆形扇区的中心角,通常被称为“θ”(西塔)。默认值是2*Pi,这使其成为一个完整的圆。 在场景中创建一个圆形缓冲几何体,添加如下代码

代码语言:javascript
复制
const geometry = new THREE.CircleGeometry( 100, 32 ); 
const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,//设置颜色 
  wireframe:true, 
}) 
const mesh = new THREE.Mesh(geometry,material)
在这里插入图片描述
在这里插入图片描述

3.圆锥缓冲几何体(ConeGeometry):ConeGeometry是用于生成圆锥几何体的类,它本身接收7个参数,各参数如下 ConeGeometry(radius : Float, height : Float, radialSegments : Integer, heightSegments : Integer, openEnded : Boolean, thetaStart : Float, thetaLength : Float) radius — 圆锥底部的半径,默认值为1。 height — 圆锥的高度,默认值为1。 radialSegments — 圆锥侧面周围的分段数,默认为8。 heightSegments — 圆锥侧面沿着其高度的分段数,默认值为1。 openEnded — 一个Boolean值,指明该圆锥的底面是开放的还是封顶的。默认值为false,即其底面默认是封顶的。 thetaStart — 第一个分段的起始角度,默认为0。(three o’clock position) thetaLength — 圆锥底面圆扇区的中心角,通常被称为“θ”(西塔)。默认值是2*Pi,这使其成为一个完整的圆锥。 在场景中添加一个圆锥缓冲几何体

代码语言:javascript
复制
// 创建圆锥缓冲几何体
const geometry = new THREE.ConeGeometry( 100, 400, 32 );
const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,//设置颜色 
  // wireframe:true,//线条模式渲染mesh对应的三角形数据
})
const mesh = new THREE.Mesh(geometry,material)

运行浏览器, 效果如下

在这里插入图片描述
在这里插入图片描述

4.圆柱缓冲几何体(CylinderGeometry):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 — 圆柱侧面周围的分段数,默认为8。 heightSegments — 圆柱侧面沿着其高度的分段数,默认值为1。 openEnded — 一个Boolean值,指明该圆锥的底面是开放的还是封顶的。默认值为false,即其底面默认是封顶的。 thetaStart — 第一个分段的起始角度,默认为0。(three o’clock position) thetaLength — 圆柱底面圆扇区的中心角,通常被称为“θ”(西塔)。默认值是2*Pi,这使其成为一个完整的圆柱。 在场景中添加如下代码来添加一个圆柱

代码语言:javascript
复制
const geometry = new THREE.CylinderGeometry( 80, 80, 200, 32 );
const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,//设置颜色  
})
const mesh = new THREE.Mesh(geometry,material)
在这里插入图片描述
在这里插入图片描述

5.边缘几何体(EdgesGeometry):边缘几何体可以作为一个辅助对象来查看geometry的边缘。 边缘几何体需要配合线段LineSegments来使用,LineSegments在若干对的顶点之间绘制的一系列的线。LineSegments构造函数如下 LineSegments( geometry : BufferGeometry, material : Material ) geometry —— 表示每条线段的两个顶点。 material —— 线的材质,默认值是LineBasicMaterial。 在场景中添加边缘几何体

代码语言:javascript
复制
const geometry = new THREE.CylinderGeometry( 80, 80, 200, 32 );
const edges = new THREE.EdgesGeometry( geometry );
const line = new THREE.LineSegments( edges, new THREE.LineBasicMaterial( { color: 0xffffff } ) );
const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,//设置颜色  
})
const mesh = new THREE.Mesh(geometry,material)
scene.add(line)

刷新浏览器查看效果

在这里插入图片描述
在这里插入图片描述

6.平面缓冲几何体(PlaneGeometry):PlaneGeometry是用于生成平面几何体的类,其构造函数如下 PlaneGeometry(width : Float, height : Float, widthSegments : Integer, heightSegments : Integer) width — 平面沿着X轴的宽度。默认值是1。 height — 平面沿着Y轴的高度。默认值是1。 widthSegments — (可选)平面的宽度分段数,默认值是1。 heightSegments — (可选)平面的高度分段数,默认值是1。 在场景中添加如下代码查看效果

代码语言:javascript
复制
const geometry = new THREE.PlaneGeometry( 100, 100 );
const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,//设置颜色  
})
const mesh = new THREE.Mesh(geometry,material)
在这里插入图片描述
在这里插入图片描述

7.球缓冲几何体(SphereGeometry):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。 该几何体是通过扫描并计算围绕着Y轴(水平扫描)和X轴(垂直扫描)的顶点来创建的。 因此,不完整的球体(类似球形切片)可以通过为phiStart,phiLength,thetaStart和thetaLength设置不同的值来创建, 以定义我们开始(或结束)计算这些顶点的起点(或终点)。 在场景中添加球体

代码语言:javascript
复制
// 球体
const geometry = new THREE.SphereGeometry( 150, 32, 16 );
const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,//设置颜色  
  wireframe:true,
})
const mesh = new THREE.Mesh(geometry,material)
在这里插入图片描述
在这里插入图片描述

8.圆环缓冲几何体(TorusGeometry):TorusGeometry是用于生成圆环几何体的类。其构造函数如下 TorusGeometry(radius : Float, tube : Float, radialSegments : Integer, tubularSegments : Integer, arc : Float) radius - 环面的半径,从环面的中心到管道横截面的中心。默认值是1。 tube — 管道的半径,默认值为0.4。 radialSegments — 管道横截面的分段数,默认值为8。 tubularSegments — 管道的分段数,默认值为6。 arc — 圆环的圆心角(单位是弧度),默认值为Math.PI * 2。 在场景中添加圆环

代码语言:javascript
复制
// 圆环
const geometry = new THREE.TorusGeometry( 100, 30, 16, 100 );
const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,//设置颜色  
  wireframe:true,
})
const mesh = new THREE.Mesh(geometry,material)
在这里插入图片描述
在这里插入图片描述

总结:Threejs中提供了很多几何体的API,这里由于篇幅的原因,就不一一赘述了,具体可以查看Threejs的官方文档。 最后附上核心js代码如下

代码语言:javascript
复制
import * as THREE from 'three'
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from 'three/addons/controls/OrbitControls.js' 
// 创建一个三维场景 
const scene = new THREE.Scene() 
// 创建一个几何体 
// const geometry = new THREE.BoxGeometry(100,100,100,2) 
// 创建圆形缓冲几何体
// const geometry = new THREE.CircleGeometry( 100, 32 );  
// 创建圆锥缓冲几何体
// const geometry = new THREE.ConeGeometry( 100, 400, 32 );
//圆柱
// const geometry = new THREE.CylinderGeometry( 80, 80, 200, 32 );
//边缘几何体
// const edges = new THREE.EdgesGeometry( geometry );
// const line = new THREE.LineSegments( edges, new THREE.LineBasicMaterial( { color: 0xffffff } ) );
// const geometry = new THREE.PlaneGeometry( 100, 100 );
// 球体
// const geometry = new THREE.SphereGeometry( 150, 32, 16 );
// 圆环
const geometry = new THREE.TorusGeometry( 100, 30, 16, 100 );
const material = new THREE.MeshLambertMaterial({
  color:0x00ffff,//设置颜色  
  wireframe:true,
})
const mesh = new THREE.Mesh(geometry,material) 
// 设置物体在场景中的位置
mesh.position.set(0,10,0)
// 将物体添加到场景中 
scene.add(mesh)
// console.log(mesh);
// 创建环境光
const light = new THREE.AmbientLight(0x404040,1)
scene.add(light)  
// 平行光
const directionalLight = new THREE.DirectionalLight(0xffffff,1)
// 设置光源的方向 
directionalLight.position.set(80,100,50)
// 光的方向指向对象网格模型mesh,不设置默认为0,0,0
directionalLight.target = mesh
scene.add(directionalLight)
// 创建平行光辅助对象
const directionalLightHelper = new THREE.DirectionalLightHelper(directionalLight,10,0x00ff00)
scene.add(directionalLightHelper) 
const width = 600
const height = 400
const camera = new THREE.PerspectiveCamera(70,width/height,1,800)
// 设置相机的位置
camera.position.set(200,200,200) 
// 相机看原点
// camera.lookAt(0,0,0)
// 相机看向物体
camera.lookAt(mesh.position) 
// 创建webgl渲染器
const renderer = new THREE.WebGLRenderer()
// canvas画布宽高
renderer.setSize(width,height)
// 把渲染结果canvas画布,添加到网页上
// document.body.appendChild(renderer.domElement)
document.getElementById('webgl').appendChild(renderer.domElement)
// 定义一个render函数
function render() {
  // requestAnimationFrame  
  mesh.rotateY(0.01)//沿y轴旋转的弧度,单位 弧度
  renderer.render(scene,camera)
  requestAnimationFrame(render)//请求再次执行渲染函数render,渲染下一帧
}
render()
// 设置相机控件轨道控制器OrbitControls
const controls = new OrbitControls(camera,renderer.domElement)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档