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);
}