2013-04-11 2 views
1

두 polydata 개체 사이의 최소 거리를 확인하려고 vtk를 사용하고 있습니다. 최소 거리를 결정하기 위해 vtkDistancePolyDataFilter을 사용하고 있지만이 최소 결과를 정의하는 각 객체에서 연관된 x, y, z 점을 어떻게 결정합니까?두 개의 vtkPolyData 객체간에 가장 근접한 접근법 벡터를 그립니까?

아래의 최소 예제는 원통과의 거리에 따라 입방체의 색을 지정합니다. 대신 각 vtkPolyData 개체의 가장 가까운 점 사이에 vtkLine을 그려야합니다. vtkDistancePolyDataFilter의 결과에는 큐브 오브젝트에 대한 셀, 법선 및 거리가 포함되어있는 것처럼 보입니다. 그러나 최소 거리 또는이 점이 실린더의 점과 어떤 관련이 있는지 쉽게 알아낼 수 없습니다.

편집 :vtkDistancePolyDataFilter이 최소 거리를 정확하게 계산하고 있다고 확신하지 않습니다. 꼭지점 - 버텍스 상호 작용 만하는 것처럼 보입니다.

import vtk 

ren = vtk.vtkRenderer() 
renWin = vtk.vtkRenderWindow() 
renWin.AddRenderer(ren) 
iren = vtk.vtkRenderWindowInteractor() 
iren.SetRenderWindow(renWin) 

cube = vtk.vtkCubeSource() 
cube.SetCenter (1.2, 0.3, 0.4); 

transform = vtk.vtkTransform() 
transform.RotateX(45) 
transform.RotateY(45) 
transform.Translate((1.2,0.2,0)) 

tf = vtk.vtkTransformPolyDataFilter() 
tf.SetInput(cube.GetOutput()) 
tf.SetTransform(transform) 
tf.Update() 

cubeMapper = vtk.vtkPolyDataMapper() 
cubeMapper.SetInput(tf.GetOutput()) 
cubeActor = vtk.vtkActor() 
cubeActor.SetMapper(cubeMapper) 

#Create Cylinder 
cylinder = vtk.vtkCylinderSource() 
cylinder.SetHeight(2) 
cylinderMapper = vtk.vtkPolyDataMapper() 
cylinderMapper.SetInput(cylinder.GetOutput()) 
cylinderActor = vtk.vtkActor() 
cylinderActor.SetMapper(cylinderMapper) 

#Determine distance btwn Cylinder and Cube 
distfilt = vtk.vtkDistancePolyDataFilter() 
distfilt.SetInputConnection(1, tf.GetOutputPort()) 
distfilt.SetInputConnection(0, cylinder.GetOutputPort()) 
distfilt.Update() 

#Color the cube based on distance to cylinder 
distmapper = vtk.vtkPolyDataMapper() 
distmapper.SetInputConnection(distfilt.GetOutputPort(1)) 
distmapper.SetScalarRange(\ 
    distfilt.GetOutput().GetPointData().GetScalars().GetRange()[0], 
    distfilt.GetOutput().GetPointData().GetScalars().GetRange()[1],) 

distactor = vtk.vtkActor() 
distactor.SetMapper(distmapper) 

distarray = distfilt.GetOutput().GetPointData().GetScalars() 
for i in range(24): 
    print distarray.GetValue(i) 
    # Minimum distance is the lowest of these results, but what are the 
    # Corresponding points on the cylinder and cube? 

scalarBar = vtk.vtkScalarBarActor() 
scalarBar.SetLookupTable(distmapper.GetLookupTable()) 
scalarBar.SetTitle("Distance") 
scalarBar.SetNumberOfLabels(5) 

ren.AddActor(cubeActor) 
ren.AddActor(cylinderActor) 
ren.AddActor(distactor) 
ren.AddActor2D(scalarBar) 

iren.Initialize() 
renWin.Render() 
iren.Start() 

답변

0

이것은 VTK로 직접 수행 할 수 없습니다. 물리/운동학/충돌 라이브러리가 필요합니다. 현재 Bullet이 VTK로 작업하는 데 어떤 역할을하는지 살펴보고 있습니다.

관련 문제