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

three.js 第四节 - 创建顶点(索引的使用)

顶点不共用(不使用索引)


// 引入three.js
import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'const scence = new THREE.Scene()const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(0, 0, 10) // 设置相机位置const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth / 2, window.innerHeight / 2)
document.body.appendChild(renderer.domElement)// -------------------------------------- 创建顶点 -------------------------------------------------const geometry = new THREE.BufferGeometry()
// 创建顶点数据,顶点是有序的,每三个点为一个顶点,逆时针为正面
const vertices = new Float32Array([// 第一个三角形-1.0, -1.0, 0, 1.0, -1.0, 0, 1.0, 1.0, 0,// 第二个三角形1.0, 1.0, 0, -1.0, 1.0, 0, -1.0, -1.0, 0
])
// 创建顶点属性
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3)) // 3:3个点为一个顶点
// 创建材质
const material = new THREE.MeshBasicMaterial({color: '0x00ff00',wireframe: true,// side: THREE.DoubleSide
})
const plane = new THREE.Mesh(geometry, material)
scence.add(plane)// -------------------------------------- 创建顶点 -------------------------------------------------// 添加世界坐标辅助器,红色-X轴; 绿色-Y轴; 蓝色-Z轴
const axesHelper = new THREE.AxesHelper(5)
scence.add(axesHelper)const controls = new OrbitControls(camera, renderer.domElement)
// 设置带阻尼的惯性
controls.enableDamping = true
// 设置阻尼系数
controls.dampingFactor = 0.01// 每一帧根据控制器更新画面
function render() {// 如果,需要控制器带有阻尼效果,或者自动旋转等效果,就需要加入`controls.update()`controls.update()// `requestAnimationFrame`:在屏幕渲染下一帧画面时,触发回调函数来执行画面的渲染requestAnimationFrame(render)renderer.render(scence, camera)
}
render()

在这里插入图片描述

此时,效果图:

在这里插入图片描述


顶点共用(使用索引)


// 引入three.js
import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'const scence = new THREE.Scene()const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(0, 0, 10) // 设置相机位置const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth / 2, window.innerHeight / 2)
document.body.appendChild(renderer.domElement)// ---------------------------------------------------------------------------------------const geometry = new THREE.BufferGeometry()// 方式一:不使用索引(这种情况,是不会共用顶点的)
// 创建顶点数据,顶点是有序的,每3个数据确定一个顶点,逆时针为正面
// const vertices = new Float32Array([
//   // 第一个三角形
//   -1.0, -1.0, 0, 1.0, -1.0, 0, 1.0, 1.0, 0,
//   // 第二个三角形
//   1.0, 1.0, 0, -1.0, 1.0, 0, -1.0, -1.0, 0
// ])
// // 创建顶点属性
// geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3)) // 3:每3个数据确定一个顶点
// console.log('不使用索引-geometry', geometry)// 方式二:使用索引(共用顶点)
const vertices = new Float32Array([-1.0, -1.0, 0, 1.0, -1.0, 0, 1.0, 1.0, 0, -1.0, 1.0, 0])
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3))
// 创建索引
const indices = new Uint16Array([0, 1, 2, 2, 3, 0])
geometry.setIndex(new THREE.BufferAttribute(indices, 1))
console.log('使用索引-geometry', geometry)// 创建材质
const material = new THREE.MeshBasicMaterial({color: '0x00ff00',wireframe: true// side: THREE.DoubleSide
})
const plane = new THREE.Mesh(geometry, material)
scence.add(plane)// ---------------------------------------------------------------------------------------// 添加世界坐标辅助器,红色-X轴; 绿色-Y轴; 蓝色-Z轴
const axesHelper = new THREE.AxesHelper(5)
scence.add(axesHelper)const controls = new OrbitControls(camera, renderer.domElement)
// 设置带阻尼的惯性
controls.enableDamping = true
// 设置阻尼系数
controls.dampingFactor = 0.01// 每一帧根据控制器更新画面
function render() {// 如果,需要控制器带有阻尼效果,或者自动旋转等效果,就需要加入`controls.update()`controls.update()// `requestAnimationFrame`:在屏幕渲染下一帧画面时,触发回调函数来执行画面的渲染requestAnimationFrame(render)renderer.render(scence, camera)
}
render()

效果图如下:
在这里插入图片描述

相关文章:

  • 【CS.PL】Lua 编程之道: 基础语法和数据类型 - 进度16%
  • HBase数据库面试知识点:第一部分 - 基础概念与特点(持续更新中)
  • 电商API接口的采集实例:京东商品详情API接口的采集过程和步骤分析
  • 二叉树的算法题目
  • SolidWorks官方授权代理商亿达四方带您解读最新SW版本特性
  • Java Opencv识别图片上的虫子
  • [汇总] CentOS中查询端口终止进程的指令
  • 启动mysql 3.5时出现 MySql 服务正在启动 . MySql 服务无法启动。
  • tim定时器 输入捕获模式下 TIM–ICStructinit(TIM–ICStructinit) 这个值 解析
  • C++中的结构体——结构体嵌套结构体
  • 全球5G时代,智启未来生活
  • HandyControl的属性编辑器如何绑定自定义控件,并集成到自定义编辑器
  • 接口自动化测试框架-fixture函数使用
  • 【FreeRTOS】软件定时器 software timer(上)
  • 教你一招,告警恢复时如何拿到恢复时的值?
  • 【译】理解JavaScript:new 关键字
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Idea+maven+scala构建包并在spark on yarn 运行
  • k8s 面向应用开发者的基础命令
  • MySQL用户中的%到底包不包括localhost?
  • Netty 4.1 源代码学习:线程模型
  • 观察者模式实现非直接耦合
  • 强力优化Rancher k8s中国区的使用体验
  • 使用agvtool更改app version/build
  • 使用parted解决大于2T的磁盘分区
  • 思考 CSS 架构
  • 用jquery写贪吃蛇
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 移动端高清、多屏适配方案
  • ​io --- 处理流的核心工具​
  • $.ajax中的eval及dataType
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (6)STL算法之转换
  • (CPU/GPU)粒子继承贴图颜色发射
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (算法)大数的进制转换
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)Mysql的优化设置
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (轉貼) UML中文FAQ (OO) (UML)
  • ./configure,make,make install的作用
  • .FileZilla的使用和主动模式被动模式介绍
  • .net 后台导出excel ,word
  • .NET 解决重复提交问题
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [20181219]script使用小技巧.txt
  • [2024-06]-[大模型]-[Ollama]- WebUI
  • [8481302]博弈论 斯坦福game theory stanford week 1