2015-05-11 62 views
1

我用vtkGenericDataObjectReader類讀取其中只包含點位置和VTK_TETRA細胞.vtk文件:如何從.vtk文件中提取點法線?

# vtk DataFile Version 2.0 
Unstructured Grid 
ASCII 
DATASET UNSTRUCTURED_GRID 
POINTS 19002 double 
-0.150669 0.33708199999999999 -0.053355 
0.240651 -0.40023399999999998 -0.183224 
-0.15488199999999999 -0.54804799999999998 -0.210316 
... the other points ... 
CELLS 75753 378765 
4 3472 3996 7922 9626 
4 5182 6191 12063 12612 
4 5555 2996 18404 18616 
... the other cells ... 

後成功讀取該文件,我沒有通過獲得分數法線:

VTK_CREATE(vtkGenericDataObjectReader, reader); 
reader->SetFileName(file.toStdString().c_str()); 
reader->Update(); 

Q_ASSERT(reader->IsFileUnstructuredGrid()); 

VTK_CREATE(vtkUnstructuredGrid, ug); 
ug = vtkUnstructuredGrid::SafeDownCast(reader->GetOutput()); 
vtkDataArray* normals = ug->GetPointData()->GetArray("Normals"); 
//vtkDataArray* normals = ug->GetPointData()->GetNormals(); 

VTK_CREATE(vtkDataSetMapper, modelMapper); 
modelMapper->SetInputData(ug); 
modelActor->SetMapper(modelMapper); 

// ... 

因爲法線必須是零指針。

但是,最終渲染的照明效果似乎是合理的。所以這裏是我的問題:(1)VTK計算點法線如何獲得正確的光效果? (2)我應該怎麼做才能獲得點正常?

回答

1

VTK得到了一個vtkPolyDataNormals算法類,它允許您處理來自多邊形網格的法線。

VTK_CREATE(vtkGenericDataObjectReader, reader); 
reader->SetFileName(file.toStdString().c_str()); 

VTK_CREATE(vtkPolyDataNormals, norms) 
norms->SetInputConnection (reader->GetOutputPort()); 
// the output of the vtkPolyDataNormals instance is a PolyData with normals calculated 

norms->Update() 
VTK_CREATE(vtkDataSetMapper, modelMapper); 
modelMapper->SetInputData(norms->GetOutput()); 

vtkPolyDataNormals是計算點和/或小區法線爲多邊形網格的過濾器。

在這種情況下,輸出PolyData必須有一個非零的法線指針。

+0

在我的情況下,「reader」的輸出是vtkUnstructuredGrid類型的輸入,但是「規範」輸入需要vtkPolyData,所以vtkPolyDataNormals在這裏不起作用。 – blldw

+0

我剛剛做了一個編輯。 'reader-> GetOutputPort()',使用該解決方案時,您使用的是vtk管道,而不是使用網格的臨時實例。或者你必須在最後完成一個vtkUnstructuredGrid嗎? vtkPolyDataNormals有一個從vtkPolyDataAlgorithm繼承的'SetInputData'方法,它可以接受任何'vtkDataObject *' – Marcassin