[vtkusers] How to compute intersection between surface polydata in vtk?
Jean-Dominique Barnichon
jeando.barnichon at free.fr
Thu Apr 6 16:42:22 EDT 2006
Michael,
thanks for pointing me there.
I gave it a try, but I'm actually stuck.
Config: winXp(SP2) + msvc7.0 + vtk5.0.
So I downloaded everything required from bioengineering web site
(vtkBioeng.zip), ran cmake and eventually built vtkBioeng library as a
shared library (vtkBioeng.dll). So far so good.
Then I translated most of the testCollisionDetection.tcl sample given
from tcl to c++ (see code below)
When I run it, I end up with an error located at the following line:
vtkCollisionDetectionFilter *collide =
vtkCollisionDetectionFilter::New();
Trying to debug it, an access violation is reported in the constructor
of vtkCollisionDetectionFilter, at line #4 :
this->Inputs[0] = NULL;
Apparently, from what I understand, it looks like the array Inputs[]
(inherited from vtkPolyDataSource) is not initialized (value is 0x00000000).
In case you have you already tested this sample :
- did you experience similar problem?
- if no, was it in c++ or in tcl, with which vtk version 4.x or 5.x?
Thanks for helping
Jean-Do
File testCollisionDetection.cpp
#include "vtkProperty.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkCamera.h"
#include "vtkSphereSource.h"
#include "vtkMatrix4x4.h"
#include "vtkCollisionDetectionFilter.h"
#include "vtkGlyph3D.h"
#include "vtkInteractorStyleJoystickActor.h"
#include "vtkTextActor.h"
int _tmain(int argc, _TCHAR* argv[])
{
vtkSphereSource *sphere0 = vtkSphereSource::New();
sphere0->SetPhiResolution(30);
sphere0->SetThetaResolution(30);
sphere0->SetCenter(-0.7, 0, 0);
sphere0->Update();
vtkSphereSource *sphere1 = vtkSphereSource::New();
sphere1->SetPhiResolution(30);
sphere1->SetThetaResolution(30);
sphere1->Update();
vtkMatrix4x4 *matrix0 = vtkMatrix4x4::New();
vtkMatrix4x4 *matrix1 = vtkMatrix4x4::New();
vtkCollisionDetectionFilter *collide =
vtkCollisionDetectionFilter::New();
collide->SetInput(0, sphere0->GetOutput());
collide->SetMatrix(0, matrix0);
collide->SetInput(1, sphere1->GetOutput());
collide->SetMatrix(1, matrix1);
collide->SetBoxTolerance(0.0);
collide->SetCellTolerance(0.0);
collide->SetNumberOfCellsPerBucket(2);
//collide->SetCollisionModeToFirstContact();
collide->GeneratePolydataOutputOn();
// collide->AddObserver->EndEvent(cbCollision());
vtkTextActor *txt = vtkTextActor::New();
vtkSphereSource *point = vtkSphereSource::New();
point->SetRadius(0.01);
vtkPolyData *pointdata = vtkPolyData::New();
pointdata->SetPoints(collide->GetContactPoints());
vtkGlyph3D *points = vtkGlyph3D::New();
points->SetInput(pointdata);
points->SetSource(point->GetOutput());
vtkPolyDataMapper *mapper1 = vtkPolyDataMapper::New();
mapper1->SetInput(collide->GetOutput());
vtkActor *actor1 = vtkActor::New();
actor1->SetMapper(mapper1);
(actor1->GetProperty())->BackfaceCullingOn();
actor1->SetUserMatrix(matrix0);
vtkPolyDataMapper *mapper2 = vtkPolyDataMapper::New();
mapper2->SetInput(collide->GetOutput(1));
vtkActor *actor2 = vtkActor::New();
actor2->SetMapper(mapper2);
(actor2->GetProperty())->BackfaceCullingOn();
actor2->SetUserMatrix(matrix1);
vtkPolyDataMapper *mapper3 = vtkPolyDataMapper::New();
mapper3->SetInput(points->GetOutput());
vtkActor *actor3 = vtkActor::New();
actor3->SetMapper(mapper3);
(actor3->GetProperty())->SetColor(0,0,0);
vtkRenderer *ren = vtkRenderer::New();
ren->AddActor(actor1);
ren->AddActor(actor2);
//ren AddObserver EndEvent ChangeOrigin
//ren AddActor actor3
ren->AddActor(txt);
ren->SetBackground(0.5,0.5,0.5);
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren);
vtkInteractorStyleJoystickActor *istyle =
vtkInteractorStyleJoystickActor::New();
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
iren->SetInteractorStyle(istyle);
iren->Initialize();
renWin->Render();
iren->Start();
}
> If both of your inputs are polydata, this filter might be useful:
>
> http://www.bioengineering-research.com/vtk/vtkCollisionDetectionFilter.htm
>
>
>
> On Apr 2, 2006, at 12:20 AM, Jean-Dominique Barnichon wrote:
>
>> One of the surface is not a plane, it is a polyplane (i.e. a 2D (xy)
>> polyline extruded along the z direction.
>> Jean-Do
>>
>> Bill Lorensen a écrit :
>>> If one surface is a plane, you can use ClipPolyData and define an
>>> implicit plane as the clipper.
>>>
>>> Bill
>>>
>>> At 09:13 AM 4/1/2006, Jean-Dominique Barnichon wrote:
>>>> Dear all,
>>>>
>>>> I need to find the intersection between two surfaces, each one
>>>> being defined as a polydata (actually one surface is a vertical
>>>> polyplane, and the other one is a topographical surface).
>>>>
>>>> Such intersection operation is already effective in other libraries
>>>> such as CGAL (http://www.cgal.org) and GTS
>>>> (http://gts.sourceforge.net).
>>>> However, it is still not clear to me which approach i should follow
>>>> to perform such an operation with vtk.
>>>> From what i understood, one can either :
>>>> - use vtkOBBTree::IntersectWithOBBTree(...), but in this case the
>>>> related parameters (especially the int(*function)) are not obvious
>>>> to me. Would it be possible to have a bit more information on this
>>>> method and its usage?
>>>> - treat polydata as an implicit surface using the
>>>> vtkImplicitPolydata class (proposed by Dave Pont), which then
>>>> allows to use vtkClipPolyData class (though this class is not part
>>>> of vtk, yet?).
>>>>
>>>> Recently, there has been quite few threads related to very similar
>>>> topics, but i did not get whether involved people have eventually
>>>> succeeded or not in computing the intersection using one of the
>>>> above mentioned method.
>>>>
>>>> Any help/advice is welcomed.
>>>> Thanks in advance
>>>> Jean-Do
>>>> _______________________________________________
>>>> This is the private VTK discussion list. Please keep messages
>>>> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>
>>>
>>>
>>
>> _______________________________________________
>> This is the private VTK discussion list. Please keep messages
>> on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers
>>
>
>
>
More information about the vtkusers
mailing list