2017-04-03 25 views
0

vtkOBJReaderでインポートした2つのOBJメッシュ間でレイキャストを行います。頂点から2番目のメッシュに向かう法線方向へのレイキャストを行いたいと思います。OBJインポートからVTKの頂点pos、normal、colorにアクセスします。

しかし、最初のメッシュから頂点(およびパラメータ)にアクセスする方法はわかりません。私はセルとポイントのコンセプトとvtkのフィル​​タを少し混乱させています。私がこれまでに行うために管理する何

はvtkCellCentersオブジェクトを作成し、私のレイキャストを行うには、それから、通常のポイントを取得することでしたが、これは私が欲しいものは本当にないです...ここで

は、私がアクセスできる方法ですセルの中心と私のレイキャストを開始する通常:

import vtk 

OBJ_SCALE = 100. 
ColorBackground = [0.0, 0.0, 0.0] 
FirstobjPath = r"...my Path to the first OBJ file..." 

reader = vtk.vtkOBJReader() 
reader.SetFileName(FirstobjPath) 

# I scale up object for better precision 
transform = vtk.vtkTransform() 
transform.Scale(OBJ_SCALE, OBJ_SCALE, OBJ_SCALE) 
transformPData = vtk.vtkTransformPolyDataFilter() 
transformPData.SetTransform(transform) 
transformPData.SetInputConnection(reader.GetOutputPort()) 

# I transform poly to triangle for proper indexing 
triangles = vtk.vtkTriangleFilter() 
triangles.SetInputConnection(transformPData.GetOutputPort()) 

# Here is how I get my cell data 
cellCenterCalc = vtk.vtkCellCenters() 
cellCenterCalc.SetInputConnection(triangles.GetOutputPort()) 
cellCenterCalc.Update() 

# I can get the point center with this 
pointsCellCenters = cellCenterCalc.GetOutput(0) 
# and the normals with this 
normalsCalcScan = vtk.vtkPolyDataNormals() 
normalsCalcScan.SetInputConnection(triangles.GetOutputPort()) 


mapper = vtk.vtkPolyDataMapper() 
mapper.SetInputConnection(triangles.GetOutputPort()) 
actor = vtk.vtkActor() 
actor.SetMapper(mapper) 
ren = vtk.vtkRenderer() 
ren.SetBackground(ColorBackground) 
ren.AddActor(actor) 

私は同じことを行うことができるようにする必要がありますが頂点posと法線と(私もマスクとして使用する頂点カラーへのアクセス権を持っているのが好きどの頂点がレイキャストを行うべきかをフィルタリングするため) 私はそれを考えていますが、これまでのところ運はありません。 ;)

polyData = triangles.GetOutput() 
polyData.GetCellData().GetScalars("Colors") 

答えて

0

私もそれで苦労しました。ここで私はC++で頂点と面にアクセスします。ここで彼らは法線の異なる種類にアクセスする方法exampleあるvtkXXXX>vtkSmartPointer <を書いたときに、ちょうどvtkXXXX

void accessEachVertex(const vtkSmartPointer<vtkPolyData>& mesh) 
{ 
    vtkSmartPointer<vtkPoints> vertices = mesh->GetPoints(); 
    vtkSmartPointer<vtkDataArray> verticesArray = vertices->GetData(); 

    long long numberOfVertices = vertices->GetNumberOfPoints(); 

    // access 3D coordinate [x, y, z] of each vertex 
    for(int i = 0; i < numberOfVertices; i++) 
    { 
     float x = verticesArray->GetComponent(i, 0); 
     float y = verticesArray->GetComponent(i, 1); 
     float z = verticesArray->GetComponent(i, 2); 

     .... 
    } 
} 

void accessEachFace(const vtkSmartPointer<vtkPolyData>& mesh) 
{ 
    int numberOfFaces = mesh->GetNumberOfCells(); 

    // acces each mesh face. A face is defined by the indices 
    // of the participating vertices. 
    // this mesh has triangle faces - therefore three vertices. 
    for(int i = 0; i < numberOfFaces; i++) 
    { 
     vtkSmartPointer<vtkIdList> face = vtkSmartPointer<vtkIdList>::New(); 
     mesh->GetCellPoints(i,face); 
     int v0Idx = face->GetId(0); 
     int v1Idx = face->GetId(1); 
     int v2Idx = face->GetId(2); 

     // see the accessEachVertex function 
     // to read the coordinate of vertex v0Idx, 
     // v1Idx or v2Idx 
    } 
} 

に焦点を当てて - 私はそれが似ているPythonで願っています。正直、私はvtkの法線にいくつかの問題があります。いくつかのケースでは、彼らはただ欠席しているか、またははるかに可能性があります、私はそれらを見つけることができません:)とにかく、私はcomputeVertexNormalsTrivialで自分自身を計算します。あなたはこの答えから何かを取ることができることを願っています。

関連する問題