当前位置: 首页 >  网站大师 >  网格优化Remesh——Tangential Smooth

网格优化Remesh——Tangential Smooth

导读:一、Laplace平滑.简单的拉普拉斯平滑算法的原理是将每个顶点都移动到相邻顶点的平均位置,即采用所谓伞状算子:.在伞状结构中表示这样的过程如下图:.拉普拉斯平滑算法有很多进一步的变形,首先在求取平均位置时,可以采用不同的加权策略,例如对不同的邻接点采用不同的权值。一般来说,距离

一、Laplace平滑

简单的拉普拉斯平滑算法的原理是将每个顶点都移动到相邻顶点的平均位置,即采用所谓伞状算子:

在伞状结构中表示这样的过程如下图:

拉普拉斯平滑算法有很多进一步的变形,首先在求取平均位置时,可以采用不同的加权策略,例如对不同的邻接点采用不同的权值。一般来说,距离中心点P较远的邻接点,我们可以让他对P平滑后的位置影响小一点。这样就可以采用一种距离的倒数为权值的拉普拉斯平滑。

有时为了控制平滑的速率,也会引入参数lambda来控制平滑的速率,即从原来所执行的:

转变成同时,平滑算法往往可以反复对Mesh执行,使得Mesh越来越光顺,迭代次数T也是平滑算法中重要的参数。

二、切向Laplace平滑

右边图中的第三幅,代表reproject的效果,需要额外实现(比如用AABBtree等),在公式中没有体现。

另一种写法:

区别在于(I - ni . ni.T),还有正负号

三、改进的切向Laplace平滑(基于面积的切向Laplace平滑)

首先计算gi:

然后用以下公式将gi被投影会pi的切面:

其中ni是pi的法向,λ是阻尼系数用来防止震荡。

一些Voronoi面积大的节点拥有更大的重力,所以吸引了其它节点,因此减小了他们自身的面积。一般通过<20次迭代,面积方差可以减小5倍,最终产生一个每个节点面积大致相同的网格,如下图所示。

代码:

Eigen::Vector3d tangential_smooth(const Tuple& t)
{
    auto one_ring_tris = get_one_ring_tris_for_vertex(t);
    if (one_ring_tris.size() < 2) return vertex_attrs[t.vid(*this)].pos;
    Eigen::Vector3d after_smooth = smooth(t);  // 计算了普通Laplace平滑后的点位置
    // get normal and area of each face
    auto area = [](auto& m, auto& verts) {
        return ((m.vertex_attrs[verts[0].vid(m)].pos - m.vertex_attrs[verts[2].vid(m)].pos)
                    .cross(
                        m.vertex_attrs[verts[1].vid(m)].pos - m.vertex_attrs[verts[2].vid(m)].pos))
                   .norm() /
               2.0;
    };
    auto normal = [](auto& m, auto& verts) {
        return ((m.vertex_attrs[verts[0].vid(m)].pos - m.vertex_attrs[verts[2].vid(m)].pos)
                    .cross(
                        m.vertex_attrs[verts[1].vid(m)].pos - m.vertex_attrs[verts[2].vid(m)].pos))
            .normalized();
    };
    auto w0 = 0.0;
    Eigen::Vector3d n0(0.0, 0.0, 0.0);
    for (auto& e : one_ring_tris) {
        auto verts = oriented_tri_vertices(e);
        w0 += area(*this, verts);
        n0 += area(*this, verts) * normal(*this, verts);
    }
    n0 /= w0;
    if (n0.norm() < 1e-10) return vertex_attrs[t.vid(*this)].pos;
    n0 = n0.normalized();
    after_smooth += n0 * n0.transpose() * (vertex_attrs[t.vid(*this)].pos - after_smooth);
    assert(check_mesh_connectivity_validity());
    return after_smooth;
}

四、非流形网格的平滑

对于non-manifold网格,上面的公式是否还适用,有待调研。

参考文献:

sgp04 M. Botsch and L. Kobbelt / Remeshing for Multiresolution Modeling

Polygon mesh processing (Botsch M., et al.) Chapter6 Section 6.5 Triangle- based Remeshing

内容
  • Qt-FFmpeg开发-打开本地摄像头录制视频(7)
    Qt-FFmpeg开发-打开本地
    2023-12-05
    音视频/FFmpeg #Qt.Qt-FFmpeg开发-打开本地摄像头录制视频【软解码+ OpenGL显示YUV】.目录.
  • 一种新的告警收敛方式“先知预警”,为您的系统健康护航
    一种新的告警收敛方式“先知预警”
    2023-12-08
    前言.简介.买基金,上京东.基金交易系统是用户使用京东金融APP进行基金交易的核心支撑系统,每天有数十亿元的交易额。.在
  • 4.10 x64dbg 反汇编功能的封装
    4.10 x64dbg 反汇编功
    2023-12-06
    LyScript.插件提供的反汇编系列函数虽然能够实现基本的反汇编功能,但在实际使用中,可能会遇到一些更为复杂的需求,此
  • 如何在unity中手写一个四叉树地形lod系统(二)
    如何在unity中手写一个四叉树
    2023-12-07
    在根据四叉树节点创建了1365个地形分块网格并保存到本地后,我们接下来要在游戏运行的过程中动态地显示所需的网格,这是最关
  • windows 网络模拟工具分享
    windows 网络模拟工具分享
    2023-12-02
    【下载地址】.Releases · jagt/clumsy · GitHub.【介绍】.无需安装.无需篡改和代理.系统级
  • 常用的 http 状态码有哪些?
    常用的 http 状态码有哪些?
    2023-12-08
    在我们进行网页,网址的访问过程中,http,https.都是我们主要使用到的协议,在使用这协议的时候,对于他的协助状态,