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

news2024/10/5 16:22:56

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


// 引入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()

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cesium 多边形加边框宽度 Polygon outlineWidth

cesium中用polygon添加多边形时,设置outlineWidth无效,常见做法是在添加polygon的同时加一个polyline,但是当多边形相邻两条边的角度比较小的情况下,这两个点的连接处有明显的交叉。 解决方案: 第一步:通过…

永磁同步电机滞环电流控制(PI双闭环)matlab仿真模型

微♥“电击小子程高兴的MATLAB小屋”获取模型 1.滞环电流控制的原理 将给定的电流信号与反馈的电流信号进行比较,然后控制它俩之间的差值稳定在一个滞环范围内,若超出范围,则进行相应的调节操作。 操作如下叙述:假设以三相中的A相…

网络安全领域国内外有哪些法律法规?

1. 中国 1.中华人民共和国网络安全法(简称网安法) 生效时间:2017年6月1日主要内容:规范网络运营行为,维护网络安全,保护国家安全和公共利益,以及保护公民、法人和其他组织的合法权益。 2.中华…

使用AlphaCodium进行代码生成,从提示工程到流程工程

AlphaCodium 的代码生成方法 论文地址:https://arxiv.org/pdf/2401.08500.pdf 源码地址:https://github.com/codium-ai/alphacodium 研究要点包括 **挑战:**现有的自然语言优化方法无法扩展 LLM 的代码生成能力**解决方案:**使…

通过搭建 24 点小游戏应用实战,带你了解 AppBuilder 的技术原理

本文将通过一个 24 点小游戏的案例,详细介绍百度智能云千帆 AppBuilder 的基本技术原理和使用方法,帮助读者快速掌握 AI 原生应用的开发流程。 1 三步构建 AI 原生应用方法论 AI 原生应用与传统应用的最大区别是交互形态彻底的拟人化,通过…

推荐这两款AI工具,真的很好用

巨日禄 巨日禄是一款由杭州巨日禄科技有限公司开发的AI工具,主要功能是将文本内容转换为视频。该工具通过分析大量的剧本数据和影视作品,为用户提供各种类型的故事情节和角色设置,帮助用户快速找到灵感,减少构思剧本的困难和犹豫。…

地级市海拔标准差(可用作宽带中国工具变量)

地级市海拔标准差(可用作宽带中国工具变量) 1、来源:地理空间数据云 2、指标:行政区划代码、地区、所属省份、所属地域、经度、纬度、海拔标准差(m) 3、说明:地形起伏度会影响网络基础设施建…

Python第二语言(十、Python面向对象(上))

目录 1. 标记变量的基础类型 2. 初识对象 2.1 使用对象组织数据 3. 成员变量 3.1 类和类成员的定义 3.2 成员变量和成员方法使用 3.3 成员方法的定义语句 4. 类和对象class Clock: def ring(self): 4.1 创建类对象的语法:对象名 类名称() 4.2 用生活中的…

如何用Pycharm把python代码打包成exe文件

在terminal 里面输入pyinstaller --onefile --noconsole chuli_v2.py –noconsole 这个选项会生成一个不带控制台窗口的 .exe 文件

开发移动端常见的问题:VW适配问题,基于 postcss 插件 实现项目vw适配

当你开发移动端的时候有一个问题是避免不了的,那就是当屏幕大小无论怎么变化时,内部尺寸也要随之发生改变,也就是适配问题。这里我们讲的是最新的VW适配,也就是用vw作为单位,100vw是整个页面的大小。而在开发的设计图中…

Solr 日志系统7.4.0部署和迁移到本地,Core Admin 添加新的core报错

文章目录 Solr部署Docker部署二进制部署 Tips:Solr设置账号密码方法1:(不使用)方法2: Core Admin 添加新的core报错Solr数据迁移 Solr部署 Docker部署 docker run -d -p 8983:8983 --name solr solr:latest docker run -d -p 8983:8983 -v /opt/solr:/…

随便写写之——CSDN个人主页布局(二)

现在是中午11点30,还是有点迷糊,也不知道怎么了。 继续写写这个界面吧 代码太多了。吧上边的丢到组件里 加个图片好了,不然太丑了,看下main_haeader的布局 都是些比较简单的布局,头像这边就用了一个绝对定位定在了左…

java多线程临界区介绍

在Java多线程编程中,"临界区"是指一段必须互斥执行的代码区域。当多个线程访问共享资源时,为了防止数据不一致或逻辑错误,需要确保同一时刻只有一个线程可以进入临界区。Java提供了多种机制来实现这一点,例如synchroniz…

2024-6-12-IXI(mat)应用到SR的代码解读

数据集 Download and decompress data from the link 百度网盘 请输入提取码 Password: qrlt Transform .h5 format to .mat format "python convertH5tomat.py --data_dir XXX/T2Net/h5 论文:Task Transformer Network for Joint MRI Reconstruction and Super-Resoluti…

甲骨文新业绩发布!云业务同比增长42%,盘后股价上涨9%

KlipC报道:当地时间6月11日,甲骨文发布了2024财年年报以及2024第四季度的业绩报告。2024财年营收529.61亿美元,同比增长6.02%;净利润104.67亿美元,同比增长23.1%。 第四季度营收同比增长3.3%,达到143亿美元…

Mysql学习(九)——存储引擎

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 七、存储引擎7.1 MySQL体系结构7.2 存储引擎简介7.3 存储引擎特点7.4 存储引擎选择7.5 总结 七、存储引擎 7.1 MySQL体系结构 连接层:最上层是一些客户…

Font Creator使用方法,将第三方.ttf字符拷贝至自定义ttf字体

网上官网下载FontCreator,打开,使用免费版,直接拖拽.ttf进入工程 拷贝Google字库ttf到自定义Custom字库方法: 完成后导出 导出配置我保持默认的,路径选下就好了

前端加载 动画特效

效果图: 完整代码: <!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>加载动画</title><style type="text/css">/* 设置页面背景颜色 */body {background: #ECF0F1;}/* 定义加载动画容器的样式…

vue3第三十九节(TS中的高级类型,分类以及使用注意事项)

前言&#xff1a;为什么需要使用高级类型&#xff0c;正常的类型不能满足日常的业务需求&#xff0c;对于复杂的数据结构、函数签名、类型转换&#xff0c;我们需要使用高级类型来处理&#xff0c;常用的高级类型包含以下几种&#xff1a; 常用的类型定义&#xff1a; 基本类…

vs2015+win10编译LAStools

文章目录 下载LasTool安装包编译laslib测试 下载LasTool安装包 不要再GitHub上下载&#xff0c;在官网下载&#xff1a;link 编译laslib 将压缩包解压到对应路径下&#xff0c;注意路径下不要有空格和汉字。用vs打开目录下的 “lastools.dsw” 文件 下面注意几点&#xff1a…