Basically , I am trying to use the given code to highlight the camera view faces ,but it is only culling the back faces, It’s also highlighting the hidden faces which is not expected .Here below is my code .can you help me to figure it out ?
#include <vtkSmartPointer.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCamera.h>
#include <vtkPolyDataNormals.h>
#include <vtkUnsignedCharArray.h>
#include <vtkCellData.h>
#include <vtkMath.h>
#include <vtkCommand.h>
#include <vtkObjectFactory.h>
#include
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPolyData.h>
#include <vtkRendererCollection.h>
#include <vtkAutoInit.h>
#include <vtkDataSetSurfaceFilter.h>
#include <vtkSelectVisiblePoints.h>
#include <vtkOctreePointLocator.h>
#include
#include <unordered_set>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
class KeyPressInteractorStyle : public vtkInteractorStyleTrackballCamera {
public:
static KeyPressInteractorStyle* New();
vtkTypeMacro(KeyPressInteractorStyle, vtkInteractorStyleTrackballCamera);
virtual void OnKeyPress() override {
vtkRenderWindowInteractor* rwi = this->Interactor;
std::string key = rwi->GetKeySym();
if (key == "v") {
vtkSmartPointer<vtkRenderer> renderer = rwi->GetRenderWindow()->GetRenderers()->GetFirstRenderer();
vtkSmartPointer<vtkDataSetSurfaceFilter> surfaceFilter = vtkSmartPointer<vtkDataSetSurfaceFilter>::New();
surfaceFilter->SetInputConnection(reader->GetOutputPort());
surfaceFilter->Update();
vtkSmartPointer<vtkSelectVisiblePoints> visiblePointsFilter = vtkSmartPointer<vtkSelectVisiblePoints>::New();
visiblePointsFilter->SetInputConnection(surfaceFilter->GetOutputPort());
visiblePointsFilter->SetRenderer(renderer);
visiblePointsFilter->Update();
vtkSmartPointer<vtkPolyData> visiblePoints = vtkSmartPointer<vtkPolyData>::New();
visiblePoints->ShallowCopy(visiblePointsFilter->GetOutput());
vtkSmartPointer<vtkOctreePointLocator> octree = vtkSmartPointer<vtkOctreePointLocator>::New();
octree->SetDataSet(visiblePoints);
octree->BuildLocator();
vtkSmartPointer<vtkCamera> camera = renderer->GetActiveCamera();
vtkSmartPointer<vtkPolyDataNormals> normals = vtkSmartPointer<vtkPolyDataNormals>::New();
normals->SetInputConnection(reader->GetOutputPort());
normals->ComputeCellNormalsOn();
normals->Update();
vtkSmartPointer<vtkPolyData> polyData = normals->GetOutput();
vtkSmartPointer<vtkDataArray> cellNormals = polyData->GetCellData()->GetNormals();
vtkSmartPointer<vtkUnsignedCharArray> cellColors = vtkSmartPointer<vtkUnsignedCharArray>::New();
cellColors->SetNumberOfComponents(3);
cellColors->SetName("CellColors");
double camPos[3], camFocalPoint[3], camNormal[3];
camera->GetPosition(camPos);
camera->GetFocalPoint(camFocalPoint);
for (int i = 0; i < 3; ++i) {
camNormal[i] = camFocalPoint[i] - camPos[i];
}
std::vector<int> triangleIds;
double normal[3];
for (vtkIdType i = 0; i < cellNormals->GetNumberOfTuples(); ++i) {
cellNormals->GetTuple(i, normal);
double dotProduct = vtkMath::Dot(camNormal, normal);
if (dotProduct <= 0)
{
vtkSmartPointer<vtkIdList> pointIds = vtkSmartPointer<vtkIdList>::New();
polyData->GetCellPoints(i, pointIds);
bool hasVisiblePoint = false;
for (vtkIdType j = 0; j < pointIds->GetNumberOfIds(); ++j) {
vtkIdType closestPointId = octree->FindClosestPoint(polyData->GetPoint(pointIds->GetId(j)));
double closestPoint[3], originalPoint[3];
visiblePoints->GetPoint(closestPointId, closestPoint);
polyData->GetPoint(pointIds->GetId(j), originalPoint);
if (vtkMath::Distance2BetweenPoints(closestPoint, originalPoint) < 1e-15) {
hasVisiblePoint = true;
break;
}
}
if (visiblePointsFilter) {
cellColors->InsertNextTuple3(0, 255, 0);
triangleIds.push_back(i);
}
else {
cellColors->InsertNextTuple3(255, 255, 255);
}
}
else {
cellColors->InsertNextTuple3(255, 255, 255);
}
}
polyData->GetCellData()->SetScalars(cellColors);
vtkPolyDataMapper::SafeDownCast(mapper.GetPointer())->SetInputData(polyData);
rwi->Render();
}
vtkInteractorStyleTrackballCamera::OnKeyPress();
}
vtkSmartPointer<vtkSTLReader> reader;
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
};
vtkStandardNewMacro(KeyPressInteractorStyle);
int main() {
std::string inputFilename = “C:\Users\vipul.k\Desktop\Engine_Mount_Bracket_Optimized_Model.stl”;
vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(inputFilename.c_str());
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
camera->SetPosition(0, 0, 10);
camera->SetFocalPoint(0, 0, 0);
camera->SetParallelProjection(1); // Enable orthographic projection
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetActiveCamera(camera);
renderer->ResetCamera();
renderer->SetBackground(0.1, 0.1, 0.1);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize(800, 800);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkSmartPointer<KeyPressInteractorStyle> style = vtkSmartPointer<KeyPressInteractorStyle>::New();
style->reader = reader;
style->mapper = mapper;
renderWindowInteractor->SetInteractorStyle(style);
renderWindowInteractor->Initialize();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}