【libigl】Libigl_Tutorials -第三章(共6节)

2024-03-17 13:04
文章标签 第三章 tutorials libigl

本文主要是介绍【libigl】Libigl_Tutorials -第三章(共6节),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

5f4e2a8088c38114adb33309257d8542.jpeg

第 3 章:矩阵和线性代数

Libigl 严重依赖 Eigen 库来实现密集和稀疏线性代数例程。除了几何处理例程之外,libigl 还具有引导 Eigen 的线性代数例程,使其感觉更类似于 Matlab 等高级代数库。

 一、切片Slice

Matlab 中一个非常熟悉且功能强大的例程是数组切片。这允许读取或写入可能不连续的子矩阵。让我们考虑一下 Matlab 代码:

 
B = A(R,C);

如果 A 是 m×n�×� 矩阵,并且 R 是 j� 行索引长列表(介于 1 和 m� 是一个 k� 长列索引列表,那么结果 B 将是 j×k�×� 根据 R 和 C 从 A 绘制元素的矩阵。在 libigl 中, slice 函数提供了相同的功能(示例 301):

 
VectorXi R,C;
MatrixXd A,B;
...
igl::slice(A,R,C,B);

请注意, A 和 B 也可以是稀疏矩阵。

同样,考虑 Matlab 代码:

 
A(R,C) = B;

现在,选择位于左侧,因此 j×k�×� 矩阵 B 被写入由 R 子矩阵中> 和 C 。 libigl 中使用 slice_into 提供了此功能:

igl::slice_into(B,R,C,A);

b64f3fc1965d9b1529d3353342a5df0b.png

示例 Slice 展示了如何使用 igl::slice 更改网格上三角形的颜色。

# include <igl/floor.h>
# include <igl/readOFF.h>
# include <igl/find.h>
# include <igl/opengl/glfw/Viewer.h>
# include <iostream>// 主函数入口
int main(int argc, char *argv[])
{using namespace Eigen; // 使用Eigen命名空间using namespace std; // 使用标准库命名空间MatrixXd V; // 定义顶点坐标矩阵VMatrixXi F; // 定义面索引矩阵Figl::readOFF(TUTORIAL_SHARED_PATH "/decimated-knight.off",V,F); // 读取OFF格式的模型文件// 100个随机索引,指向F的行VectorXi I; // 利用随机数生成索引Iigl::floor((0.5*(VectorXd::Random(100,1).array()+1.)*F.rows()).eval(),I); // 50个随机索引,指向I的行VectorXi J;// 利用随机数生成索引Jigl::floor((0.5*(VectorXd::Random(50,1).array()+1.)*I.rows()).eval(),J);VectorXi K = I(J); // 根据索引J取出I中对应的元素,存放到K中// 该行代码被注释掉,因为I(J)已经完成了相应的工作,不再需要这个函数// 所有面默认为绿色MatrixXd C = RowVector3d(0.4,0.8,0.3).replicate(F.rows(),1); // 生成F行数相同的绿色矩阵// 红色用于标记K中的每一个索引MatrixXd R = RowVector3d(1.0,0.3,0.3).replicate(K.rows(),1); // 生成K行数相同的红色矩阵// 将C矩阵中K指定的行替换为红色RC(K,Eigen::all) = R;// 该行代码被注释掉,因为上一行代码已经完成了相应的工作,不再需要这个函数// 随机化颜色数组,其中25%的几率为trueEigen::Array<bool,Eigen::Dynamic,1> W = Eigen::VectorXd::Random(F.rows()).array()>0.5;// 将1/4的颜色设置为蓝色MatrixXd B = RowVector3d(0.3,0.3,1.0).replicate(W.count(),1); // 生成W中true计数相同的蓝色矩阵// 将C矩阵中W标记为true的行替换为蓝色BC(igl::find(W),Eigen::all) = B;// 使用伪彩色绘制网格igl::opengl::glfw::Viewer viewer; // 创建一个Viewer实例viewer.data().set_mesh(V, F); // 将顶点坐标和面索引传递给viewerviewer.data().set_colors(C); // 将颜色矩阵传递给viewerviewer.launch(); // 启动viewer窗口
}

以上代码是使用libigl库的示例,通过以下步骤来显示带有伪彩色的3D模型网格:

  1. 读取OFF格式的3D模型文件,并且分别存储顶点坐标到矩阵V和面索引到矩阵F。

  2. 生成100个随机的索引I,指向面矩阵F的行。

  3. 从上述I中再随机取出50个索引J。

  4. K为J在I中对应的元素,即最终确定的面索引集合。

  5. 初始化颜色矩阵C,默认为绿色,然后将K索引指向的对应行设置为红色。

  6. 通过随机选择一半的面,并将这些面的颜色设置为蓝色。

  7. 创建视图窗口,并设置网格与颜色数据,最终启动窗口展示结果。

总之,这段代码演示了如何用libigl库加载一个3D模型,给它应用随机颜色,并在窗口中渲染出来。

b19626d9ea9bfcbb97921c0ac0a511d4.png

Eigen::Array<bool,Eigen::Dynamic,1> W = Eigen::VectorXd::Random(F.rows()).array()>0.5;

7eacb07ef798a543e6298d4b35939260.png

二、 Sort 排序

8f16834c1118f43428ddaad49b8cedc5.png

这段代码的作用是使用libigl的功能来加载和显示一个三维网格模型,并为

网格顶点生成伪彩色。这基于每个顶点对应的质心的排序,具体步骤如下:

这篇关于【libigl】Libigl_Tutorials -第三章(共6节)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819031

相关文章

第三章 UML类图简介(设计模式笔记)

第三章 UML类图简介 3.1类 3.2接口 名字层必须有<> 3.3 泛化(继承)关系 箭头终点端指向父类(空心三角形) 3.4 关联(组合1)关系 B类是A类的成员变量 ,称A关联B。 箭头终点端指向B 3.5 依赖(组合2)关系 B类是A类的某个方法的参数 ,称A依赖B。 箭头终点端指向B(虚线) 3.6 实现关系 箭头终点端指向接口(虚线,空心

统计学(贾俊平)学习笔记--第三章、 数据预处理

数据预处理无论是从数据分类分析、数据信息抽取、数据挖掘、模型建立等方面都是需要的,也是数据工作者最开始招手做的,而统计学(贾俊平)中从理论的角度讲解了数据预处理的概念和方法吗,在此将主要要点列举如下,供有心人参考学些。       数据的预处理是在对数据分类或分组之前所做的必要处理,内容包括数据的审核、筛选、排序等。          审核就是检查数据中是否有错误。从完整性和准

第三章 《栖息地》

在第一款商业化的MUD《凯斯迈之岛》正式运营的同一年,世界上第一款包月计费的网络游戏也诞生了。那一年里,马克·雅各布斯(Mark Jacobs)的AUSI公司推出了文本MUD游戏《阿拉达斯》(Aradath),他将服务器架设在了自己的家中,并安装了8条电话线来为玩家提供接入服务,想要玩这款游戏的玩家每月需要向AUSI支付40美元——这就是最早的包月形式。在后面的故事里,马

React第三章(tsx语法入门 )

tsx语法入门 FAQ tsx跟jsx有什么区别 答: 基本没有没有区别只是在jsx语法上增加了类型。 jsx是什么? 答:jsx是js的语法扩展,允许在js中编写html代码。 例如:const fn = () => <div>小满是谁?没听说过</div> 语法编写 使用tsx绑定变量{value} 绑定class需要用className function App()

【操作系统原理】第三章——进程线程模型(上)

目录 一、多道程序设计 1.1程序顺序执行 1.2多道程序设计 1.3程序的并发执行 二、进程的基本概念 2.1进程的概念 2.2进程的特性 2.3进程优先级 三、进程状态的转换 3.1三状态进程模型 3.2五状态进程模型 3.3七状态进程模型 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。

第三章 需求工程简记

第三章  需求工程 软件需求的定义: (1)用户解决问题或达到目标所需条件或能力。  (2)系统或系统部件要满足合同、标准、规范或其它正式规定文档所需具有的条件或权能。  (3)一种反映上面(1)或(2)所述条件或权能的文档说明。 软件需求包括三个不同的层次:业务需求、用户需求和功能需求—也包括非功能需求。 1.业务需求( business re

第三章 多层次的存储器笔记简记

第三章 多层次的存储器 1.存储器的分类 存储器分类标准: (1)存储介质:半导体存储器和磁表面存储器;(按存储介质) (2)存取方式:随机存储器和顺序存储器;(按存取方式) (3)存储内容可变性:只读存储器和随机读写存储器;(按读写功能) (4)信息易失性:易失性存储器和非易失性存储器;(按信息的可保存性) (5)系统中的作用:可分为内部存储器和外

linux c++ 通信架构 笔记(11) 第三章 Nginx 开发初步:操作信号集的 6 个函数,

(71) 操作信号量的几个函数的定义,先 sigemptyset ( ) ,这些函数在 linux 0.11 已经存在,只是信号位图的大小变化了 : ++ sigfillset () : ++ sigaddset() 与 sigdelset() : ++ sigprocmask() : ++ sigismember( ) : (72) 补充下 linux 0.12 里

第三章 数组(5)

3.5 数组排序算法         对数据进行升序或降序排列是日常工作中经常遇到的需求,这就要求开发者必须掌握基本的数据排序算法,本节将介绍冒泡排序、选择排序和Arrays类提供的排序方法。         3.5.1 冒泡排序         冒泡排序是最常用的数组排序算法之一,它排序数组元素的过程通常按照“小数往前放,大数往后放”这样类似水中气泡往上升的动作,所以称作冒泡排序。它以简洁

《西瓜书》第三章 线性模型 手写版笔记

《西瓜书》第三章 线性模型 手写版笔记 文章目录 《西瓜书》第三章 线性模型 手写版笔记3.0 知识点总览3.1 线性回归(Linear Regression)求解的推导过程3.1.1 单变量线性回归3.1.2 多变量线性回归3.1.3 对数线性回归 3.2 逻辑回归(Logistic Regression)3.3 线性判别(LDA)3.4 多分类学习的拆分策略3.5 处理类别不平衡问题三