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

Threejs 解析几何体提取顶点数据流程

目录

前言 

原生WebGL

整体解析过程简介

顶点颜色属性Geometry.colors

Geometry转化为BufferGeometry

相关函数

WebGLAttributes.js

WebGLGeometries.js

WebGLObjects.js

WebGLRenderer.js

WebGLRenderer.js


前言 

解析几何体对象,提取顶点数据,然后调用WebGL API创建顶点缓冲区,并把创提取的顶点数据传入创建的顶点缓冲区。解释Three.js渲染器是如何解析场景和渲染器对象的,也就是Threejs如何解析几何体并创建相应的顶点缓冲区。

 

原生WebGL

原生WebGL通过gl.createBuffer()创建一个顶点缓冲区对象,用来存储顶点位置、顶点颜色、顶点法向量等数据。如果你理解了这一段代码,自然就很容易理解Three.js的几何体对象和相应的缓冲区。

// 顶点位置数据
var data=new Float32Array([0.5,0.5,0.3...]);// 创建缓冲区buffer,传入顶点位置数据data
var buffer=gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
gl.bufferData(gl.ARRAY_BUFFER,data,gl.STATIC_DRAW);
gl.vertexAttribPointer(aposLocation,3,gl.FLOAT,false,0,0);

 

整体解析过程简介

Three.js渲染器解析几何体对象,会从几何体对象提取顶点数据传入WebGL顶点缓冲区的时候,如果解析的是BufferGeometry对象,直接访问.attributes属性提取顶点数据就可以,比如获得顶点位置数据,通过.attributes.position.array获得顶点数据。如果Three.js渲染器解析的几何体是Geometry对象,会先把Geometry对象转化为BufferGeometry对象然后再解析。 

 

顶点颜色属性Geometry.colors

点模型Points、线模型Line对象与网格模型Mesh对象的几何体结构Geometry略有不同。

Geometry.colors属性包含的顶点颜色数据在点模型Points、线模型Line中使用,几何体对象的该属性在网格模型Mesh中不起作用。 网格模型Mesh使用几何体对象三角面Face3的顶点颜色属性Face3.vertexColors设置颜色。

Geometry转化为BufferGeometry

通过BufferGeometry.setFromObject(object)方法可以把参数可以把object模型对象的几何体geometry转化为BufferGeometry,点模型Points和线模型Line使用一套解析转化规则,网格模型Mesh使用一种转化规则。

对于网格模型的几何体Geometry转化为BufferGeometry的时候,需要先把Geometry对象转化为直接几何体对象DirectGeometry,然后再转化为BufferGeometry对象。

相关函数

WebGLAttributes.js、WebGLGeometries.js和WebGLObjects.js是工厂函数,执行这三个函数都会返回一个具有特定方法的对象,WebGLObjects.js会调用WebGLGeometries对象的方法,WebGLGeometries.js会调用WebGLAttributes对象的方法。

 

 

WebGLAttributes.js

.update(BufferAttribute)方法

解析BufferAttribute对象,也就是说从BufferAttribute对象的.array属性提取顶点数据,把顶点数据传入WebGL顶点缓冲区,对gl.createBuffer()gl.、bufferData()等WebGL API进行了封装。

WebGLGeometries.js

.get()方法

参数:.get(Object,Object.geometry)

如果Object.geometry是BufferGeometry直接返回,如果是Geometry,会转化为BufferGeometry,点线模型和网格模型的Geometry转化规则不同,所以参数需要传入Object,代码需要判断Object是Points和Line还是Mesh。

.update(BufferGeometry)方法

通过BufferGeometry的.index.attributes属性,获得包含顶点数据的BufferAttribute对象,然后BufferAttribute作为参数调用WebGLAttributes.update()方法,提取顶点数据并传入顶点缓冲区。

WebGLObjects.js

.update(Object)方法

从模型对象Object提取几何体数据,也就是模型的几何体属性 Object.geometry,然后调用WebGLGeometries.get()方法,并把Object和Object.geometry作为参数,直接get方法后返回BufferGeometry,然后调用WebGLGeometries.update()方法,把BufferGeometry作为参数。

WebGLRenderer.js

场景中遍历获得的对象object,如果是Points、Line或Mesh模型,调用WebGLObjects.update()方法,并把object作为参数。

WebGLRenderer.js文件

import {WebGLAttributes} from './webgl/WebGLAttributes.js';
import {WebGLGeometries} from './webgl/WebGLGeometries.js';
import {WebGLObjects} from './webgl/WebGLObjects.js';var attributes, geometries, objects;attributes = new WebGLAttributes(_gl);
// WebGLAttributes作为WebGLGeometries参数
geometries = new WebGLGeometries(_gl, attributes, info);
// WebGLGeometries作为WebGLObjects参数
objects = new WebGLObjects(geometries, info);function projectObject(object, camera, sortObjects) {
...
else if (object.isMesh || object.isLine || object.isPoints) {
var geometry = objects.update(object);
}
...// 递归算法:遍历对象
var children = object.children;
for (var i = 0, l = children.length; i < l; i++) {
projectObject(children[i], camera, sortObjects);
}
}
// 渲染方法中调用projectObject
this.render = function(scene, camera, renderTarget, forceClear) {
...
// 递归遍历场景对象,对于其中的点、线和网格模型需要解析它们的几何体,提取顶点数据,并传入顶点缓冲区
projectObject(scene, camera, _this.sortObjects);
...
}

 

相关文章:

Threejs 解析几何体提取顶点数据流程

目录 前言 原生WebGL 整体解析过程简介 顶点颜色属性Geometry.colors Geometry转化为BufferGeometry 相关函数 WebGLAttributes.js WebGLGeometries.js WebGLObjects.js WebGLRenderer.js WebGLRenderer.js 前言 解析几何体对象&#xff0c;提取顶点数据&#xf…...

浮动与清除浮动

浮动&#xff08;float&#xff09;是CSS中用于布局的重要属性&#xff0c;它使元素脱离正常的文档流&#xff0c;并向左或向右移动&#xff0c;直到碰到另一个浮动元素或父元素的边界。 浮动的定义和作用 定义&#xff1a;浮动是通过设置 float 属性使元素脱离正常的文档流&a…...

YOLOv5 + SE注意力机制:提升目标检测性能的实践

一、引言 目标检测是计算机视觉领域的一个重要任务&#xff0c;广泛应用于自动驾驶、安防监控、工业检测等领域。YOLOv5作为YOLO系列的最新版本&#xff0c;以其高效性和准确性在实际应用中表现出色。然而&#xff0c;随着应用场景的复杂化&#xff0c;传统的卷积神经网络在处…...

极简Redis速成学习

redis是什么&#xff1f; 是一种以键值对形式存储的数据库&#xff0c;特点是基于内存存储&#xff0c;读写快&#xff0c;性能高&#xff0c;常用于缓存、消息队列等应用情境 redis的五种数据类型是什么&#xff1f; 分别是String、Hash、List、Set和Zset&#xff08;操作命…...

教育培训APP开发全攻略:从网校系统源码搭建到功能优化的技术方案

本篇文章&#xff0c;笔者将从网校系统源码搭建到功能优化的角度&#xff0c;全面解析教育培训APP的开发技术方案&#xff0c;帮助企业和开发者更好地理解如何提升在线教育平台的性能与用户体验。 一、教育培训APP开发的核心架构 教育培训APP的架构设计是其能否顺利运行和扩展…...

网络安全与认知安全的区别 网络和安全的关系

前言 说说信息安全 与网络安全 的关系 一、包含和被包含的关系 信息安全包括网络安全&#xff0c;信息安全还包括操作系统安全&#xff0c;数据库安全 &#xff0c;硬件设备和设施安全&#xff0c;物理安全&#xff0c;人员安全&#xff0c;软件开发&#xff0c;应用安全等。…...

16.1 LangChain 表达式语言(LCEL)深度解析:构建灵活高效的大模型应用流水线

LangChain 表达式语言(LCEL)深度解析:构建灵活高效的大模型应用流水线 关键词:LangChain 表达式语言、LCEL 编程范式、大模型应用编排、流式处理优化、生产级链式开发 1. LCEL 设计哲学与核心优势 1.1 为何需要 LCEL? #mermaid-svg-pIEGtObTES1T3LgF {font-family:"…...

介绍微信小程序中页面的生命周期函数和组件的生命周期函数

1.1 页面生命周期函数 这些函数主要用于管理页面的显示和隐藏。 onLoad(options): 页面加载时触发&#xff0c;options 是页面路由参数&#xff0c;可以在这里初始化数据。每当用户进入该页面时都会调用这个函数。 onShow(): 页面显示时触发。每当页面从后台切换到前台时都会…...

arm | lrzsz移植记录

1 我的使用场景 开发板无网络, 无奈只得用U盘拷贝文件 文件不大, 每次都插拔U盘, 很繁琐 原来的环境不支持rz等命令 就需要移植这个命令来使用 下载地址 https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 2 编译脚本 # 主要内容在这里 configure_for_arm(){mkdir -p $PA…...

智能机器人加速进化:AI大模型与传感器的双重buff加成

Deepseek不仅可以在手机里为你解答现在的困惑、占卜未来的可能&#xff0c;也将成为你的贴心生活帮手&#xff01; 2月21日&#xff0c;追觅科技旗下Dreamehome APP正式接入DeepSeek-R1大模型&#xff0c;2月24日发布的追觅S50系列扫地机器人也成为市面上首批搭载DeepSeek-R1的…...

Qt:day1

一、作业 写1个Widget窗口&#xff0c;窗口里面放1个按钮&#xff0c;按钮随便叫什么&#xff1b; 创建2个Widget对象&#xff1a; Widget w1, w2; w1.show(); w2不管&#xff1b; 要求&#xff1a; 点击 w1.btn&#xff0c;w1隐藏&#xff0c;w2显示&#xff1b; 点击 w2.btn&…...

端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port

文章目录 需求&#xff1a;A机器是内网机器&#xff0c;B机器是公网服务器&#xff0c;想要从公网&#xff0c;访问A机器的端口方式&#xff1a;端口映射&#xff0c;内网穿透&#xff0c;使用ssh打洞端口&#xff1a;遇到问题&#xff1a;命令执行成功&#xff0c;但是端口转发…...

Java从根上理解 ConcurrentHashMap:缓存机制与性能优化

目录 一、ConcurrentHashMap 的核心原理1. 数据结构2. 锁机制3. 扩容机制二、ConcurrentHashMap 的缓存机制1. 缓存的实现2. 缓存的更新策略三、ConcurrentHashMap 的性能优化1. 减少锁竞争2. 优化数据结构3. 合理设置容量和负载因子四、具体代码示例1. 创建 ConcurrentHashMap…...

通过百度构建一个智能体

通过百度构建一个智能体 直接可用,我不吝啬算力 首先部署一个模型,我们选用deepseek14 构建智能体思考步骤,甚至多智能体; from openai import OpenAIclass Agent:def __init__(self, api_key, base_url, model...

【MySQL】(1) 数据库基础

一、什么是数据库 数据库自行选择了合适的数据结构来组织数据&#xff0c;方便用户写入&#xff08;存储介质&#xff0c;如硬盘&#xff0c;机器断电不会丢失数据&#xff09;和查询数据。在数据结构部分&#xff0c;我们讲到的 ArrayList、HashMap 集合类对象也能存储数据&am…...

DeepSeek后训练:监督微调和强化学习

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列十二DeepSeek大模型技术系列十二》DeepS…...

基于 MetaGPT 自部署一个类似 MGX 的多智能体协作框架

MGX&#xff08;由 MetaGPT 团队开发的 mgx.dev&#xff09;是一个收费的多智能体编程平台&#xff0c;提供从需求分析到代码生成、测试和修复的全流程自动化功能。虽然 MGX 本身需要付费&#xff0c;但您可以通过免费服务和开源项目搭建一个类似的功能。以下是一个分步骤的实现…...

三个小时学完vue3 —— 简单案例(二)

三个小时学完vue3&#xff08;二&#xff09; 图片轮播案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

数字人技术再超越,TANGO 可生成与音频匹配的全身手势视频

TANGO 是由东京大学与 CyberAgent AI Lab 于 2024 年共同研发的开源框架&#xff0c;专注于声音驱动的全身数字人生成。该技术能够根据目标语音音频生成与之同步的全身手势视频&#xff0c;突破了传统数字人技术仅支持面部或上半身动作的局限性。TANGO 的工作原理利用隐式分层音…...

释放微软bing的力量:深度剖析其主要功能

在浩瀚无垠的互联网海洋中,搜索引擎就如同指南针,引领我们找到所需要的信息。微软必应凭借其一系列强大功能,在搜索引擎领域脱颖而出,成为极具竞争力的一员。在这篇博客文章中,我们将深入探讨微软必应的主要功能,这些功能使其独具特色,成为全球用户的得力工具。 1. 智能…...

DeepSeek 开源周(2025/0224-0228)进度全分析:技术亮点、调用与编程及潜在影响

DeepSeek 技术开源周期间所有开放下载资源的目录及简要说明: 1. FlashMLA 描述:针对 Hopper GPU 优化的高效 MLA 解码内核,专为处理可变长度序列设计,显著提升大语言模型(LLM)的解码效率。性能:内存受限配置下可达 3000 GB/s 带宽,计算受限配置下可达 580 TFLOPS 算力(…...

let、const【ES6】

‌“我唯一知道的就是我一无所知。” - 苏格拉底 目录 块级作用域&#xff1a;var、let、const的对比&#xff1a;Object.freeze()&#xff1a; 块级作用域&#xff1a; 块级作用域指由 {} 包围的代码块&#xff08;如 if、for、while、单独代码块等&#xff09;形成的独立作用…...

PySpark中mapPartitionsWithIndex等map类算子生成器函数问题 - return\yield

PySpark中mapPartitionsWithIndex等map类算子生成器函数问题 - return\yield 顾名思义&#xff0c;本文讲述了map算子生成器函数的相关问题——return 和 yield的使用。 首先先讲结论&#xff0c;在使用map等迭代生成的算子时最好使用yield。 1、问题产生 在写代码的过程中&…...

网络原理 初识[Java EE]

目录 网络发展史 独立模式 网络互联 局域网 LAN 1. 基于网络直连 2. 基于集线器(Hub)组建 3. 基于交换机(Switch)组建 4. 基于交换机和路由器(Router)组建 广域网 WAN 网络通信基础 IP 地址 1. 概念 2. 格式 端口号 1. 概念 2.格式 认识协议 1. 概念 2. 作用…...

Redis Stream基本使用及应用场景

一、概念 Redis Streams是Redis5.0提供的一种消息队列机制&#xff0c;支持多播的可持久化的消息队列&#xff0c;用户实现发布订阅的功能&#xff0c;借鉴了kafka设计。 二、常用命令 命令名称描述XADD key ID field value [field value ...]添加一条消息 key&#xff1a;St…...

amcl :odometry 到global frame 的转换

amcl - ROS Wiki amcl - ROS Wiki...

Ollama下载安装+本地部署DeepSeek+UI可视化+搭建个人知识库——详解!(Windows版本)

目录 1️⃣下载和安装Ollama 1. &#x1f947;官网下载安装包 2. &#x1f948;安装Ollama 3.&#x1f949;配置Ollama环境变量 4、&#x1f389;验证Ollama 2️⃣本地部署DeepSeek 1. 选择模型并下载 2. 验证和使用DeepSeek 3️⃣使用可视化工具 1. Chrome插件-Page …...

解决Value of type ‘AVCodecContext‘ has no member ‘channels‘ 的问题

在 FFmpeg 7.1 中,AVCodecContext 的 channels 和 channel_layout 字段已经被移除,取而代之的是 AVChannelLayout 结构。因此,代码需要进行调整以适应新的 API。 以下是如何正确设置 AVCodecContext 和 AVCodecParameters 的方法。 1. 问题分析 在 FFmpeg 7.1 中: AVCode…...

STM32内存五区及堆栈空间大小设置(启动文件浅析)

前言 嘿&#xff0c;朋友们&#xff01;今天咱们来聊聊STM32的内存五区和堆栈空间大小设置。这可是嵌入式开发里的“必修课”&#xff0c;要是没整明白&#xff0c;程序说不定就“翻车”了。别担心&#xff0c;我这就带你一步步搞懂这事儿&#xff0c;让你轻松上手&#xff0c…...

定义数组存储3部汽车对象(class2:类在class1中请看上一篇博客)

package test3; import java.util.Scanner; public class carTest {public static void main(String[] args){//创建一个数组car[] arrnew car[3];//2创建汽车对象&#xff0c;来源于输入Scanner sc new Scanner(System.in);for (int i 0; i <arr.length ; i) {car cnew ca…...