three.js几何体的_UV_、法向属性以及BufferGeometry类介绍

2023-10-30

一、几何体的_UV_以及法向属性

  • UV属性是一组二维坐标,每个顶点都有一个对应的UV坐标。在三维模型上贴上二维的纹理贴图时,需要将所有顶点映射到纹理上的对应位置。UV属性的取值范围一般是[0,1],表示纹理上的相对位置。通过修改UV属性,可以在UV贴图上切换不同的图案或调整纹理贴图的映射效果。

  • 法向属性是每个顶点的法向量,用于确定顶点所在面的方向和光照效果。在three.js中,光照效果是基于每个顶点的法向量和光线方向计算的。因此,为了让模型的光照效果更真实,在创建几何体时需要设置每个顶点的法向量信息。通过修改法向属性,可以调整模型的光照效果和表面平滑度。

以下是在Three.js中创建一个立方体,并为其设置UV和法向属性的示例代码:

// 创建一个立方体
var geometry = new THREE.BoxGeometry(1, 1, 1);

// 设置UV属性
geometry.faceVertexUvs[0][0] = [new THREE.Vector2(0,0), new THREE.Vector2(0,1), new THREE.Vector2(1,1)];
geometry.faceVertexUvs[0][1] = [new THREE.Vector2(0,0), new THREE.Vector2(1,1), new THREE.Vector2(1,0)];
geometry.faceVertexUvs[0][2] = [new THREE.Vector2(0,0), new THREE.Vector2(1,0), new THREE.Vector2(1,1)];
geometry.faceVertexUvs[0][3] = [new THREE.Vector2(0,0), new THREE.Vector2(0,1), new THREE.Vector2(1,1)];
geometry.faceVertexUvs[0][4] = [new THREE.Vector2(0,0), new THREE.Vector2(1,0), new THREE.Vector2(1,1)];
geometry.faceVertexUvs[0][5] = [new THREE.Vector2(0,0), new THREE.Vector2(0,1), new THREE.Vector2(1,1)];

// 设置法向属性
geometry.computeVertexNormals();

// 创建一个材质和网格
var material = new THREE.MeshPhongMaterial({color: 0xffffff});
var mesh = new THREE.Mesh(geometry, material);

// 添加网格到场景中
scene.add(mesh);

二、BufferGeometry类介绍

Three.js中的BufferGeometry是一种高效的几何体对象,它是在WebGL上操作顶点缓冲区的优化版本。与基本几何形状不同,BufferGeometry是基于类型化数组的,可以直接传递给着色器程序,这就提高了性能,减少了内存开销。BufferGeometry还允许我们在不同的顶点属性之间传递数据,如纹理坐标、法线或颜色。因此,它是三维场景渲染中常用的一种对象类型。

在BufferGeometry中,我们需要自己定义模型的顶点、法线、颜色和纹理坐标等信息。与基本几何形状不同,BufferGeometry几何体对象不具备任何默认的属性,这就需要我们手动添加属性。

为了使用BufferGeometry,我们需要使用一些常用的数据类型,如Float32Array、Uint16Array、Uint32Array等,来创建相应的数组。在BufferGeometry中,我们定义完数组之后,需要使用THREE.BufferAttribute将数组传递给BufferGeometry对象。具体而言,我们可以通过如下方式来创建和设置BufferGeometry:

var geometry = new THREE.BufferGeometry();

var vertexPositions = [
   -1.0, -1.0,  1.0,
	 1.0, -1.0,  1.0,
	 1.0,  1.0,  1.0,

	 1.0,  1.0,  1.0,
	-1.0,  1.0,  1.0,
	-1.0, -1.0,  1.0
];

var vertices = new Float32Array(vertexPositions);
var attribute = new THREE.BufferAttribute(vertices, 3);
geometry.addAttribute('position', attribute);

上面的代码中,我们首先创建了一个BufferGeometry对象,并定义了一个顶点数组vertexPositions。然后,我们将该数组转换为Float32Array类型,并使用三元组来表示每一个顶点的坐标。接着,我们创建了一个BufferAttribute,将vertices数组传递给它,并用addAttribute方法将该属性添加到geometry对象中。在此例中,“position”是指顶点坐标属性。

通过这种方式,我们可以定义并设置顶点属性、法线、颜色和纹理坐标等。在创建BufferGeometry对象后,我们可以使用Mesh、Line和Points等对象将其渲染到画布上。总之,BufferGeometry是WebGL渲染中最高效的几何体对象之一,可以让我们更好地掌握WebGL渲染的核心原理。

三、使用BufferGeometry创建一个矩形

在这里插入图片描述
完整代码:

import * as THREE from "three";
// 导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

// 目标:BufferGeometry

// 1、创建场景
const scene = new THREE.Scene();

// 2、创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

// 设置相机位置
camera.position.set(0, 0, 10);
scene.add(camera);

// 添加物体

/********************************************************************************/
// 创建几何体
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([
  -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0,
]);

geometry.setAttribute("position", new THREE.BufferAttribute(vertices, 3));

const material = new THREE.MeshBasicMaterial({ color: 0xf6f5dd });
// 根据几何体和材质创建物体
const mesh = new THREE.Mesh(geometry, material);
console.log(mesh);
scene.add(mesh);
/********************************************************************************/



// 初始化渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);
// console.log(renderer);
// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement);

// // 使用渲染器,通过相机将场景渲染进来
// renderer.render(scene, camera);

// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用.update()。
controls.enableDamping = true;

// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

function render() {
  controls.update();
  renderer.render(scene, camera);
  //   渲染下一帧的时候就会调用render函数
  requestAnimationFrame(render);
}

render();

// 监听画面变化,更新渲染画面
window.addEventListener("resize", () => {
  //   console.log("画面变化了");
  // 更新摄像头
  camera.aspect = window.innerWidth / window.innerHeight;
  //   更新摄像机的投影矩阵
  camera.updateProjectionMatrix();

  //   更新渲染器
  renderer.setSize(window.innerWidth, window.innerHeight);
  //   设置渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio);
});

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

three.js几何体的_UV_、法向属性以及BufferGeometry类介绍 的相关文章

  • 使用 Gmail 上下文小工具访问附件

    我想将电子邮件及其附件从 Gmail Google Apps 保存到另一个数据库以实现类似 CRM 的功能 然而 根据docs http code google com apis gmail gadgets contextual 提取器无法
  • 检测对给定 JavaScript 事件的支持?

    我有兴趣使用 JavaScript hashchange 事件来监视 URL 片段标识符的更改 我知道非常简单的历史 http code google com p reallysimplehistory 以及用于此目的的 jQuery 插件
  • 刷新页面后保留输入值

    我有一个带有输入字段的表单 该输入包含一个下拉菜单 从数据库中读取信息 如果用户输入值 并且当他到达下拉菜单时 他没有找到他想要的内容 他会转到另一个页面将此信息添加到下拉菜单 然后转到第一页继续输入信息 如果他转到另一个页面向下拉菜单添加
  • Javascript - 使数组索引 toLowerCase() 不起作用

    我试图将所有数组索引设置为小写字符串 但它不起作用 我在这里查看了其他答案并尝试了他们的解决方案 例如使用toString 添加之前toLowerCase但它不起作用 这很奇怪 我创建了一个问题的jsfiddlehere https jsf
  • 如何从对象数组中删除所有重复项?

    This is a large array of objects e g let totalArray id rec01dTDP9T4ZtHL4 fields user id 170180717 user name abcdefg even
  • 如何将节点 sqlite3 与 q (promise) 一起使用

    我正在尝试将 Promise 与 sqlite3 一起使用 这是我的源代码的一部分 this deleteTag function tag project var db this db if project return q nfcall
  • 光标:IE 8 和 9 中的自动行为

    我想要的是为整个正文标记指定cursor pointer 这样页面的背景是可点击的 但我也希望页面的其余部分像以前一样工作 所以我尝试为div设置cursor auto 其中包含这一页 在 FF Chrome 和 safari 中 它工作得
  • TypeError:cli.init 不是 React Native 的函数

    在 MacBook Air M1 芯片中运行 npx react native init appName 时 TypeError cli init is not a function at run opt homebrew lib node
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • “move(-1)”作为 AngularJS 表达式有什么问题吗?

    我收到此错误 parse ueoe Unexpected end of expression move 从这段代码来看
  • Google 地图 Javascript v3 折线点击事件

    我正在尝试显示一张地图 其中有多条路线布置为折线 单击多段线时 我想显示特定于该线的数据 将数据与线关联不是问题 但无论单击哪条线 显示的数据都会与最近绘制的线关联 就好像每条新折线都会覆盖最后一条线一样 我有一个数据库 其中包含 gpx
  • 如何获取 Spotify API 的访问令牌?

    我已经研究 Spotify api 和示例源代码几天了 但我仍然不知道如何获取访问令牌来访问用户的播放列表数据 我已经到达了拉起登录窗口 用户登录 然后收到授权码的地步 此时 我尝试做这样的事情 window open https acco
  • 如何在使用类型分散时将箭头添加到行尾

    如何在 y 不等于 0 且系列类型以线宽 2 分散的情况下正确地将箭头添加到行的每一端 在这里我可以看到箭头已添加但未正确添加 请看这个 部分工作小提琴 http jsfiddle net vnYCX 这是我的 JS 最初的原型是由 sta
  • 如何使用转义的 unicode 解码字符串?

    我不确定这叫什么 所以我在搜索时遇到了麻烦 如何使用 unicode 解码字符串http u00253A u00252F u00252Fexample com to http example com使用 JavaScript 我试过unes
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • redux - 如何存储和更新键/值对

    我正在使用 redux 和 React js 我想存储简单的键 值对 但无法获得正确的减速器语法 在这种情况下 每个键 值对将保持与外部系统的连接 这是正确的做法吗 我刚开始使用 redux 所以这有点神秘 export default s
  • javascript从字符串创建不区分大小写的正则表达式

    我试图通过以不区分大小写的方式将输入与正则表达式匹配来进行验证 正则表达式作为对象上的字符串从服务中下来 我可能会得到类似的东西 regex ane 我可以执行以下操作 var rx new RegExp object regex The
  • “memset”没有 DLL 那么如何 ctype 它

    如何使用memset在 jsc 类型中 没有对应的 DLL 我搜索 搜索了 js ctype 代码 但找不到要破解的示例 如果你只是想memset一个数组为零字节 然后我有 好消息 大家 js ctypes 会将新数组初始化为零 否则 最简
  • 为什么 phantomjs 不能在 MacOS Sierra 中工作?

    我们正在使用phantomjs 1 9 1 macosx phantomjs 2 0 0 macosx哪一个工作得很好OS X 埃尔卡皮坦更新后macOS 塞拉利昂它会引发以下错误 phantomjs 1 9 1 macosx phanto
  • 加载谷歌地图控件时是否有事件?

    我知道tilesloaded 但控件似乎在该事件之后加载 我基本上希望能够通过 jQuery 获取控件 但甚至找不到正确的监听 我也刚刚处理了 没有类似的事件 在控件可见之前空闲和tilesloaded触发 因此 基本上将 特殊控制 类添加

随机推荐

  • 哔哩哔哩能下游戏?B站游戏下载

    哔哩哔哩不仅可以看视频和社区活动 还可以下载游戏 你知道吗 哔哩哔哩要如何下载游戏呢 本期教程就来教教大家B站游戏下载的方法 哔哩哔哩下载游戏方法教程 1 打开b站之后 点击游戏中心图标 2 进去哔哩哔哩游戏中心之后 点击底部我的 3 在我
  • 使用UmiJS开发项目(上)

    目录 一 Umi是什么 二 项目初始化 三 配置prettier eslint stylelint 四 配置文件 五 多环境多配置文件 前段时间公司重构的项目中选用Umi框架 使用的过程中整理并封装了一些Umi常用的功能 由于文章篇幅较长
  • 解压文件win10自动删除

    解压文件 包含一个破解软件 被win10自动删除 复制也会提示 无法完成操作 因为文件包含病毒或潜在的垃圾软件 解决办法 找到病毒和威胁防护 找到被隔离的威胁 操作允许在设备上即可
  • Java 11 升Java 17 重要特性必读(摘录)

    1 JDK 17 在 2021 年 9 月 14 号正式发布了 根据发布的规划 这次发布的 JDK 17 是一个长期维护的版本 LTS SpingFramework 6 和SpringBoot 3中默认将使用JDK 17 所以JDK 17必
  • vue封装组件之上传图片组件(el-upload)

    vue封装组件之上传图片组件 el upload 未上传状态 上传状态 其他状态 查看 删除 自定义组件文件名称 这里叫UploadImg vue
  • 子串判断

    链接 https www nowcoder com questionTerminal 917a800d4de1423394827932f4725c68 orderByHotValue 1 done 0 pos 10 onlyReferenc
  • 亲身经历提醒大家,工作千万不要太快做完,快了领导就会认为你很能干,把最急、最难的任务分给你!...

    职场上 如何合理把握工作节奏 一位网友用亲身经历提醒大家 上班的时候千万不要搞太快了 搞快了领导就会认为你很能干 分任务的时候 永远把最多 最急 最难 最复杂的业务都交给你 然后别人搞完都下班了 唯独你一个人坐那加班 真是讽刺 许多网友都有
  • JavaScript中的类型详解

    一 JavaScript中的类型 JavaScript中的类型可以分为基本数据类型和引用类型两种 基本类型值 指的是保存在栈内存中的简单数据段 引用类型值 指的是那些保存在堆内存中的对象 意思是 栈内存中保存的实际上只是一个指针 这个指针指
  • 五位杰出的中国女科学家--巾帼不让须眉,见证科技中的“她力量”

    今年一月 英国广播公司 BBC 公布 20世纪最具标志性人物 票选活动 中国首位诺贝尔生理学或医学奖得主屠呦呦与居里夫人 爱因斯坦等一同入围 BBC还专门制作了介绍短片 讲述屠呦呦发现青蒿素的传奇故事 去年也是科研女性表现亮眼的一年 中国科
  • FBX动画导入Unity

    Unity动画 1 1 第一章 Unity导入FBX模型动画但不能动 文章目录 Unity动画 前言 一 FBX模型动画 二 Unity导入后设置参数 1 设置材质 2 设置动画 总结 前言 随着AR VR等技术发展 摸一手Unity动画总
  • 拷贝构造函数和赋值运算符区别

    只有在赋值时 才调用赋值函数 当在声明变量时 B b3 b1和B b4 b3 调用的函数是一样的 均为拷贝构造函数 一 拷贝构造 是一个的对象来初始化一边内存区域 这边内存区域就是你的新对象的内存区域赋值运算 对于一个已经被初始化的对象来进
  • pyecharts运用——对数据进行可视化处理

    pyecharts运用 对数据进行可视化处理 前言 本博客记录这学期关于数据可视化的一些学习 由于我是一个菜鸟 编程能力很弱 希望路过的大佬多多海涵 一 为什么要数据可视化 数据可视化的根本目的就是教会我们如何去分析一段数据 并让非专业的人
  • Linux编程MQTT实现主题发布订阅

    物联网阿里云平台开发项目实战 附课件资料 智能硬件开发 数据上云 零基础入门 4G模块连接阿里云教程 MQTT通信协议 mosquitto 在Linux上的环境构建与测试 MQTT通信协议 mosquitto 发布订阅例子C语言实现 MQT
  • 继承与多态---------继承

    一 子类对象实例化 public class Test public static void main String args Student1 stu new Student1 stu setName 张三 stu setAge 21 s
  • Element-UI表格嵌入popover出现的问题以及解决方案

    最近几天遇到一个比较棘手的问题 需求是在触发表格某一列的cell 弹窗展示新的数据 不是表格内的数据 而是需要重新向后端请求 我这里使用了popover展示弹窗 代码是删减过的 为了更清楚地记录 有些这里没有用到的代码就删了
  • Qt5中char*和QString的互转问题

    1 char 转换成QString 1 如果char 中没有中文字符 那么转换的时候 非常的简单 char ch abcd QString strzw ch strzw ch 等等 2 如果char 中含有中文字符 那么转换的时候必须注意了
  • springboot打包成war并部署到阿里云tomcat服务器最简洁有用的教程

    一 打包成war 1 配置文件pom xml中的
  • Visual C++ 2008 runtime files are out of data

    今天用 Setup Factory打了一个包 在win7系统上双击安装该包时 弹出如下错误 费了好长时间 最后才知道原因 是我将vcredist x86 exe作为从属文件加入Setup Factory时 Setup Factory对操作系
  • BGA焊盘设计的一般规则

    BGA焊盘设计的一般规则 1 焊盘直径既能影响焊点的可靠性又能影响元件的布线 焊盘直径通常小于焊球直径 为了获得可靠的附着力 一般减少20 25 焊盘越大 两焊盘之间的布线空间越小 如1 27mm间距的BGA封装 采用0 63mm直径焊盘
  • three.js几何体的_UV_、法向属性以及BufferGeometry类介绍

    一 几何体的 UV 以及法向属性 UV属性是一组二维坐标 每个顶点都有一个对应的UV坐标 在三维模型上贴上二维的纹理贴图时 需要将所有顶点映射到纹理上的对应位置 UV属性的取值范围一般是 0 1 表示纹理上的相对位置 通过修改UV属性 可以