vtk读取后缀名为.ply、.vtp、.obj、.stl、.vtk、.g文件并显示

//Description¶
//Given a filename, uses the appropriate vtkPolyData reader to read any vtkPolyData file.
//To use the snippet, click the Copy to clipboard at the upper right of the code blocks.

// Readers
#include <vtkBYUReader.h>
#include <vtkOBJReader.h>
#include <vtkPLYReader.h>
#include <vtkPolyDataReader.h>
#include <vtkSTLReader.h>
#include <vtkXMLPolyDataReader.h>
#include<vtkPolyDataMapper.h>
#include <vtkPolyData.h>
#include <vtkSphereSource.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include<vtkRenderer.h>
#include<vtkNamedColors.h>
#include <vtkProperty.h>
#include <vtkActor.h>
#include <algorithm> // For transform()
#include <string> // For find_last_of()
#include <cctype> // For to_lower
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
namespace {

    vtkSmartPointer<vtkPolyData> ReadPolyData(const char* fileName)
    {
        vtkSmartPointer<vtkPolyData> polyData;
        std::string extension =
            vtksys::SystemTools::GetFilenameExtension(std::string(fileName));
        if (extension == ".ply")
        {
            vtkNew<vtkPLYReader> reader;
            reader->SetFileName(fileName);
            reader->Update();
            polyData = reader->GetOutput();
        }
        else if (extension == ".vtp")
        {
            vtkNew<vtkXMLPolyDataReader> reader;
            reader->SetFileName(fileName);
            reader->Update();
            polyData = reader->GetOutput();
        }
        else if (extension == ".obj")
        {
            vtkNew<vtkOBJReader> reader;
            reader->SetFileName(fileName);
            reader->Update();
            polyData = reader->GetOutput();
        }
        else if (extension == ".stl")
        {
            vtkNew<vtkSTLReader> reader;
            reader->SetFileName(fileName);
            reader->Update();
            polyData = reader->GetOutput();
        }
        else if (extension == ".vtk")
        {
            vtkNew<vtkPolyDataReader> reader;
            reader->SetFileName(fileName);
            reader->Update();
            polyData = reader->GetOutput();
        }
        else if (extension == ".g")
        {
            vtkNew<vtkBYUReader> reader;
            reader->SetGeometryFileName(fileName);
            reader->Update();
            polyData = reader->GetOutput();
        }
        else
        {
            vtkNew<vtkSphereSource> source;
            source->SetPhiResolution(25);
            source->SetThetaResolution(25);
            source->Update();
            polyData = source->GetOutput();
        }
        return polyData;
    }

} // namespace

int main()
{
    vtkNew<vtkNamedColors> colors;

    auto ployData = ReadPolyData("Intergalactic_Spaceship-(Wavefront).obj");
    // 创建映射器并将数据源连接到映射器
    vtkSmartPointer<vtkPolyDataMapper> myMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    myMapper->SetInputData(ployData); 

    vtkNew<vtkActor> coneActor;
    coneActor->SetMapper(myMapper);
    coneActor->GetProperty()->SetColor(colors->GetColor3d("Bisque").GetData());

    //
    // Create the Renderer and assign actors to it. A renderer is like a
    // viewport. It is part or all of a window on the screen and it is
    // responsible for drawing the actors it has.  We also set the background
    // color here.
    //
    vtkNew<vtkRenderer> ren1;
    ren1->AddActor(coneActor);
    ren1->SetBackground(colors->GetColor3d("MidnightBlue").GetData());

    //
    // Finally we create the render window which will show up on the screen.
    // We put our renderer into the render window using AddRenderer. We also
    // set the size to be 300 pixels by 300.
    //
    vtkNew<vtkRenderWindow> renWin;
    renWin->AddRenderer(ren1);
    renWin->SetSize(300, 300);
    renWin->SetWindowName("ReadPolyData");

    //
    // The vtkRenderWindowInteractor class watches for events (e.g., keypress,
    // mouse) in the vtkRenderWindow. These events are translated into
    // event invocations that VTK understands (see VTK/Common/vtkCommand.h
    // for all events that VTK processes). Then observers of these VTK
    // events can process them as appropriate.
    vtkNew<vtkRenderWindowInteractor> iren;
    iren->SetRenderWindow(renWin);

    //
    // By default the vtkRenderWindowInteractor instantiates an instance
    // of vtkInteractorStyle. vtkInteractorStyle translates a set of events
    // it observes into operations on the camera, actors, and/or properties
    // in the vtkRenderWindow associated with the vtkRenderWinodwInteractor.
    // Here we specify a particular interactor style.
    vtkNew<vtkInteractorStyleTrackballCamera> style;
    iren->SetInteractorStyle(style);

    //
    // Unlike the previous scripts where we performed some operations and then
    // exited, here we leave an event loop running. The user can use the mouse
    // and keyboard to perform the operations on the scene according to the
    // current interaction style. When the user presses the "e" key, by default
    // an ExitEvent is invoked by the vtkRenderWindowInteractor which is caught
    // and drops out of the event loop (triggered by the Start() method that
    // follows.
    //
    iren->Initialize();
    iren->Start();

    //
    // Final note: recall that observers can watch for particular events and
    // take appropriate action. Pressing "u" in the render window causes the
    // vtkRenderWindowInteractor to invoke a UserEvent. This can be caught to
    // popup a GUI, etc. See the Tcl Cone5.tcl example for an idea of how this
    // works.

    return EXIT_SUCCESS;

}

内容概要:本文详细介绍了HarmonyOS应用开发中Navigation菜单栏的设置方法及其重要性。文章首先阐述了Navigation组件的作用,指出它是构建流畅用户体验的关键,支持单栏、分栏和自适应三种显示模式。接着强调了菜单栏设置对用户体验的影响,通过具体案例展示了优化菜单栏能显著提升用户活跃度和应用留存率。随后,文章逐步讲解了菜单栏设置前的开发环境搭建、对Navigation组件的理解,以及菜单栏的具体设置步骤,包括基础设置、不同显示模式下的设置、标题栏与菜单栏的协同设置。最后,文章总结了菜单栏设置中的常见问题及解决方法,提供了优化菜单栏设置的技巧,如合理规划菜单项数量、选择合适的图标和文本、提升菜单栏交互性。 适合人群:具备一定HarmonyOS开发基础的研发人员,尤其是希望提升用户体验的开发者。 使用场景及目标:①掌握HarmonyOS Navigation组件的基本功能和设置方法;②了解如何通过优化菜单栏设置提升用户体验;③解决菜单栏设置过程中常见的问题;④学习优化菜单栏设置的实用技巧,如合理规划菜单项数量、选择合适的图标和文本、提升菜单栏交互性。 其他说明:本文不仅提供了详细的菜单栏设置步骤和技术要点,还结合实际案例展示了菜单栏优化的效果,帮助开发者更好地理解和应用相关知识。此外,文中提到的开发工具和环境配置信息对初次接触HarmonyOS开发的人员尤其有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值