[vtkusers] Rendering/Computing normals of a surface

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


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20130419/8eec8277/attachment.htm>


More information about the vtkusers mailing list