QEM网格简化算法学习

news2024/10/6 22:46:06

《Surface Simplification Using Quadric Error Metrics》这篇论文介绍了一种网格简化的算法,通过“edge contraction”(边收缩)的方法来简化网格。边收缩的结果就是将两个顶点合成一个顶点,因此可以按照任意的顶点数目去简化网格。

image-20230908190941719

假设有一个二次函数 Δ ( v ) = v T Q v \Delta(\mathbf{v})=\mathbf{v}^T\mathbf{Q}\mathbf{v} Δ(v)=vTQv 可以描述顶点 v \mathbf{v} v的“变形程度”,这篇论文的算法目的就是最小化总体的“变形程度”,即:
minimize ∑ v v T Q v \text{minimize} \quad \sum_{\mathbf{v}} \mathbf{v}^T\mathbf{Q}\mathbf{v} minimizevvTQv
但是由于直接最小化不太现实,因为顶点数目会发生改变,所以这篇论文的算法步骤是这样的:

  1. 对每个顶点计算其初始的 Q \mathbf{Q} Q,满足 v T Q v = 0 \mathbf{v}^T\mathbf{Q}\mathbf{v}=0 vTQv=0
  2. 保存所有合法的“点对”,包括所有的边对应的点对,以及距离小于一定阈值的顶点对;
  3. 对于每个合法的点对( v 1 , v 2 \mathbf{v}_1,\mathbf{v}_2 v1,v2),生成合成的顶点 v s \mathbf{v}_s vs,这一步边收缩的代价为 Δ ( v s ) = v s T ( Q 1 + Q 2 ) v s \Delta(\mathbf{v}_s)=\mathbf{v}_s^T(\mathbf{Q}_1+\mathbf{Q}_2)\mathbf{v}_s Δ(vs)=vsT(Q1+Q2)vs,也就是新顶点的“变形程度”。这里合成顶点的方法有很多,可以是中点、其中一个顶点、或者最小化 Δ ( v s ) \Delta(\mathbf{v}_s) Δ(vs) 对应的顶点位置;
  4. 重复选择 Δ ( v s ) \Delta(\mathbf{v}_s) Δ(vs) 最小的顶点对进行边收缩,然后更新mesh、相关顶点的 Q \mathbf{Q} Q、以及相关合成顶点的代价,直到目标顶点数目。可以用一定的数据结构来维护。

接下来我用我的理解来描述这个二次误差函数 Δ ( v ) = v T Q v \Delta(\mathbf{v})=\mathbf{v}^T\mathbf{Q}\mathbf{v} Δ(v)=vTQv 的构造过程:

首先我们用一种启发式的思想去思考,要如何度量一个mesh的微小变形的程度呢?

image-20230908192054364

假如只有一个平面三角形,当它的一个顶点A有一个微小的偏移时,这个顶点相对于对边BC的距离h也会发生变化,因此可以用h来度量点A的“变形程度”,亦即
Δ ( A ) = h 。 \Delta(A)=h 。 Δ(A)=h
也许当A的位移平行于BC时,用h无法表示这样的变形,但是这只是一种思想,既考虑了简洁性,也考虑了在实际变形中大概率不会有这种特殊的变形。

类比到空间中的一个三角网格(triangular mesh),当一个顶点 v \mathbf{v} v发生轻微变形时,我们用点到面的距离去度量其“变形程度”,顶点已经给出了,那么“面”有哪些呢?我们先假定每个顶点都保存了一些用于度量的面 planes ( v ) \text{planes}(\mathbf{v}) planes(v),在这种情况下,顶点 v = [ v x , v y , v z , 1 ] T \mathbf{v}=[v_x,v_y,v_z,1]^T v=[vx,vy,vz,1]T 的“变形程度”的度量可以写作
Δ ( v ) = ∑ p ∈ planes ( v ) ( p T v ) 2 , \Delta(\mathbf{v})=\sum_{\mathbf{p}\in\text{planes}(\mathbf{v})} (\mathbf{p}^T \mathbf{v})^2 , Δ(v)=pplanes(v)(pTv)2,
其中 p = [ a , b , c , d ] T \mathbf{p}=[a,b,c,d]^T p=[a,b,c,d]T表示平面 a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0,其中 a 2 + b 2 + c 2 = 1 a^2+b^2+c^2=1 a2+b2+c2=1,这个单位化的限制就是告诉我们平面 p \mathbf{p} p的法向量就是 ( a , b , c ) (a,b,c) (a,b,c),因此点到面的距离就是 p T v \mathbf{p}^T\mathbf{v} pTv ,高中时不是学过点到平面的距离公式吗,单位化后就不需要分母的那个法向量长度了。

现在回到"edge contraction",在边收缩前我们有两个顶点 v 1 \mathbf{v}_1 v1 v 2 \mathbf{v}_2 v2,收缩完之后变成了一个顶点 v s \mathbf{v}_s vs,而与 v s \mathbf{v}_s vs关联的面的集合就变成了 planes ( v s ) = planes ( v 1 ) ⋃ planes ( v 2 ) \text{planes}(\mathbf{v}_s)=\text{planes}(\mathbf{v}_1) \bigcup \text{planes}(\mathbf{v}_2) planes(vs)=planes(v1)planes(v2) ,用集合的表示形式不太方便,因此我们写成矩阵的形式:
Δ ( v ) = ∑ ( p T v ) 2 = v T ( ∑ p p T ) v = v T ( ∑ Q i ) v \Delta(\mathbf{v})=\sum (\mathbf{p}^T \mathbf{v})^2 = \mathbf{v}^T (\sum\mathbf{p}\mathbf{p}^T) \mathbf{v} = \mathbf{v}^T (\sum\mathbf{Q_i}) \mathbf{v} Δ(v)=(pTv)2=vT(ppT)v=vT(Qi)v
就对应上之前算法里说的“变形程度”的度量公式了。所以前面讲到的保存每个顶点关联的面的集合,实际上就是保存这些面对应的矩阵之和,而边收缩的过程中,新的顶点需要保存的,就是旧的两个顶点保存的矩阵之和。

因此在算法中每个顶点保存的 Q \mathbf{Q} Q,初始化时就是将每个顶点相邻的面作为其关联的面,然后计算 Q \mathbf{Q} Q,在后续做边收缩时,只需要将收缩的两个顶点的 Q \mathbf{Q} Q相加即可。

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

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

相关文章

2023国赛C题解题思路代码及图表:蔬菜类商品的自动定价与补货决策

2023国赛C题:蔬菜类商品的自动定价与补货决策 C题表面上看上去似乎很简单,实际上23题非常的难,编程难度非常的大,第二题它是一个典型的动态规划加仿真题目,我们首先要计算出销量与销售价格,批发价格之间的…

MySQL的概述、版本、安装过程

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、MySQL的概述 二、MySQL的版本 三、MySQL的下载与安装 前言 本文将来谈谈MySQL的概述,MySQL的版本,以及它…

浙大MBA提面苏州/上海批周末申请截止:仅剩杭州第五批可选

9月10日一过,2024年浙大MBA提前批面试将正式迎来最后一批申请!还没开始申请的伙伴要抓紧时间了,按照惯例,最后一批一般在时间节奏上都是最为紧张的! 回顾今年的提前批面试申请历程,虽然在总体人数上…

企业内训课程、在线教育平台付费课程加密防下载的10种方式

企业内训课程、在线教育平台付费课程加密防下载的10种方式: 实例演示:课程视频-第1课状语从句,VRM演示应用 企业内训课程、在线教育平台付费课程,他们的这种视频课程的加密是如何做的?整理了10种思路,供大家参考&…

山西电力市场日前价格预测【2023-09-09】

日前价格预测 预测明日(2023-09-09)山西电力市场全天平均日前电价为372.85元/MWh。其中,最高日前电价为435.72元/MWh,预计出现在18: 45。最低日前电价为342.46元/MWh,预计出现在04: 00。 价差方向预测 1: 实…

UMA 2 - Unity Multipurpose Avatar☀️二.概念介绍

文章目录 🟥 UMA核心🟧 UMA Data 数据类1️⃣ DNA2️⃣ Slots 插槽Overlays 纹理贴图🟨 Base Recipe 基础人形Recipes🟩 Wardrobe Recipes 服饰Recipes🟥 UMA核心 UMA核心组件是 DynamicCharacterAvatar ,后续我们跟插件交互的API,例如捏脸的参数,都是与之交互完成的…

element-ui switch开关组件二次封装,添加loading效果,点击时调用接口后改变状态

先看效果: element-ui中的switch开关无loading属性(在element-plus时加入了),而且点击时开关状态就会切换,这使得在需要调用接口后再改变开关状态变得比较麻烦。 思路:switch开关外包一层div,给…

SAP FI/SD的集成-VKOA科目确定

前言 一、组成部分 二、使用步骤 1.VKOA确定收入科目 1.1定义物料科目分配组 1.2定义客户科目分配组 2.V/08定价过程 3. 库存成本Inventory的自动记账科目配置-OBYC 总结 前言 财务和销售集成的点,也是各种SAP顾问经常遇到的面试问题,实际工作中也会经常…

雅思 《九分达人》阅读练习(二)

目录 雅思阅读练习 《九分达人》test3 paragraph3 1.单词含义要记准确,敏感度要上来。 2.找准定位,之后理解句子大致含义。 说说关于判断题的做题方法 关于“承认”有哪些单词 同替词汇 think 可以用什么其他单词来替换 单词 一些疑问 I have…

项目实战:ES的增加数据和查询数据

文章目录 背景在ES中增加数据新建索引删除索引 在ES中查询数据查询数据总数量 项目具体使用(实战)引入依赖方式一:使用配置类连接对应的es服务器创建配置类编写业务逻辑----根据关键字查询相关的聊天内容在ES中插入数据 总结提升 背景 最近需…

每日一题(设计循环队列)

每日一题(设计循环队列) 622. 设计循环队列 - 力扣(LeetCode) 1.题意解读 本题只能为队列开辟k个单位空间,并且只能利用这几个空间进行数据的存储。 思路:本题使用数组来实现队列是比较方便的&#xff0c…

Unity WebView 中文输入支持

WebView 中文输入支持 🥪效果展示🍱原理 🥪效果展示 💡使用版本为4.4; 💡测试环境:unity editor 2022.3.15f1c1、Windows; 🍱原理 提取页面激活的输入框,…

代码随想录第29天 | ● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果

1005.K次取反后最大化的数组和 var largestSumAfterKNegations function(nums, k) {while(k>0){nums.sort((a,b)>a-b);nums[0]-nums[0];k--}return nums.reduce((prev, cur)>prevcur,0) };第一想法 每次换最小的那个数,负数换正数,正数换负数…

python+vue+django九价疫苗预约系统

疫苗预约的效率,取代人工管理是必然趋势。 本九价疫苗预约系统以Django作为框架,B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块:用户、医生、医院、九价疫苗、疫苗预约、系统管理等模块,通过这些模块的实现能…

三门问题讨论

三门问题讨论 三门问题第一种第二种 三门问题 三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提霍尔(Monty Hall&…

二分查找 - 二分答案

第四部分 二分答案 最小值最大(或最大值最小)问题,二分答案区间,配合贪心、DP 等其他算法检验这个答案是否合理,最优化问题转换为 判定性问题。 「二分」的本质是二段性,并非单调性。说白了就是答案在一个区间,二分区间,直到找到最优答案。 TreeSet 的方法: E floor​…

Zstack 安装 黑群晖未找到硬盘:解决方法

错误原因: 发生错误的原因,黑群晖要求硬盘为Sata格式,而默认创建的硬盘格式为Virtio,我们要做的就是修改挂载的虚拟硬盘改为Sata格式 解决方法: 1、进入 ZStack,找到黑群晖的主机,查看 UUID …

BUUCTF刷题十一道(08)

文章目录 [HITCON 2017]SSRFme[b01lers2020]Welcome to Earth[CISCN2019 总决赛 Day2 Web1]Easyweb[SWPUCTF 2018]SimplePHP[NCTF2019]SQLi[网鼎杯 2018]Comment[NPUCTF2020]ezinclude[HarekazeCTF2019]encode_and_encode[CISCN2019 华东南赛区]Double Secret[网鼎杯2018]Unfin…

离谱至极!“核弹显卡”?!!

ProgrammeLL,启动! 背景 2011年,英伟达发布了GTX590显卡,由于发热和功耗大,发生过多起因超频而电容爆炸事件。 介绍表 芯片厂商NVIDIA显卡芯片Ge Force GTX 590核心代号GF110核心频率607MHzCUDA核心512个显存频率341…

多线程快速入门

线程与进程区别 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里…