[vtk-developers] fixing camera-tracking lights in vtk

Lisa Sobierajski Avila lisa.avila at kitware.com
Wed Aug 9 07:59:03 EDT 2000


Hello Michael,

Is it really necessary to break up the light collection into two? Can't 
that functionality be achieved with a flag in the light? I think this would 
solve some of your problems.

What if you have a transformation applied to a light, and you call 
GetFocalPoint - do you get the focal point as it is set (before it is 
transformed)? Is so, then transforming a light will break a bunch of things 
(notably all of volume rendering). I think we need to compare the setting / 
getting of the light  position / orientation information with that of the 
prop - are they similar or will it confuse users?

Lisa


At 12:30 AM 8/9/2000, Michael Halle wrote:

>Hey there,
>
>I've implemented some improvements to the way VTK handles its lights.
>Specifically, I've moved the ability to have lights attached to the
>camera out of the interactors and into the renderers.  While the
>changes are good things, I need some help in thinking through legacy
>issues before I commit any more changes.  Any comments will be
>helpful!
>
>In vtk 3.1 release, lights are defined in world space coordinates and
>stuck onto the renderer.  The interactors have a flag
>(LightFollowCamera).  If the flag is set, the interactor moves the
>"CurrentLight" to the current position of the camera every time a
>frame is rendered.
>
>There a few limitations with this plan.  First, every interactor
>re-implements this functionality.  Next, what's a "CurrentLight"?
>What's more, what if I want more than one, or want my lights offset
>from the camera position but still attached to it?  What if I don't
>want to use an interactor?
>
>It's so hard to deal with this situation that essentially none of the
>examples in vtk use lighting other than a "headlight," the built-in
>camera tracking functionality.  The headlight is, arguably, one of
>the worst lights for showing the shape of the object.
>
>Here's my fix.  I've added a transformation matrix to each light
>(vtkLight).  If the matrix is set, the light should be transformed by
>the matrix.  I've implemented the transform functionality in
>vtkOpenGLLight, since I can just dump a matrix into the graphics pipe.
>I've also added two convenience methods in vtkLight:
>GetTransformedPosition() and GetTransformedFocalPoint().  These
>methods are exactly analogous to GetPosition() and GetFocalPoint()
>except they use the transform if it is set.  This matrix can be used
>for a bunch of stuff, but I specifically use it to track the camera.
>
>Next, I defined a new coordinate system called the
>CameraLightTransform.  In this space, the camera is at (0, 0, 1), up
>being (0, 1, 0), looking at (0, 0, 0), and the focal distance is
>scaled to 1.  The space is centered around the lookat point, so it's
>easy to position lights around what you've looking at.  I've added to
>methods to vtkCamera to compute and get the CameraLightTransformMatrix.
>
>Since the changes to vtkLight, vtkOpenGLLight, and vtkCamera don't have
>any backwards compatibility issues, I checked them in.
>
>I've also hacked vtkRenderer/vtkOpenGLRenderer to add the camera
>tracking functionality. I added a new collection of lights called
>CameraLights.  Every time the scene gets rendered, the renderer
>traverses the CameraLights collection and sets each Light's matrix to
>be the CameraLightTransformMatrix from the camera.  Both the normal
>and the camera lights get rendered as normal.  Thus, the camera lights
>track the camera's coordinate system.
>
>To avoid confusion, I created another collection of lights, called
>SceneLights, that are do not track the camera like CameraLights do.
>Having SceneLights and CameraLights collections fixes the inherent
>ambiguity of the current codebase in distinguishing between the two
>types.
>
>Okay, works great, looks great.  The problems are all related to
>backwards compatibility.  There's lots of existing code in vtk that
>reimplements camera tracking.  I'd love to be able to strip it all
>out, but code outside the vtk distribution does the same thing and
>will break too.  Here are the major problems:
>
>* LightFollowCamera is now obsolete: you control if a light follows
>the camera if you add it using AddSceneLight or AddCameraLight.
>
>* Any code that expects to get all the lights in the scene using
>GetLights() will be disappointed.  That's probably okay, because
>exporters really needed a way to distinguish between, say, headlights
>and fixed lights, and now they can be updated to do the right thing.
>
>* The CreatedLight for vtkRenderer is now a CameraLight located at (0,
>0, 1), looking at (0, 0, 0).  It's Position and FocalPoint never needs
>to be touched.
>
>* Some code used GetLights() to find a light to track the camera, and
>it's in several places in the source tree.  Basically, the code gets
>the light collection using GetLights(), begins traversing it, finds
>the first light, calls it the CurrentLight, and sets its position and
>focal point to correspond to the current camera.  Well, this code is
>now unnecessary.  However, if there is only one CameraLight, the
>Lights collection is empty, CurrentLight is NULL, and the code dies
>dereferencing it.  It doesn't help to point CurrentLight to the
>CameraLight, since we don't want the light's position and focal point
>updated.
>
>I sort of solved the problem by creating a fake light in the
>vtkRenderer constructor called "CreatedLightCompat."  I turn it off,
>and I add it to the legacy Lights collection.  When simple-minded code
>calls the deprecated GetLights() method, they get a handle to this
>fake light, don't dump core, and merrily set its Position and
>FocalPoint.  The Lights collection doesn't actually get fed to the
>graphics pipe.  Since the light doesn't get rendered, nothing bad
>happens.  Since all the code was trying to do was produce a
>"headlight," and that's what the default light is, the visual results
>are as expected even though the code is disabled.  Calls to AddLight()
>and GetLights() generate a deprecation warning.  This "Compatibility"
>light is conditionally compiled in so it can be removed someday.
>
>* Then there's the part of the code base and test suite that has to be
>changed to reflect the new lighting flexibility.  Most of the
>interactors are easy.  Since lighting was so hard to do right before,
>not too many tests used interesting lighting, so there aren't too many
>non-headlight examples that will break.  The mainline
>vtkOpenGLRenderer is an easy fix, and I've got it; the other renderers
>will take time, and I don't know them very well.
>
>So, what's the best way to make the change to vtkRenderer/vtkOpenGLRenderer
>and then the rest of the affected code?
>
>Thanks for your ideas.
>
>Michael Halle
>mhalle at bwh.harvard.edu
>
>
>
>_______________________________________________
>vtk-developers mailing list
>vtk-developers at public.kitware.com
>http://public.kitware.com/mailman/listinfo/vtk-developers






More information about the vtk-developers mailing list