zoukankan      html  css  js  c++  java
  • 【OpenMesh】创建一个正方体

    原文出处: http://openmesh.org/Documentation/OpenMesh-Doc-Latest/tutorial.html
    这个例程演示了:

    • 如何声明MyMesh
    • 如何添加顶点和面到Mesh中
    • 如何使用IO函数写入网格数据

    每一个程序第一步都是定义MyMesh类型。OpenMesh支持常见的多边形网格(面由可变顶点数的多边形组成)以及特殊的三角网格(所有面都是三角形的)。在这个例子中我们希望构建一个六面的正方体,因此我们选择多边形网格。
    OpenMesh同样支持不同的网格内核,指定顶点、边和面是如何存储的(参考Mesh Kernels)。然而,存储器必须提供一个阵列接口。在这篇指南中我们使用提供的ArrayKernel。预先定义的TriMesh/PolyMesh和内核包含在OpenMesh/src/OpenMesh/Core/Mesh中,我们使用PolyMesh_ArrayKernelT。

    #include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
    typedef OpenMesh::PolyMesh_ArrayKernelT<> MyMesh;

    限制我们定义了MyMesh类型,我们只用添加8个顶点和6个四边形来构建一个正方体。使用add_vertex方法添加顶点。这个函数获取坐标值返回添加顶点的handle。我们保存所有的顶点到array中,我们需要这些顶点指定面。

    vhandle[0] = mesh.add_vertex(MyMesh::Point(-1, -1, 1));
    vhandle[1] = mesh.add_vertex(MyMesh::Point( 1, -1, 1));
    vhandle[2] = mesh.add_vertex(MyMesh::Point( 1, 1, 1));
    vhandle[3] = mesh.add_vertex(MyMesh::Point(-1, 1, 1));

    为了添加面到网格中,我们必须构建一个vector保存面的顶点的handle。这个vector当做add_face的参数被传入。下列的代码使用四个点创建一个面:

    std::vector<MyMesh::VertexHandle> face_vhandles;
    face_vhandles.clear();
    face_vhandles.push_back(vhandle[0]);
    face_vhandles.push_back(vhandle[1]);
    face_vhandles.push_back(vhandle[2]);
    face_vhandles.push_back(vhandle[3]);
    mesh.add_face(face_vhandles);

    面的方向由提供的点的方向来定义:如果你朝着多边形的前面看,这些点的方向是逆时针的。
    当创建完所有的面的时候,我们希望将网格结果写入标准输出中。OpenMesh提供基本的输入输出方法,定义在名字空间OpenMesh::IO:

    if ( !OpenMesh::IO::write_mesh(mesh, "output.off") )

    使用IO的函数首先应包含MeshIO.hh

    #include <OpenMesh/Core/IO/MeshIO.hh>
    #include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>

    完整的代码像这样:

    //=============================================================================
    // 
    // OpenMesh 
    // Copyright (C) 2001-2005 by Computer Graphics Group, RWTH Aachen 
    // www.openmesh.org 
    // 
    //-----------------------------------------------------------------------------
    // 
    // License 
    // 
    // This library is free software; you can redistribute it and/or modify it 
    // under the terms of the GNU Library General Public License as published 
    // by the Free Software Foundation, version 2. 
    // 
    // This library is distributed in the hope that it will be useful, but 
    // WITHOUT ANY WARRANTY; without even the implied warranty of 
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
    // Library General Public License for more details. 
    // 
    // You should have received a copy of the GNU Library General Public 
    // License along with this library; if not, write to the Free Software 
    // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
    // 
    //-----------------------------------------------------------------------------
    // 
    // $Revision: 83 $
    // $Date: 2009-02-27 17:31:45 +0100 (Fri, 27 Feb 2009) $
    // 
    //=============================================================================
    #include <iostream>
    // -------------------- OpenMesh
    #include <OpenMesh/Core/IO/MeshIO.hh>
    #include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
    // ----------------------------------------------------------------------------
    typedef OpenMesh::PolyMesh_ArrayKernelT<> MyMesh;
    // ----------------------------------------------------------------------------
    // Build a simple cube and write it to std::cout
    
    int main()
    {
    MyMesh mesh;
    // generate vertices
    MyMesh::VertexHandle vhandle[8];
    vhandle[0] = mesh.add_vertex(MyMesh::Point(-1, -1, 1));
    vhandle[1] = mesh.add_vertex(MyMesh::Point( 1, -1, 1));
    vhandle[2] = mesh.add_vertex(MyMesh::Point( 1, 1, 1));
    vhandle[3] = mesh.add_vertex(MyMesh::Point(-1, 1, 1));
    vhandle[4] = mesh.add_vertex(MyMesh::Point(-1, -1, -1));
    vhandle[5] = mesh.add_vertex(MyMesh::Point( 1, -1, -1));
    vhandle[6] = mesh.add_vertex(MyMesh::Point( 1, 1, -1));
    vhandle[7] = mesh.add_vertex(MyMesh::Point(-1, 1, -1));
    // generate (quadrilateral) faces
    std::vector<MyMesh::VertexHandle> face_vhandles;
    face_vhandles.clear();
    face_vhandles.push_back(vhandle[0]);
    face_vhandles.push_back(vhandle[1]);
    face_vhandles.push_back(vhandle[2]);
    face_vhandles.push_back(vhandle[3]);
    mesh.add_face(face_vhandles);
    
    face_vhandles.clear();
    face_vhandles.push_back(vhandle[7]);
    face_vhandles.push_back(vhandle[6]);
    face_vhandles.push_back(vhandle[5]);
    face_vhandles.push_back(vhandle[4]);
    mesh.add_face(face_vhandles);
    face_vhandles.clear();
    face_vhandles.push_back(vhandle[1]);
    face_vhandles.push_back(vhandle[0]);
    face_vhandles.push_back(vhandle[4]);
    face_vhandles.push_back(vhandle[5]);
    mesh.add_face(face_vhandles);
    face_vhandles.clear();
    face_vhandles.push_back(vhandle[2]);
    face_vhandles.push_back(vhandle[1]);
    face_vhandles.push_back(vhandle[5]);
    face_vhandles.push_back(vhandle[6]);
    mesh.add_face(face_vhandles);
    face_vhandles.clear();
    face_vhandles.push_back(vhandle[3]);
    face_vhandles.push_back(vhandle[2]);
    face_vhandles.push_back(vhandle[6]);
    face_vhandles.push_back(vhandle[7]);
    mesh.add_face(face_vhandles);
    face_vhandles.clear();
    face_vhandles.push_back(vhandle[0]);
    face_vhandles.push_back(vhandle[3]);
    face_vhandles.push_back(vhandle[7]);
    face_vhandles.push_back(vhandle[4]);
    mesh.add_face(face_vhandles);
    // write mesh to output.obj
    try
    {
    if ( !OpenMesh::IO::write_mesh(mesh, "output.off") )
    {
    std::cerr << "Cannot write mesh to file 'output.off'" << std::endl;
    return 1;
    }
    }
    catch( std::exception& x )
    {
    std::cerr << x.what() << std::endl;
    return 1;
    }
    return 0;
    }
    



  • 相关阅读:
    【题解】直线交点数
    【题解】[TJOI2010] 阅读理解
    清北学堂 2020 国庆J2考前综合强化 Day7
    清北学堂 2020 国庆J2考前综合强化 Day6
    清北学堂 2020 国庆J2考前综合强化 Day5
    清北学堂 2020 国庆J2考前综合强化 Day4
    清北学堂 2020 国庆J2考前综合强化 Day3
    test
    清北学堂 2020 国庆J2考前综合强化 Day2
    清北学堂 2020 国庆J2考前综合强化 Day1
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3202954.html
Copyright © 2011-2022 走看看