PKU 可视计算概论 Lab2作业

前言

这里是接上一次Lab1的第二次作业,本次作业的主题是集合处理,难度比上次一次大很多,很多边缘的计算方式也需要我们实现,该Lab我的感觉在于难度不在于理论实现,在于如何如何能理解那些吊诡的API接口,只能说看懂别人写的东西是在太困难了,这里必须吐槽一下OpenGL Mathematics(GLM)库的矩阵乘法,实在太令人难以理解了,如果大家以后要使用一定要好好地读一读是怎么用的,否则过于匪夷所思。

其次就算一定要记得初始化变量!!!否则你的点会到处乱飞,很难调试。

一、介绍

本次Lab的主题为几何处理(Geometry Processing),具体分为5个部分,分别需要你实现5个函数,来实现:

  1. 几何表示中的Loop Mesh Subdivision算法。
  2. 几何表示中的 Spring-Mass Mesh Parameterization 算法 。
  3. 几何处理中的 Mesh Simplification 算法。
  4. 几何处理中的 Mesh Smoothing 算法。
  5. 几何重建中的 Marching Cubes 算法。

下面就五个函数来介绍。

二、具体函数

1.Loop Mesh Subdivision算法

三角网格细分算法,可以理解为对于原本粗略图形的一个加细,或者感觉可以理解为对在测量点不足的情况下的一个下位替代?总之意思就是,从视觉效果而言,随着迭代次数的增加,图形的棱角会越来越圆润,会更加平滑;从具体的几何表示而言,通过观察其框架可以发现,随着迭代次数的增加,其框架明显更加密集——这也是与其具体操作一致的。

算法的思路就是对原本三角形面进行分割,在每个边上产生新的点,从而将原本的一个三角形表示的区域变为由4个三角形表示。这也就好理解为什么看其网格越来越密了。

最后的效果如图:
在这里插入图片描述

2.Spring-Mass Mesh Parameterization算法

该算法为基于弹簧质点的三角网格参数化算法,可以大致理解为先将许多点映射到一个规则图形中(比如圆或者正方形之类的,我这里用的是圆),具体的映射方式是先将边界点均匀映射到圆的边界,然后内部的点通过构建弹簧质点的方程组,求解该方程组就可以求解出每一个点映射后的位置。

这里求解方程的方法采用了Jacobi迭代法,不断逼近。

最终效果如图:
在这里插入图片描述
这里有两点不足:

  1. 运行效率相较于助教的视频缓慢得多。
  2. 感觉色块分布的不是很均匀?而且边界不好看,感觉有可能是进行参数化的过程中,映射有点问题,应该改进映射方式。

3.Mesh Simplification算法

这是一个网格简化算法,其原理是采用了Quadric Error Metrics,具体流程是不断选取最小Error的点对合并,以此类推。

这里需要注意的是对于平面方程的解法。

具体结果如下:
在这里插入图片描述

4.Mesh Smoothing算法

这里采取的是Laplacian Smoothing算法,其中有两种化简形式,一种是直接取平均值,另一种是算cot,这里对于边界的情况,我是算了两遍同一个点。

其他的比较简单。

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

5.Marching Cubes算法

这里的话就是历遍每一个块,看看在哪,再就是有些相同位置的点可以在output.Position中反复存储,这样会节省查找Indices的代码量,虽然这样会浪费空间。

每一个块中,边界上点采取插值的方式求解。

最后结果如下:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值