• 【CGAL_网格处理】坐标变换


    官方手册阅读

    文档函数链接:CGAL 5.5 - Polygon Mesh Processing: Polygon Mesh Processing Reference

    transform()

    template<class Transformation , class PolygonMesh , class NamedParameters = parameters::Default_named_parameters>
    void CGAL::Polygon_mesh_processing::transform(const Transformation & 	transformation,
    											  PolygonMesh & 			mesh,
                                                  const NamedParameters & 	np = parameters::default_values() 
                                                 )		
    
    • 1
    • 2
    • 3
    • 4
    • 5

    包含头文件:#include

    函数实现功能:对PolygonMesh中的每个顶点进行坐标变换。

    ParametersDetails
    transformationthe transformation functor to apply to the points of mesh.
    meshthe PolygonMesh to transform.

    接下来分析一下参数类型:

    • Transformation: 一个functor,能够对Point_3进行运算。可以是CGAL::Aff_transformation_3
    • PolygonMesh:a model of VertexListGraph

    其中,图概念VertexListGraph是Boost里Graph概念的细化分支,添加了遍历图形中所有顶点的需求。通过查阅官方文档中CGAL and the Boost Graph Library部分,我们发现网格常用的Surface_mesh Class和Polyhedron Class在CGAL中均提供有部分特化,使其能成为图概念 BidirectionalGraph、VertexAndEdgeListGraph、AdjacencyMatrix 和 MutableFaceGraph 的模型。其中,VertexAndEdgeListGraph就包括VertexListGraph, EdgeListGraph

    接下来再研究一下另一个参数类型Aff_transformation_3

    Aff_transformation_3代表了三维空间下的仿射变换。其中使用数字类型 Kernel::RT (homogeneous齐次坐标系)或者 Kernel::FT(cartesian笛卡尔坐标系)来表示变换矩阵中的元素。

    构造示例
    • 平移
    Aff_transformation_3 (const Translation, const Vector_3< Kernel > &v)
    
    • 1

    其中Translation是标记类,代表平移操作(此外还有Rotation、Reflection、Scaling等)。v是平移向量。

    创建向Z方向平移的仿射变换。

    CGAL::Aff_transformation_3<Kernel>(CGAL::Translation(), Kernel::Vector_3(FT(0), FT(0), FT(1)))
    
    • 1
    • 缩放
    Aff_transformation_3 (const Scaling, const Kernel::RT &s, const Kernel::RT &hw=RT(1))
    
    • 1

    缩放大小计算 s / h w s/hw s/hw

    • 4x4矩阵构造
    template<typename Kernel >
    CGAL::Aff_transformation_3< Kernel >::Aff_transformation_3	(	const Kernel::RT & 	m00,
                                                                    const Kernel::RT & 	m01,
                                                                    const Kernel::RT & 	m02,
                                                                    const Kernel::RT & 	m03,
                                                                    const Kernel::RT & 	m10,
                                                                    const Kernel::RT & 	m11,
                                                                    const Kernel::RT & 	m12,
                                                                    const Kernel::RT & 	m13,
                                                                    const Kernel::RT & 	m20,
                                                                    const Kernel::RT & 	m21,
                                                                    const Kernel::RT & 	m22,
                                                                    const Kernel::RT & 	m23,
                                                                    const Kernel::RT & 	hw = RT(1) 
                                                                )	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    从如下矩阵
    ( m 00 m 01 m 02 m 03 m 10 m 11 m 12 m 13 m 20 m 21 m 22 m 23 0 0 0 h w ) \left(

    m00m01m02m03m10m11m12m13m20m21m22m23000hw" role="presentation" style="position: relative;">m00m01m02m03m10m11m12m13m20m21m22m23000hw
    \right) m00m10m200m01m11m210m02m12m220m03m13m23hw
    构造一个仿射变换。

    相关操作
    • Aff_transformation_3< Kernel > operator* (const Aff_transformation_3< Kernel > &s) const
      
      • 1

      重载了乘法运算符(*),可通过tran1 * tran2得到两个变换的组合变换。

    • Aff_transformation_3< Kernel > inverse () const
      
      • 1

      求逆变换。

    测试代码

    #include 
    #include 
    #include 
    #include 
    #include 
    using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
    using FT = typename Kernel::FT;
    using Point_3 = typename Kernel::Point_3;
    using Vector_3 = typename Kernel::Vector_3;
    using Polyhedron = CGAL::Polyhedron_3<Kernel>;
    using Mesh = CGAL::Surface_mesh<Point_3>;
    using Affine_transformation_3 = CGAL::Aff_transformation_3<Kernel>;
    namespace PMP = CGAL::Polygon_mesh_processing;
    int main() 
    {
        const std::string filepath = "meshes/blobby.off";
    
        Mesh mesh;
        CGAL::IO::read_OFF(filepath, mesh);
        Polyhedron polyhedron;
        CGAL::IO::read_OFF(filepath, polyhedron);
        CGAL::IO::write_STL("data/blobby.stl", polyhedron,
            CGAL::parameters::use_binary_mode(false));
    
        Affine_transformation_3 trans(FT(1), FT(0), FT(0), FT(0),
                                      FT(0), FT(1), FT(0), FT(0),
                                      FT(0), FT(0), FT(1), FT(1));
        PMP::transform(trans, polyhedron);
        CGAL::IO::write_STL("data/blobby_trans.stl", polyhedron,
            CGAL::parameters::use_binary_mode(false));
        return EXIT_SUCCESS;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    image-20220815104231530在这里插入图片描述

  • 相关阅读:
    AN基础工具——变形工具
    计算机毕业设计JavaNBA篮球资讯网(源码+系统+mysql数据库+lw文档)
    赠书 | 《认知控制》:我们的大脑如何完成任务?
    如何高效率的申请“公租房”----高并发内存池
    JavaScript 中常见的数据类型
    NO.396 旋转数组
    《Docker 容器化的艺术:深入理解容器技术》
    粒子特效-Xffect
    做一个像人的3d人物建模需要通过什么技术和怎样的资金达成?
    【C++】运算符重载的示例实现和应用
  • 原文地址:https://blog.csdn.net/qq_39784672/article/details/126342910