[vtkusers] Rendering/Computing normals of a surface

Bill Lorensen bill.lorensen at gmail.com
Fri Apr 19 13:19:26 EDT 2013


Here is an example that uses ProgrammableGlyphFilter
http://vtk.org/Wiki/VTK/Examples/Cxx/Visualization/ProgrammableGlyphFilter



On Fri, Apr 19, 2013 at 1:17 PM, Bill Lorensen <bill.lorensen at gmail.com>wrote:

> The number of normals msu match the number of points. Off the top of my
> head, you might be able to use the
> // .NAME vtkProgrammableGlyphFilter - control the generation and placement
> of glyphs at input points
> // .SECTION Description
> // vtkProgrammableGlyphFilter is a filter that allows you to place a glyph
> at
> // each input point in the dataset. In addition, the filter is programmable
> // which means the user has control over the generation of the glyph. The
> // glyphs can be controlled via the point data attributes (e.g., scalars,
> // vectors, etc.) or any other information in the input dataset.
> //
>
>
>
> On Thu, Apr 18, 2013 at 6:04 AM, Kilgus, Thomas <
> t.kilgus at dkfz-heidelberg.de> wrote:
>
>> Hi Bill,****
>>
>> ** **
>>
>> that worked out well. Now my normals have the correct color. ****
>>
>>  ****
>>
>> I am still struggling how I could visualize a Subset of normals of my
>> surface. I can select the normal subset like this:****
>>
>> ** **
>>
>>     vtkSmartPointer<vtkFloatArray> normals =
>> vtkSmartPointer<vtkFloatArray>::New();****
>>
>>     normals->SetNumberOfComponents(3);****
>>
>>      vtkSmartPointer<vtkIdList> IDs = //a containing about 200 IDs of all
>> normals I would like to see****
>>
>>       for(int j = 0; j < IDs->GetNumberOfIds(); ++j)****
>>
>>       {****
>>
>>           normals->InsertNextTuple(
>> normalGenerator->GetOutput()->GetPointData()->GetNormals()->GetTuple(IDs->GetId(j))
>> );****
>>
>>       }****
>>
>> ** **
>>
>> However, if I set these normals for my polydata and try to render
>> everything a crash occurs inside the Update() of the glyph3d. I assume that
>> the glyph3d is struggling, because I insert a polydata with 300k points and
>> add only 200 normals. ****
>>
>> ** **
>>
>> I could also select the corresponding 200 points from the polydata and
>> make a new polydata containing 200 points and 200 normals. Is this the
>> “optimal” way to go?****
>>
>>
>> Regards****
>>
>> Thomas****
>>
>> ** **
>>
>> *From:* Bill Lorensen [mailto:bill.lorensen at gmail.com]
>> *Sent:* Montag, 15. April 2013 18:47
>>
>> *To:* Kilgus, Thomas
>> *Cc:* vtkusers at vtk.org
>> *Subject:* Re: [vtkusers] Rendering/Computing normals of a surface****
>>
>> ** **
>>
>> Have you set the ScalarRange on the Mapper? You should set it to the
>> range of your scalar data. If you do not want to display scalar colors,
>> apply SetScalarVisibilityOff() to your mapper.****
>>
>> ** **
>>
>> ** **
>>
>> On Mon, Apr 15, 2013 at 11:51 AM, Kilgus, Thomas <
>> t.kilgus at dkfz-heidelberg.de> wrote:****
>>
>> Hey Bill,****
>>
>>  ****
>>
>> I just figured out that the normals of my Kinect data are indeed there.
>> They are just rendered very small and in dark blue on a black renderwindow.
>> I set the color of the actor to red and don’t use the SetColorMode method
>> of the glyph3d (I tried to use it, but it didn’t change anything). The
>> normals of my ball are rendered in red. Do you have any idea why my Kinect
>> data has blue glyphs and ignores all color calls? Does this “blue” have any
>> meaning? ****
>>
>>  ****
>>
>> Regards,****
>>
>> Thomas****
>>
>>  ****
>>
>> *From:* Bill Lorensen [mailto:bill.lorensen at gmail.com]
>> *Sent:* Freitag, 12. April 2013 16:44****
>>
>>
>> *To:* Kilgus, Thomas
>> *Cc:* vtkusers at vtk.org
>> *Subject:* Re: [vtkusers] Rendering/Computing normals of a surface****
>>
>>  ****
>>
>> The mapping is 1:1. There will be a normal for each point and a normal
>> for each cell.****
>>
>>  ****
>>
>>  ****
>>
>> On Fri, Apr 12, 2013 at 10:30 AM, Kilgus, Thomas <
>> t.kilgus at dkfz-heidelberg.de> wrote:****
>>
>> Sorry, either this example is not the answer to my question or I don’t
>> get it :). ****
>>
>>  ****
>>
>> I have N normals inside a vtkDoubleArray and V vertices inside a
>> vtkPolyData. How can I get the corresponding normal(s) N(j) to vertex V(i).
>> I think i != j, because when splitting is on NumberOfNormals !=
>> NumberOfVertices, or not? In other words, the mapping is NOT 1:1. ****
>>
>>  ****
>>
>> The example simply adds 3 normals to 3 points and here the mapping is 1:1.
>> ****
>>
>>  ****
>>
>> *From:* Bill Lorensen [mailto:bill.lorensen at gmail.com]
>> *Sent:* Freitag, 12. April 2013 16:21****
>>
>>
>> *To:* Kilgus, Thomas
>> *Cc:* vtkusers at vtk.org
>> *Subject:* Re: [vtkusers] Rendering/Computing normals of a surface****
>>
>>  ****
>>
>> Look at this example:****
>>
>> http://vtk.org/Wiki/VTK/Examples/Cxx/PolyData/PolyDataPointNormals****
>>
>>  ****
>>
>>  ****
>>
>> On Fri, Apr 12, 2013 at 9:04 AM, Kilgus, Thomas <
>> t.kilgus at dkfz-heidelberg.de> wrote:****
>>
>> And how would I get the normal of a certain vertex? Especially with
>> SplittingOn()****
>>
>>  ****
>>
>> *From:* Bill Lorensen [mailto:bill.lorensen at gmail.com]
>> *Sent:* Freitag, 12. April 2013 14:57****
>>
>>
>> *To:* Kilgus, Thomas
>> *Cc:* vtkusers at vtk.org
>> *Subject:* Re: [vtkusers] Rendering/Computing normals of a surface****
>>
>>  ****
>>
>> 2) vtkPlaneSource generates normals. Many of the source's do.****
>>
>>  ****
>>
>> After****
>>
>>  normalGenerator->Update();****
>>
>> try****
>>
>> normalGenerator->GetOutput()->Print(std::cout);****
>>
>> to see if there are normals present****
>>
>>  ****
>>
>>  ****
>>
>>  ****
>>
>> On Fri, Apr 12, 2013 at 8:45 AM, Kilgus, Thomas <
>> t.kilgus at dkfz-heidelberg.de> wrote:****
>>
>> Unfortunately, that is a bit complicated and inside our own framework.
>> But basically, this happens:****
>>
>>  ****
>>
>> vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();***
>> *
>>
>> points->SetDataTypeToDouble();****
>>
>> vtkSmartPointer<vtkCellArray> polys =
>> vtkSmartPointer<vtkCellArray>::New();****
>>
>>  ****
>>
>> for loop for all pixels of the depth image****
>>
>> {****
>>
>> Insert 3d point into points****
>>
>>  ****
>>
>> Insert cell points for valid (!=0) points with valid neighbors (simple
>> triangulation)****
>>
>> }****
>>
>>  ****
>>
>> vtkSmartPointer<vtkPolyData> mesh = vtkSmartPointer<vtkPolyData>::New();*
>> ***
>>
>> mesh->SetPoints(points);****
>>
>> mesh->SetPolys(polys);****
>>
>>  ****
>>
>> We also add texture coordinates and scalars, but this is not related to
>> normals, is it?****
>>
>>  ****
>>
>> You can see the details here:
>> http://mitk.org/git/?p=MITK.git;a=blob;f=Modules/ToFProcessing/mitkToFDistanceImageToSurfaceFilter.cpp;h=2b24b193315c2db97bce1d4f8aed90df42c99d1f;hb=HEAD
>> ****
>>
>>  ****
>>
>> My questions 3. and 4.  are not related to the Kinect data, are they?****
>>
>>  ****
>>
>> Regards,****
>>
>> Thomas****
>>
>>  ****
>>
>>  ****
>>
>>  ****
>>
>> *From:* Bill Lorensen [mailto:bill.lorensen at gmail.com]
>> *Sent:* Freitag, 12. April 2013 14:36
>> *To:* Kilgus, Thomas
>> *Cc:* vtkusers at vtk.org
>> *Subject:* Re: [vtkusers] Rendering/Computing normals of a surface****
>>
>>  ****
>>
>> How are you creating your Kinect mesh?****
>>
>>  ****
>>
>> On Fri, Apr 12, 2013 at 8:28 AM, Kilgus, Thomas <
>> t.kilgus at dkfz-heidelberg.de> wrote:****
>>
>> Hi everyone,****
>>
>>  ****
>>
>> I’m trying to compute and render normals of certain vertices of a mesh
>> (in fact a Kinect mesh). I assume that I have to compute the normals via
>> vtkPolyDataNormals and display them using a vtkGlyph3d? ****
>>
>>  ****
>>
>> I observed some strange behavior which really confused me:****
>>
>>  ****
>>
>> 1.       If I create a vtkPlaneSource or load a ball from hard disc and
>> compute normals for that data, everything seems fine. If I load an “open”
>> surface (my Kinect mesh), there are no normals displayed. The documentation
>> says that SetAutoOrientNormals does only work with closed surfaces. But at
>> the moment I don’t care about orientation. There should be normals for at
>> least some vertices of an open mesh, shouldn’t there?****
>>
>> 2.       If I load my Kinect mesh and make a new polydata which contains
>> as much points at (0,0,0) as I have normals and set the normals for the new
>> polydata, the glyph will produce arrows pointing from (0,0,0) to somewhere.
>> This looks pretty good could but could be a random result with empty
>> memory. ****
>>
>> 3.       If I connect my vtkPlaneSource or the ball directly to the
>> glyph (I skip the vtkPolyDataNormals), normals are still rendered
>> correctly. Does this mean my vtkPlaneSource already contains them from the
>> beginning? Are they computed in the background somewhere inside the
>> glyph3d? Is the vtkPolyDataNormals even necessary? This only works for the
>> plane and the ball - not for the Kinect mesh. I can imagine that a plane
>> automatically computes its normal on Update(), but why does my ball have
>> normals already?****
>>
>> 4.       How can I get the normal of a certain vertex Id? If I use
>> vtkFloatArray::SafeDownCast(output->GetPointData()->GetNormals()) are Id’s
>> equal to the vertex Id’s of the polydata? What happens if I turn splitting
>> on and get multiple normals for each vertex? How is the mapping done?****
>>
>>  ****
>>
>> My code looks as follows:****
>>
>>  ****
>>
>> vtkSmartPointer<vtkPolyData> inputPolyData = //load some data****
>>
>>  ****
>>
>>   // Generate normals****
>>
>>   vtkSmartPointer<vtkPolyDataNormals> normalGenerator =
>> vtkSmartPointer<vtkPolyDataNormals>::New();****
>>
>>   normalGenerator->SetInput( inputPolyData );****
>>
>>   normalGenerator->ComputePointNormalsOn();****
>>
>>   normalGenerator->ComputeCellNormalsOff();****
>>
>>   normalGenerator->SetSplitting(0); //I want exactly one normal per vertex
>> ****
>>
>>   normalGenerator->Update();****
>>
>>  ****
>>
>>   vtkSmartPointer<vtkPolyDataMapper> mapperNormals =****
>>
>>       vtkSmartPointer<vtkPolyDataMapper>::New();****
>>
>>  ****
>>
>>   //I chose arrows as representation****
>>
>>   vtkSmartPointer<vtkArrowSource> arrow =
>> vtkSmartPointer<vtkArrowSource>::New();****
>>
>>   arrow->Update();****
>>
>>  ****
>>
>> //use the output of vtkPolyDataNormals as input for the glyph3d****
>>
>> vtkSmartPointer<vtkGlyph3D> glyph =
>> vtkSmartPointer<vtkMaskedGlyph3D>::New();****
>>
>>   glyph->SetInput( normalGenerator->GetOutput() );****
>>
>>   glyph->SetSourceConnection(arrow->GetOutputPort());****
>>
>>   glyph->OrientOn();****
>>
>>   glyph->SetVectorModeToUseNormal();****
>>
>>   glyph->Update();****
>>
>>  ****
>>
>>   mapperNormals->SetInputConnection(glyph->GetOutputPort());****
>>
>>  ****
>>
>> //now follows standard code which could be taken from almost any example…
>> ****
>>
>>   vtkSmartPointer<vtkActor> actorNormals =****
>>
>>       vtkSmartPointer<vtkActor>::New();****
>>
>>   actorNormals->SetMapper(mapperNormals);****
>>
>>  ****
>>
>>   // Create a renderer, render window, and interactor****
>>
>>   vtkSmartPointer<vtkRenderer> renderer =****
>>
>>       vtkSmartPointer<vtkRenderer>::New();****
>>
>>   vtkSmartPointer<vtkRenderWindow> renderWindow =****
>>
>>       vtkSmartPointer<vtkRenderWindow>::New();****
>>
>>   renderWindow->AddRenderer(renderer);****
>>
>>   vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =****
>>
>>       vtkSmartPointer<vtkRenderWindowInteractor>::New();****
>>
>>   vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
>> vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();****
>>
>>   renderWindowInteractor->SetInteractorStyle(style);****
>>
>>   renderWindowInteractor->SetRenderWindow(renderWindow);****
>>
>>  ****
>>
>>   // Add the actor to the scene****
>>
>>   renderer->AddActor(actorNormals);****
>>
>>  ****
>>
>>   // Render and interact****
>>
>>   renderWindow->Render();****
>>
>>   renderWindowInteractor->Start();****
>>
>>  ****
>>
>> Regards,****
>>
>> Thomas****
>>
>>  ****
>>
>>  ****
>>
>> Thomas Kilgus****
>>
>> German Cancer Research Center (DKFZ)****
>>
>> Div. Medical and Biological Informatics ****
>>
>> Junior group: Computer-assisted Interventions (E131)****
>>
>> Im Neuenheimer Feld 280****
>>
>> 69120 Heidelberg, Germany****
>>
>> Phone: +49(0) 6221-42-3545****
>>
>>  ****
>>
>>
>> _______________________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the VTK FAQ at:
>> http://www.vtk.org/Wiki/VTK_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers****
>>
>>
>>
>> ****
>>
>>  ****
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com****
>>
>>
>>
>> ****
>>
>>  ****
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com****
>>
>>
>>
>> ****
>>
>>  ****
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com****
>>
>>
>>
>> ****
>>
>>  ****
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com****
>>
>>
>>
>> ****
>>
>> ** **
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com****
>>
>
>
>
> --
> Unpaid intern in BillsBasement at noware dot com
>



-- 
Unpaid intern in BillsBasement at noware dot com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20130419/3ffa89a9/attachment.htm>


More information about the vtkusers mailing list