前言
想在三维界面进行用户交互,实现对模型的独立操作,两个模型是自己建的模型。
方法
使用多边形构建矩形,并拉伸成立方体,两个立方体独立操作
int MyTrackballActor()
{
vtkSmartPointer<vtkLinearExtrusionFilter> m_extrude_sheyuan = vtkSmartPointer<vtkLinearExtrusionFilter>::New();
{
const int num_points = 4;
vtkSmartPointer<vtkUnstructuredGrid> polygonGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
vtkSmartPointer<vtkPoints> polygonPoints = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();
vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
double top_left[num_points][3] = {
{ 0, 2280 - 3200, 0 },
{ 0, 2280, 0 },
{ -2300, 2280, 0 },
{ -2300, 2280 - 3200, 0 }
};
double Hight = 2170.0;
// 几何数据 + 拓扑数据
polygonPoints->SetNumberOfPoints(num_points);
polygon->GetPointIds()->SetNumberOfIds(num_points);
for (int i = 0; i < num_points; ++i){
polygonPoints->SetPoint(i, top_left[i]);
polygon->GetPointIds()->SetId(i, i);
}
polygonGrid->InsertNextCell(polygon->GetCellType(), polygon->GetPointIds());
polygonGrid->SetPoints(polygonPoints);
vtkNew<vtkDataSetSurfaceFilter> surface_filter;
surface_filter->SetInputData(polygonGrid);
surface_filter->Update();
vtkNew<vtkTriangleFilter> filter;
filter->SetInputData(surface_filter->GetOutput());
filter->Update();
// Apply linear extrusion(对平面进行拉伸成3D)
m_extrude_sheyuan->SetInputConnection(filter->GetOutputPort());
m_extrude_sheyuan->SetExtrusionTypeToNormalExtrusion();
m_extrude_sheyuan->SetVector(0, 0, 1);// 沿文字方向挤压,沿着z向上
m_extrude_sheyuan->SetScaleFactor(Hight);// 设置挤压比例 //blog.csdn.net/wanyongtai/article/details/106490653
m_extrude_sheyuan->Update();
}
vtkSmartPointer<vtkLinearExtrusionFilter> m_extrude_chuang = vtkSmartPointer<vtkLinearExtrusionFilter>::New();
{
//{
const int num_points = 4;
vtkSmartPointer<vtkUnstructuredGrid> polygonGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
vtkSmartPointer<vtkPoints> polygonPoints = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();
vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
double chuangkuan_danbian = 800;//图纸显示为935mm
double top_left[num_points][3] = {
{ 100, -1 * chuangkuan_danbian, 0 },
{ 2360, -1 * chuangkuan_danbian, 0 },
{ 2360, chuangkuan_danbian, 0 },
{ 100, chuangkuan_danbian, 0 },
};
double ChangHight = 851;
// 几何数据 + 拓扑数据
polygonPoints->SetNumberOfPoints(num_points);
polygon->GetPointIds()->SetNumberOfIds(num_points);
for (int i = 0; i < num_points; ++i){
polygonPoints->SetPoint(i, top_left[i]);
polygon->GetPointIds()->SetId(i, i);
}
polygonGrid->InsertNextCell(polygon->GetCellType(), polygon->GetPointIds());
polygonGrid->SetPoints(polygonPoints);
vtkNew<vtkDataSetSurfaceFilter> surface_filter;
surface_filter->SetInputData(polygonGrid);
surface_filter->Update();
vtkNew<vtkTriangleFilter> filter;
filter->SetInputData(surface_filter->GetOutput());
filter->Update();
// Apply linear extrusion(对平面进行拉伸成3D)
m_extrude_chuang->SetInputConnection(filter->GetOutputPort());
m_extrude_chuang->SetExtrusionTypeToNormalExtrusion();
m_extrude_chuang->SetVector(0, 0, 1);// 沿文字方向挤压,沿着z向上
m_extrude_chuang->SetScaleFactor(ChangHight);// 设置挤压比例 //blog.csdn.net/wanyongtai/article/details/106490653
m_extrude_chuang->Update();
}
vtkSmartPointer<vtkDataSetMapper> polygonMappersheyuan = vtkSmartPointer<vtkDataSetMapper>::New();
polygonMappersheyuan->SetInputConnection(m_extrude_sheyuan->GetOutputPort());
vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
coneActor->SetMapper(polygonMappersheyuan);
vtkSmartPointer<vtkDataSetMapper> polygonMapper = vtkSmartPointer<vtkDataSetMapper>::New();
polygonMapper->SetInputConnection(m_extrude_chuang->GetOutputPort());
vtkSmartPointer<vtkActor> coneActor2 = vtkSmartPointer<vtkActor>::New();
coneActor2->SetMapper(polygonMapper);
vtkSmartPointer<vtkPoints> pointsInside = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkPolyData> polyDataInside = vtkSmartPointer<vtkPolyData>::New();
double point[3];
vtkSmartPointer<vtkDelaunay3D> delaunay3D = vtkSmartPointer<vtkDelaunay3D>::New();
delaunay3D->SetInputConnection(m_extrude_chuang->GetOutputPort());
delaunay3D->Update();
for (vtkIdType i = 0; i < m_extrude_chuang->GetOutput()->GetNumberOfPoints(); i++)
{
m_extrude_chuang->GetOutput()->GetPoint(i, point);
double pcoords[3];
// The number of weights >= max number of nodes in each cell
double weights[4];
int subId;
vtkIdType cellId = delaunay3D->GetOutput()->FindCell(point, NULL, 0, .1, subId, pcoords, weights);
if (cellId >= 0)
{
std::cout << "In cell " << cellId << std::endl;
std::cout << "inside" << std::endl;
pointsInside->InsertNextPoint(point);
}
else
{
std::cout << "outside" << std::endl;
}
}
polyDataInside->SetPoints(pointsInside);
vtkSmartPointer<vtkVertexGlyphFilter> vertexGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
#if VTK_MAJOR_VERSION <= 5
vertexGlyphFilter->SetInputConnection(polyDataInside->GetProducerPort());
#else
vertexGlyphFilter->SetInputData(polyDataInside);
#endif
vertexGlyphFilter->Update();
// Mapper and actor for points inside
vtkSmartPointer<vtkPolyDataMapper> pointsInsideMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
pointsInsideMapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());
vtkSmartPointer<vtkActor> pointsInsideActor = vtkSmartPointer<vtkActor>::New();
pointsInsideActor->SetMapper(pointsInsideMapper);
pointsInsideActor->GetProperty()->SetPointSize(6);
pointsInsideActor->GetProperty()->SetColor(1, 0, 1);
vtkRenderer *ren1 = vtkRenderer::New();
ren1->SetBackground(0.1, 0.2, 0.4);
// 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.
//
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
renWin->SetSize(900, 800);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<StyleTrackballActor> style = vtkSmartPointer <StyleTrackballActor>::New();
style->SetDefaultRenderer(ren1);
style->ActorA = coneActor;
style->ActorB = coneActor2;
//vtkOBBTree * clipTree = vtkOBBTree::New();
//vtkOBBTree * targetTree = vtkOBBTree::New();
//targetTree->SetDataSet(targetPoly);
//targetTree->BuildLocator();
//clipTree->SetDataSet(clipPoly);
//clipTree->BuildLocator();
使用包围盒求交 ,求交部分在OBBNodeIntersected中。NULL表示不做任何转换
//clipTree->IntersectWithOBBTree(targetTree, NULL, OBBNodeIntersected, this);
iren->SetInteractorStyle(style);
ren1->AddActor(coneActor);
ren1->AddActor(coneActor2);
//ren1->AddActor(Actor1);
//ren1->AddActor(Actor2);
iren->Initialize();
iren->Start();
return 0;
} //blog.csdn.net/q610098308/article/details/108093627
效果