qt vtk 加载多个3D模型并控制运动(机械臂)

qt vtk 加载多个3D模型并控制运动(机械臂)

参考链接

基于QT+VTK的六自由度机械臂三维显示与关节运动(SolidWorks篇)
基于QT+VTK的六自由度机械臂三维显示与关节运动(代码篇)

实现

.h

struct ParameterTemp {
        vtkAssembly* assembly;
        std::string filename;
        double PositionXYZ[3];
        double Rotate[3];
        double Origin[3];
        double rgb[3];
};
    std::vector<ParameterTemp> parameterV;
    vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow3;
    vtkSmartPointer<vtkRenderer> renderer3;

.cpp

void QtVtkTest::on_pushButton_3_clicked()
{
    vtkSmartPointer<vtkAssembly> assembly_base= vtkSmartPointer<vtkAssembly>::New();
    vtkSmartPointer<vtkAssembly> assembly_link1 = vtkSmartPointer<vtkAssembly>::New();
    vtkSmartPointer<vtkAssembly> assembly_link2 = vtkSmartPointer<vtkAssembly>::New();
    vtkSmartPointer<vtkAssembly> assembly_link3 = vtkSmartPointer<vtkAssembly>::New();
    vtkSmartPointer<vtkAssembly> assembly_link4 = vtkSmartPointer<vtkAssembly>::New();
    vtkSmartPointer<vtkAssembly> assembly_link5 = vtkSmartPointer<vtkAssembly>::New();
    vtkSmartPointer<vtkAssembly> assembly_link6 = vtkSmartPointer<vtkAssembly>::New();

    parameterV = {
		{assembly_base , "./stl/J0.STL", { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, { 0.8, 1.0, 1.0 } },
        {assembly_link1, "./stl/J1.STL", { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, { 1.0, 0.8, 0.8 } },
        {assembly_link2, "./stl/J2.STL", { 0,0,0 }, { 0,0,0 }, { 50,0,370 }, { 1.0, 0.8, 0.6 } },
        {assembly_link3, "./stl/J3.STL", { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, { 0.6, 0.4, 0.6 } },
        {assembly_link4, "./stl/J4.STL", { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, { 1.0, 1.0, 0.0 } },
        {assembly_link5, "./stl/J5.STL", { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, { 0.6, 0.8, 0.0 } },
        {assembly_link6, "./stl/J6.STL", { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, { 0.8, 0.9, 1.0 } }
    };

    for (int i = 0; i < parameterV.size(); i++)
    {
        RobbotArmAssemblyLink(parameterV[i]);//加载模型并旋转至正确的角度
        if (i < parameterV.size() - 1)
        {
			parameterV[i].assembly->AddPart(parameterV[i + 1].assembly);//添加装配体并将各个关节连接
        }
        parameterV[i].assembly->SetOrigin(parameterV[i].Origin);//设置关节的旋转中心
    }
    // 添加演员到渲染器
    renderer3 = vtkSmartPointer<vtkRenderer>::New();
    renderer3->AddActor(assembly_base);
    renderer3->SetBackground(1.0, 1.0, 1.0);              // 设置页面底部颜色值
    renderer3->SetBackground2(0.529, 0.8078, 0.92157);    // 设置页面顶部颜色值
    renderer3->SetGradientBackground(1);                  // 开启渐变色背景设置
    // 将renderer添加到vtkRenderWindow中
    /*vtkSmartPointer<vtkGenericOpenGLRenderWindow> */renderWindow3 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    renderWindow3->AddRenderer(renderer3);

    // 将vtkRenderWindow显示在QVTKOpenGLWidget上
    ui.openGLWidget_3->setRenderWindow(renderWindow3);
    //ui.openGLWidget_2->renderWindow()->AddRenderer(renderer);
    ui.openGLWidget_3->update();

}

void QtVtkTest::on_horizontalSlider_valueChanged(int value)
{
    parameterV[1].assembly->SetOrientation(0, 0, value);
    renderWindow3->Render();
    //ui.openGLWidget_3->update();

}

void QtVtkTest::on_horizontalSlider_2_valueChanged(int value)
{
    parameterV[2].assembly->SetOrientation(0, value,0 );
    renderWindow3->Render();

}

void QtVtkTest::on_horizontalSlider_3_valueChanged(int value)
{
    parameterV[3].assembly->SetOrientation(0, value, 0);
    renderWindow3->Render();
}

void QtVtkTest::on_horizontalSlider_4_valueChanged(int value)
{
    parameterV[4].assembly->SetOrientation(value,0 , 0);
    renderWindow3->Render();
}

void QtVtkTest::on_horizontalSlider_5_valueChanged(int value)
{
    parameterV[5].assembly->SetOrientation(0,value , 0);
    renderWindow3->Render();
}

void QtVtkTest::on_horizontalSlider_6_valueChanged(int value)
{
}

void QtVtkTest::RobbotArmAssemblyLink(ParameterTemp parameterTemp)
{
    vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();
    vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
    reader->SetFileName(parameterTemp.filename.c_str());
    reader->Update();

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(reader->GetOutputPort());

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetDiffuse(0.8);
    actor->GetProperty()->SetDiffuseColor(colors->GetColor3d("LightSteelBlue").GetData());
    actor->GetProperty()->SetSpecular(0.3);
    actor->GetProperty()->SetSpecularPower(60.0);
    actor->GetProperty()->SetColor(parameterTemp.rgb); // r, g, b 分别为红色、绿色、蓝色的值,范围从0.0到1.0

    actor->RotateZ(parameterTemp.Rotate[2]);
    actor->RotateY(parameterTemp.Rotate[1]);
    actor->RotateX(parameterTemp.Rotate[0]);
    actor->SetPosition(parameterTemp.PositionXYZ);
    parameterTemp.assembly->AddPart(actor);
}

绘制网格

void QtVtkTest::GridDrawing(double int_row, double int_col)//网格绘制
{
    //绘制水平线
    for (float row = -int_row / 2; row <= int_row / 2; row += 1000)
    {
        double p0[3] = { row, -int_row / 2, 0 };
        double p1[3] = { row, int_row / 2, 0 };
        vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
        points->InsertNextPoint(p0);
        points->InsertNextPoint(p1);
        vtkSmartPointer<vtkLine> pLine = vtkSmartPointer<vtkLine>::New();
        pLine->GetPointIds()->SetId(0, 0);
        pLine->GetPointIds()->SetId(1, 1);
        vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
        cellArray->InsertNextCell(pLine);
        vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
        polyData->SetPoints(points);
        polyData->SetLines(cellArray);
        vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
        mapper->SetInputData(polyData);
        vtkSmartPointer<vtkActor> lineActor_row = vtkSmartPointer<vtkActor>::New();
        lineActor_row->SetMapper(mapper);
        lineActor_row->GetProperty()->SetColor(1, 1, 1);
        lineActor_row->GetProperty()->SetLineWidth(1);
        renderer3->AddActor(lineActor_row);
    }

    //绘制垂直线
    for (float col = -int_col / 2; col <= int_col / 2; col += 1000)
    {
        double p0[3] = { -int_col / 2, col, 0 };
        double p1[3] = { int_col / 2 , col, 0 };
        vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
        points->InsertNextPoint(p0);
        points->InsertNextPoint(p1);
        vtkSmartPointer<vtkLine> pLine = vtkSmartPointer<vtkLine>::New();
        pLine->GetPointIds()->SetId(0, 0);
        pLine->GetPointIds()->SetId(1, 1);
        vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
        cellArray->InsertNextCell(pLine);
        vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
        polyData->SetPoints(points);
        polyData->SetLines(cellArray);
        vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
        mapper->SetInputData(polyData);
        vtkSmartPointer<vtkActor> lineActor_col = vtkSmartPointer<vtkActor>::New();
        lineActor_col->SetMapper(mapper);
        lineActor_col->GetProperty()->SetColor(1, 1, 1);
        lineActor_col->GetProperty()->SetLineWidth(1);
        renderer3->AddActor(lineActor_col);
    }
    renderWindow3->Render();
}

void QtVtkTest::on_pushButton_4_clicked()
{
    GridDrawing(30000, 30000);
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt中使用VTK(Visualization Toolkit)加载obj3d模型,您可以使用VTKQt插件,即VTKQt渲染窗口类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、付费专栏及课程。

余额充值