[vtkusers] Normal Map

Tim Soper tim_d_soper at yahoo.com
Thu Jul 3 21:49:49 EDT 2008


Karthik,

Thanks so much for your reply, the method you proposed works great. I wanted to clarify how I might use this in a more general sense, say by subclassing vtkWindowToImageFilter which outputs a normal map rather than an image. I have 2 questions:

1. What is the easiest way to find the polyData that the cellID corresponds to? So if I have a render window with multiple actors and polydata, I need to know which polydata owns the cell Id that was found by the vtkVisisbleCellSelector (the guts of that class are a bit hard to understand ).

2. Am I limited to the cell id, (as opposed to the point id). I'm assuming that for polydata that has ComputePointNormals on, I need to recompute with the ComputeCellNormals on using the vtkPolyDataNormals class.

Thanks so much


 Tim Soper


Research Assistant
University of Washington
Department of Bioengineering 
Box 352142



----- Original Message ----
From: Karthik Krishnan <karthik.krishnan at kitware.com>
To: Tim Soper <tsoper at u.washington.edu>
Cc: vtkusers at vtk.org
Sent: Tuesday, July 1, 2008 2:41:12 PM
Subject: Re: [vtkusers] Normal Map

Tim:

I recently added the class vtkScenePicker which may accomplish what you 
need. It uses vtkVisibleCellSelector under the hood.

The scene picker after a PickRender() call can be queried for the cellId 
at every pixel in your render window. So your code would be something 
like...

renWin->Render();
scenePicker->PickRender();
for_each_display_pixel_in_Your_renderWindow
  scenePicker->GetCellId( displayPosition );
  // Retrieve normal for this cell
end_for

The whole thing is done using 1 pick operation.


For further documentation look at vtkVisibleCellSelector:

"This class operates by putting vtkRenderer into new selection modes and 
telling it to render. When the render happens, each visible cell or data 
set is rendered with the color of each cell chosen to encode a unique 
identifier. After one or more selection render passes, the contents of 
the color buffer are read back, and each pixel is examined to identify 
which cell was frontmost in the scene behind it. Because color buffer 
resolution in VTK is limited to 24 bits, up to five passes may be 
required to obtain a complete result. Up to three passes are used to 
find the visible cells within the rendered datasets. One pass selects 
between actors, and another pass is used in parallel composite rendering 
to determine which processor is responsible for each visible cell."

Hope this helps
--
karthik


Tim Soper wrote:
> I don't appear to find any old posts on how to do this, but is there a way to produce a normal map from the render window.  By this, I mean to say that I want to produce an image where each pixel contains the normal of the polydata point that pixel corresponds to.
>
> I've only managed to do this by iteratively picking each point on the image, but this is taking way too much time. If you could recommend a different approach or point me to a previous post that would be much appreciated. Below is my code:
>
> Thanks,
> -Tim-
>
>     //get the size of the render window
>     int* winsize = renWin->GetSize();
>
>     //create the normal image map to be the same size as the window
>     vtkImageData* normalImage = vtkImageData::New();
>     normalImage->SetDimensions( winsize[0], winsize[1], winsize[2] );
>     normalImage->SetScalarTypeToDouble();
>     normalImage->AllocateScalars();
>
>     //get a pointer to the normal map
>     double* dptr = (double*)normalImage->GetScalarPointer();
>
>     //create a picker to access the normal
>     vtkPointPicker* picker = vtkPointPicker::New();
>    
>     //iterate through image  to create a x-valued normal map to start
>     double normal[3];
>     for( int yidx = 0; yidx < winsize[1]; yidx++)
>     {
>         for( int xidx = 0; xidx < winsize[0]; xidx++)
>         {
>             picker->Pick(xidx,yidx,0.0,ren);
>             int id = picker->GetPointId();
>             polyReader->GetOutput()->GetPointData()->GetNormals()->GetTuple( id, normal );
>             *dptr++ = normal[0]; 
>         }
>     }
>
> //THE ABOVE TAKES A TON OF TIME
>
>
>      
> _______________________________________________
> 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
>  

-- 
--
Karthik Krishnan
R & D Engineer,
Kitware Inc,


      



More information about the vtkusers mailing list