[OpenGL] 网格细分算法 Loop Subdivision - 附我的实现结果

【更新】 我的新博客:www.ryuzhihao.cc,当然这个CSDN也会更新。

               本文在新博客的链接:点击打开链接

时间:2017年8月25日

一、写在前面

      这篇blog可能算是大三结束之前写完的最后一篇博客了,哈哈哈。还有几天就开学成为大四,想到将要结束的大学生活,和即将到来的硕士生涯,真的充满了期待。最近开学提前返校,做了一些自己的研究工作,其中有一个步骤,就是对模型网格的细分(subdivision)

      本文采用Loop Subdivision算法实现网格细分。但是相关中文资料实在太少……,而且内容含糊,因此非常建议阅读Charles Loop在1987年提出Loop细分算法时的那篇论文原文:《Smooth subdivision surfaces based on triangles》。Notice that this paper is the master's thesis writen by C.Loop. 论文链接在博客的第三章节

      在文章开始之前,还是先贴一下我的实现结果。


二、我的实现结果:

     平台:C++、OpenGL 4.3+

【测试结果1】 对立方体的细分

      以下四张图片分别是立方体的原始模型、细分1次、细分2次、细分5次的结果。

 

 


【测试结果2】对Stanford Bunny的细分

    下图分别为Bunny的原始模型、细分2次的结果。

                   

                   


三、Loop细分算法原理及实现步骤

1、关于Loop Subdivision

      wiki中提到Loop细分算法的一个简单定义:“In computer graphics, Loop Subdivision Surface is an approximating subdivision scheme for triangular meshes.”

      Loop算法是一种面向三角网格的细分策略。细分过程包括2步:生成边点移动原有顶点,最终生成切平面连续的光滑表面。在生成边点的过程中,将1个三角形划分为4个三角形,如下图所示:


                                           

2、Loop算法的细分过程

[1] 生成边点(E-顶点)按照下述的策略在原有三角形的边上新增一个点(即边点,E-顶点),将原有三角形1分为4。

      [1.1] 生成网格内部E-顶点:

                                                

        网格内部某条边的两个端点为v0、v1,共享这条边的两个三角形的面是(v0,v1,v2)和(v0,v1,v3),那么新生成的边点为:

                                      

         

       [1.2] 生成网格边界E-顶点

                      

        网格边界E-顶点和网格内部E-顶点的区别就是,这条边位于模型的边界,只属于一个三角形,没有第二个三角形共享这条边。设这条边的两个端点为v0,v1,则新增加的顶点位置v为:

                  v = 1/2*(v0+v1);


[2] 移动原有顶点(V-顶点):

      [2.1] 移动网格内部V-顶点:

                                 

        假设原有的内部顶点为v0,相邻顶点为v1,v2,v3,v4.......vn,那么移动后的v0的坐标v为:

               

         本质是顶点本身与相邻顶点的加权和,它本身的权值为(1-nβ),其邻接点的权值为β。这里权值β通过下式计算得到:

               

       [2.2]  移动网格边界V-顶点:

                

          设网格边界顶点v0的两个相邻点为v1,v2,则更新后的顶点位置为: v=3/4*v0+1/8*v1+1/8+v2。


网格化的效果如下所示:

            

            

           


四、参考文献:

      [1] Smooth subdivision surfaces based on triangles Charles Loop' master paper

      [2] Exact Evaluation of Subdivision Surfaces ACM SIGGRAPH 1998 Jos Stam

### 部署 Stable Diffusion 的准备工作 为了成功部署 Stable Diffusion,在本地环境中需完成几个关键准备事项。确保安装了 Python 和 Git 工具,因为这些对于获取源码和管理依赖项至关重要。 #### 安装必要的软件包和支持库 建议创建一个新的虚拟环境来隔离项目的依赖关系。这可以通过 Anaconda 或者 venv 实现: ```bash conda create -n sd python=3.9 conda activate sd ``` 或者使用 `venv`: ```bash python -m venv sd-env source sd-env/bin/activate # Unix or macOS sd-env\Scripts\activate # Windows ``` ### 下载预训练模型 Stable Diffusion 要求有预先训练好的模型权重文件以便能够正常工作。可以从官方资源或者其他可信赖的地方获得这些权重文件[^2]。 ### 获取并配置项目代码 接着要做的就是把最新的 Stable Diffusion WebUI 版本拉取下来。在命令行工具里执行如下指令可以实现这一点;这里假设目标路径为桌面下的特定位置[^3]: ```bash git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git ~/Desktop/stable-diffusion-webui cd ~/Desktop/stable-diffusion-webui ``` ### 设置 GPU 支持 (如果适用) 当打算利用 NVIDIA 显卡加速推理速度时,则需要确认 PyTorch 及 CUDA 是否已经正确设置好。下面这段简单的测试脚本可以帮助验证这一情况[^4]: ```python import torch print(f"Torch version: {torch.__version__}") if torch.cuda.is_available(): print("CUDA is available!") else: print("No CUDA detected.") ``` 一旦上述步骤都顺利完成之后,就可以按照具体文档中的指导进一步操作,比如调整参数、启动服务端口等等。整个过程中遇到任何疑问都可以查阅相关资料或社区支持寻求帮助。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值