vtk加载模型obj\stl\gltf

.cpp文件

引入

#include <vtkPolyDataReader.h>
#include <vtkOBJReader.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkCamera.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSmartPointer.h>
#include <vtkGLTFImporter.h>


//不添加报错,原因???
#include <vtkAutoInit.h>
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);

加载obj模型

//加载obj模型
vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New(); // 读取OBJ
reader->SetFileName("path/demo.obj");
reader->Update();
vtkSmartPointer <vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(reader->GetOutputPort());

vtkSmartPointer <vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
renderer->AddActor(actor);

加载stl模型

//加载stl模型
vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();	// 读取STL
reader->SetFileName("path/demo.stl");
reader->Update();	
vtkSmartPointer <vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer <vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper); 
renderer->AddActor(actor);

加载gltf模型

//加载gltf模型
vtkSmartPointer<vtkGLTFImporter> importer = vtkSmartPointer<vtkGLTFImporter>::New();
importer->SetFileName("path/demo.gltf");
importer->Read();
vtkSmartPointer<vtkActorCollection> actors = importer->GetRenderer()->GetActors();
actors->InitTraversal();
for (vtkIdType i = 0; i < actors->GetNumberOfItems(); ++i) {
	vtkActor* actor = actors->GetNextActor();
	//actor->GetProperty()->SetEdgeColor(255, 241, 0);	// 显示边框颜色
	//actor->GetProperty()->SetEdgeVisibility(1);			// 显示边框
	// 处理每个 actor
	renderer->AddActor(actor);
}

加载gltf文件,尝试加载glb文件时,部分文件报错,估计材质vtk不支持

vtkGLTFDocumentLoader (0000021F4E54CB20): glTF extension KHR_materials_pbrSpecularGlossiness is used in this model, but not supported by this loader. The extension will be ignored.

全部代码

#include <vtkPolyDataReader.h>
#include <vtkOBJReader.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkCamera.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSmartPointer.h>
#include <vtkGLTFImporter.h>


#include <vtkAutoInit.h>
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);

int main()
{
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();

	vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	//设置窗口尺寸
	renderWindow->SetSize(600, 600);
	//窗口title
	renderWindow->SetWindowName("vtkGLTFReader");
	///*开启全屏*/
	renderWindow->SetFullScreen(true);
	开启全屏
	 renderWindow->FullScreenOn();
	关闭全屏
	renderWindow->FullScreenOff();

	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);

	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	renderWindowInteractor->SetInteractorStyle(style);

	//加载gltf模型
    vtkSmartPointer<vtkGLTFImporter> importer = vtkSmartPointer<vtkGLTFImporter>::New();
	importer->SetFileName("path/demo.gltf");
	importer->Read();
	vtkSmartPointer<vtkActorCollection> actors = importer->GetRenderer()->GetActors();
	actors->InitTraversal();
	for (vtkIdType i = 0; i < actors->GetNumberOfItems(); ++i) {
		vtkActor* actor = actors->GetNextActor();
		//actor->GetProperty()->SetEdgeColor(255, 241, 0);	// 显示边框颜色
		//actor->GetProperty()->SetEdgeVisibility(1);			// 显示边框
		// 处理每个 actor
		renderer->AddActor(actor);
	}

	加载obj模型
	//vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New();	    // 读取OBJ
	//reader->SetFileName("path/demo.obj");
	//reader->Update();
	//vtkSmartPointer <vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	//mapper->SetInputConnection(reader->GetOutputPort());

	//vtkSmartPointer <vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	//actor->SetMapper(mapper);
	//renderer->AddActor(actor);
	加载stl模型
	//vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();	    // 读取STL
	//reader->SetFileName("path/demo.stl");
	//reader->Update();	
	//vtkSmartPointer <vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	//mapper->SetInputConnection(reader->GetOutputPort());
	//vtkSmartPointer <vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	//actor->SetMapper(mapper); 
	//renderer->AddActor(actor);


    // 设置背景颜色
	renderer->SetBackground(0.1, 0.2, 0.4); 
	renderWindow->Render();
	renderWindowInteractor->Start();
	return 0;
}

要在Qt中使用VTK(Visualization Toolkit)加载obj3d模型,您可以使用VTK的Qt插件,即VTK的Qt渲染窗口类QVTKOpenGLNativeWidget。 以下是一个简单的示例代码: ```cpp #include <vtkSmartPointer.h> #include <vtkOBJReader.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <QVTKOpenGLNativeWidget.h> #include <QVBoxLayout> #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建Qt窗口和布局 QWidget *widget = new QWidget(); QVBoxLayout *layout = new QVBoxLayout(widget); // 创建QVTKOpenGLNativeWidget并添加到布局中 QVTKOpenGLNativeWidget *vtkWidget = new QVTKOpenGLNativeWidget(); layout->addWidget(vtkWidget); // 创建VTK渲染器和渲染窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 将QVTKOpenGLNativeWidget与VTK渲染窗口关联 vtkWidget->SetRenderWindow(renderWindow); // 加载obj3d模型 vtkSmartPointer<vtkOBJReader> reader = vtkSmartPointer<vtkOBJReader>::New(); reader->SetFileName("path/to/your/model.obj"); reader->Update(); // 创建VTK演员和映射器 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(reader->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 将演员添加到渲染器中 renderer->AddActor(actor); // 显示窗口 widget->show(); // 运行Qt事件循环 return app.exec(); } ``` 在上面的代码中,我们创建了一个Qt窗口和布局,然后创建了一个QVTKOpenGLNativeWidget并将其添加到布局中。然后,我们创建了一个VTK渲染器和渲染窗口,并将QVTKOpenGLNativeWidget与VTK渲染窗口关联。接下来,我们加载obj3d模型并创建VTK演员和映射器。最后,我们将演员添加到渲染器中,并显示窗口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值