[Pbrt-discuss] [pbrt 0000007]: depth of field lens position calculation wrong?

Martin Kraus martin_kraus_germany at yahoo.com
Tue Jun 30 14:14:31 EDT 2009





--- On Tue, 6/30/09, Matt Pharr <matt.pharr at gmail.com> wrote:


> Hmm, it's interesting how confusing

> this can be.  (No thanks to the 

> botched initial explanation in the book!)

>

> I think the issue is that there are a number of equally

> valid solutions.

>

> For starters, we are all in agreement at least that the ray

> should go 

> through the point Pfocus, as it's currently computed, and

> we agree 

> that the lens is in the z=0 plane.  (I think!)


I agree. :)


> For the non-dof case (or the case with lens radius == 0),

> then the 

> regular ray goes through the point (0,0,0) (in camera

> space).  This is 

> made slightly unclear by the clipping plane stuff, since we

> actually 

> start the ray on the hither plane in that case.  But

> if you extend it 

> backwards, it should go through (0,0,0), and if you keep

> going back to 

> z=-clipHither, then it should end up with the x and y

> components 

> negated versus their values at z=clipHither.

>

> Now, if we sample a point on the lens, that point is at

> (lensU, lensV, 

> 0).  We know the ray goes through this point, and we

> also know that it 

> goes through the point Pfocus.  I think that the

> simplest correct 

> solution is to set the ray origin as the point in the lens

> (x and y to 

> lensU and lensV, respectively, and z to zero), and the

> direction to 

> the vector from the origin to Pfocus.


Thanks for this explanation!
I agree, it's possible to set the starting point
onto the lens and having the ray pointing to Pfocus.
However, I'm not sure that this is the "simplest" solution.
(Prior to your explanation I never understood why this
should be correct. :)


> I believe that your solutions will also compute valid

> origins for the 

> ray, but just on the hither plane instead of the z=0

> plane.  But which 

> origin is chosen doesn't matter if the ray's mint value is

> set so that 

> it actually starts on the hither plane.


This change would have to be added, right?


> What do you think?

>

> Thanks,

> -matt


I would prefer my method in order to generate consistent
t values for the case with and without a lens.
Generating the correct depth values is difficult enough
(for example: for comparisons with raster images you
don't need t but the z coordinate of the intersection point).
If you change mint and maxt between a pinhole image
and an image with depth of field, it just gets even
more complicated.

Alternatively, one could have consistent t values if
the starting point is either on the lens or at
(0,0,0) if there is no lens.
That would probably be the best (simplest) solution.

Cheers

Martin



> On Jun 30, 2009, at 2:12 AM, Martin Kraus wrote:

>

> >

> > Hi there!

> >

> > I'm posting this to pbrt-discuss at pbrt.org

> (and authors at pbrt.org)

> > since I seem to be unable to add a note to a bug with

> status

> > "resolved". :)

> >

> >> (Specifically, I think that Martin leaving the +=

> in was a

> >> typo?)

> >

> > No, this is not a typo, both "+=" are necessary since

> > ray->o contains the sampling position on the hither

> plane

> > and this sampling position is moved by some offset due

> to

> > the (additional!) stochastic sampling of the lens.

> > (I would assume that you don't get reasonable images

> when

> > you change the "+=" to "=".)

> > One more comment: reading my explanation again I

> realized

> > that I made a mistake:

> >

> >> We know that Pfocus.z = FocalDistance -

> ClipHither

> >

> > Actually, this should read: "Pfocus.z =

> FocalDistance"

> > Sorry about that, (I guess I got confused because the

> > sampling position is at z = ClipHither).

> >

> > Cheers

> >

> > Martin

> >

> >

> ________________________________________________________________________

> > Dr. Martin Kraus, TU Muenchen, Informatik 15

> > Boltzmannstrasse 3, 85748 Garching,  Germany

> > Room: 02.13.055.   E-mail: krausma at in.tum.de

> > Phone: +49 (0)89 289 19482.   Fax: ...

> 19462

> >

> >

> > --- On Tue, 6/30/09, Mantis Bug Tracker <authors at pbrt.org>

> wrote:

> >

> >> From: Mantis Bug Tracker <authors at pbrt.org>

> >> Subject: [pbrt 0000007]: depth of field lens

> position calculation 

> >> wrong?

> >> To: martin_kraus_germany at yahoo.com

> >> Date: Tuesday, June 30, 2009, 1:59 AM

> >>

> >> The following issue has been RESOLVED.

> >> =

> >>

> =====================================================================

> >>

> >> http://pbrt.org/bugtracker/view.php?id=7

> >>

> >> =

> >>

> =====================================================================

> >>

> >> Reported By:

> >>    mmp

> >> Assigned To:

> >>    mmp

> >> =

> >>

> =====================================================================

> >>

> >> Project:

> >>      pbrt

> >> Issue ID:

> >>     7

> >> Category:

> >>

> >> Reproducibility:

> >> always

> >> Severity:

> >>     feature

> >> Priority:

> >>     normal

> >> Status:

> >>       resolved

> >> Resolution:

> >>   fixed

> >> Fixed in Version:

> >>

> >> =

> >>

> =====================================================================

> >>

> >> Date Submitted:

> >>   2004-06-28 20:46 EDT

> >> Last Modified:

> >>  2009-06-29 19:59 EDT

> >> =

> >>

> =====================================================================

> >>

> >> Summary:

> >>      depth of field lens position

> >> calculation wrong?

> >> Description:

> >> (Ren Ng)

> >>

> >> Shouldn't the correction for depth of field

> >> (perspective.cpp) be

> >>

> >>

> >> ray->o.x = lensU;

> >>

> >> ray->o.y = lensV;

> >>

> >> ray->d = Pfocus - ray->o;

> >>

> >> rather than

> >>

> >>

> >> ray->o.x += lensU;

> >>

> >> ray->o.y += lensV;

> >>

> >> ray->d = Pfocus - ray->o;

> >> ?

> >>

> >> Seems like you just want to restart the ray on a

> random

> >> position on the

> >> lens, not offset it, or am I not understanding

> something?

> >>

> >>

> >>

> >>

> >> (I think he's right, but think that we do

> effectively gives

> >> the same

> >> result.  i.e. our end result is still

> correct, just

> >> doesn't match the way

> >> the book explains it.)

> >> =

> >>

> =====================================================================

> >>

> >>

> >>

> ----------------------------------------------------------------------

> >>

> >> (0000002) humper (administrator) - 2004-06-28

> 21:05

> >> http://pbrt.org/bugtracker/view.php?id=7#c2

> >>

> ----------------------------------------------------------------------

> >>

> >> Hmm, it seems like our code assumes that the lens

> is

> >> basically centered

> >> around the image sample point in camera

> space.  This

> >> might cause DOF errors

> >> near the edges of the film (and might also affect

> >> vignetting effects).

> >>

> >>

> ----------------------------------------------------------------------

> >>

> >> (0000079) Martin Kraus (reporter) - 2006-12-06

> 18:00

> >> http://pbrt.org/bugtracker/view.php?id=7#c79

> >>

> ----------------------------------------------------------------------

> >>

> >> Hello!

> >>

> >> I'm very new to pbrt (I have never used it, just

> read a few

> >> chapters of

> >> the book); thus, I might get a lot of things

> wrong.

> >> Anyways, I wanted to

> >> report a bug in the very same lens position

> calculation,

> >> but i think the

> >> correct solution is a little more complicated.

> Even worse,

> >> the explanation

> >> in the book is incorrect because the updated ray

> origin is

> >> not on the lens

> >> but still on the near clipping plane. 

> However, this

> >> is a rather small

> >> detail since the updated ray origin is at the

> correct

> >> intersection point of

> >> the near clipping plane with a line from the

> sample point

> >> on the lens and

> >> the point on the plane of focus, if the

> computation on page

> >> 272 is adjusted

> >> this way:

> >>

> >> <Update ray for effect of lens> ==

> >>    ray->o.x += lensU * (FocalDistance

> -

> >> ClipHither) / FocalDistance;

> >>    ray->o.y += lensV * (FocalDistance

> -

> >> ClipHither) / FocalDistance;

> >

> >>    ray->d = Pfocus - ray->o;

> >>

> >> Here is my reasoning: In the model of a pinhole

> camera I

> >> imagine the image

> >> plane to be at z = -ClipHither, i.e. behind the

> origin

> >> (0,0,0) (the image

> >> plane is symmetric to the near clipping plane at z

> =

> >> +ClipHither). The

> >> center of the lens is actually at the origin and

> its plane

> >> is parallel to

> >> the image plane (and the near clipping plane).

> Now, the

> >> unperturbed ray is

> >> actually going through the center of the lens

> (because it

> >> goes through the

> >> pinhole, i.e., the origin); therefore, the

> computation of

> >> Pfocus is

> >> correct. The point on the lens, however, is at

> (lensU,

> >> lensV, 0) and we

> >> should find the intersection of the line from this

> point

> >> (lensU, lensV, 0)

> >> to Pfocus at z = ray->o.z = ClipHither (i.e. on

> the near

> >> clipping plane).

> >>

> >> We know that Pfocus.z = FocalDistance - ClipHither

> (by

> >> definition, since

> >> it is on the focal plane); moreover, the

> intersection of

> >> the line from the

> >> origin (0,0,0) to Pfocus is at the unperturbed ray

> origin

> >> (ray->o). Think

> >> of this line with fixed point Pfocus and move the

> starting

> >> point from the

> >> origin (0,0,0) to the sample point on the lens at

> >> (lensU,lensV,0). How does

> >> the intersection point at z=+ClipHither move?

> Well, by

> >> (lensU,lensV,0) *

> >> (FocalDistance - ClipHither) / FocalDistance!

> Thus, we have

> >> to translate

> >> ray->o by this translation to get to the

> updated

> >> intersection point on the

> >> near clipping plane.

> >>

> >> Why does the original code (without the scaling

> by

> >> (FocalDistance -

> >> ClipHither) / FocalDistance) give reasonable

> results?

> >> Because it is a very

> >> reasonable approximation to set the missing factor

> to 1

> >> since ClipHither

> >> will usually be much smaller than FocalDistance.

> >> However(!), for very

> >> blurred objects very near to the near clipping

> plane there

> >> will probably be

> >> notable differences.

> >>

> >> Well, that's what I think about this. I would

> appreciate

> >> any comments!

> >>

> >> BTW: great book! :)

> >>

> >> Martin Kraus

> >>

> >>

> ----------------------------------------------------------------------

> >>

> >> (0000085) Martin Kraus (reporter) - 2007-01-24

> 13:14

> >> http://pbrt.org/bugtracker/view.php?id=7#c85

> >>

> ----------------------------------------------------------------------

> >>

> >> One more note: I realized that (FocalDistance -

> ClipHither)

> >> / FocalDistance

> >> is a constant factor for the whole scene, thus,

> the bug can

> >> be compensated

> >> by a scaling of the lens radius. For actual

> values, e.g.

> >> the dragons scene

> >> with extreme blurring as in Figure 6.9 with a

> lensradius of

> >> 0.05,

> >> focaldistance of 0.75 and default hither of 0.001,

> the

> >> missing factor is

> >> (0.75-0.001)/0.75=0.998666...; i.e., you can get

> the

> >> "correct" image with

> >> the incorrect code by setting the lensradius to

> >> 0.0499333... instead of

> >> 0.05. Of course, the difference is hardly

> noticable.

> >>

> >> Martin Kraus

> >>

> >>

> ----------------------------------------------------------------------

> >>

> >> (0000120) mljackpbrt (reporter) - 2008-03-24

> 11:42

> >> http://pbrt.org/bugtracker/view.php?id=7#c120

> >>

> ----------------------------------------------------------------------

> >>

> >> I agree with Martin Kraus's proposal. The

> Luxrender will

> >> fix it according

> >> to his notes.

> >>

> >>

> ----------------------------------------------------------------------

> >>

> >> (0000130) mmp (administrator) - 2009-06-29 19:59

> >> http://pbrt.org/bugtracker/view.php?id=7#c130

> >>

> ----------------------------------------------------------------------

> >>

> >> Fixed (finally) in the upcoming 1.04 release as

> well as

> >> pbrt 2.0.  I

> >> believe that the correct implementation combines

> Martin and

> >> Ren's:

> >>

> >> ray->o.x = lensU * (FocalDistance - ClipHither)

> /

> >> FocalDistance;

> >> // etc

> >>

> >> (Specifically, I think that Martin leaving the +=

> in was a

> >> typo?)

> >>

> >> Issue History

> >> Date Modified    Username

> >>   Field

> >>          Change

> >>

> >> =

> >>

> =====================================================================

> >>

> >> 2004-06-28 20:46 mmp

> >>  New Issue

> >>

> >>

> >> 2004-06-28 21:05 humper

> >>   Note Added: 0000002

> >>

> >>

> >> 2006-12-06 18:00 Martin

> Kraus   Note Added:

> >> 0000079

> >>

> >> 2006-12-06 18:01 Martin

> Kraus   Issue

> >> Monitored: Martin Kraus

> >>

> >>

> >> 2006-12-06 18:01 Martin

> Kraus   Issue End

> >> Monitor: Martin Kraus

> >>

> >>

> >> 2006-12-06 18:01 Martin

> Kraus   Issue

> >> Monitored: Martin Kraus

> >>

> >>

> >> 2007-01-24 13:14 Martin

> Kraus   Note Added:

> >> 0000085

> >>

> >> 2008-03-24 11:42 mljackpbrt 

>    Note

> >> Added: 0000120

> >>

> >> 2008-03-24 11:42 mljackpbrt 

>    Issue

> >> Monitored: mljackpbrt

> >>

> >> 2009-06-29 19:59 mmp

> >>  Note Added: 0000130

> >>

> >> 2009-06-29 19:59 mmp

> >>  Status

> >>       new => resolved

> >>

> >> 2009-06-29 19:59 mmp

> >>  Resolution

> >>   open => fixed

> >>

> >> 2009-06-29 19:59 mmp

> >>  Assigned To

> >>   => mmp

> >>

> >> =

> >>

> =====================================================================

> >>

> >>

> >

> >

> >

> >

> >

> > _______________________________________________

> > pbrt-discuss mailing list

> > pbrt-discuss at pbrt.org

> > http://six.pairlist.net/mailman/listinfo/pbrt-discuss

>

>






More information about the pbrt-discuss mailing list