POV-Ray : Newsgroups : povray.general : isosurface functions : Re: isosurface functions Server Time
25 Apr 2024 05:54:27 EDT (-0400)
  Re: isosurface functions  
From: jceddy
Date: 6 Jul 2022 18:05:00
Message: <web.62c6068f8c6c70ad864166f75d51d79c@news.povray.org>
"Chris R" <car### [at] comcastnet> wrote:
> Alain Martel <kua### [at] videotronca> wrote:
>
> > > For some recent modeling work, I have had a need to create various objects based
> > > on cylinder-based shapes, varying the radius of the cylinder based on the
> > > y-axis.
> > >
> > > Examples:
> > > sqrt(x*x+z*z) - Radius // cylinder
> > > sqrt(x*x+z*z) - Radius*y/Height // inverted cone
> > >
> > > These seem to render as isosurfaces pretty consistently without high
> > > max_gradients or the need for high accuracy.
> > >
> > > However:
> > > sqrt(x*x+z*z) - Radius*(pow(y/Height,2)) // quadratic
> > > or
> > > sqrt(x*x+z*z) - Radius*sqrt(y/Height)
> > >
> > > is causing the object to look semi-transparent, allowing light to pass through
> > > it in an almost even distribution.
> > >
> > > In a fit of frustration, after trying very high accuracy and max_gradient
> > > values, I tried
> > >
> > > sqrt(x*x+z*z) - Radius*sin(0.5*pi*y/Height)
> > >
> > > and the object looks completely solid.
> > >
> > > So, I'm wondering what in the isosurface code could cause this difference?
> > >
> > > -- Chris R.
> > >
> > >
> >
> > What do you consider high and very high max_gradient ?
> > Same for accuracy ?
> >
> > For sqrt(x*x+z*z) - Radius, the gradient should be barely above 1.
> >
> > For sqrt(x*x+z*z) - Radius*(pow(y/Height,2)), it tends to infinity
> > around Height of zero. You are squaring a value that tent to infinity as
> > it approach zero.
> > Same for Radius*sqrt(y/Height), as y/Height tends toward infinity as
> > height get near zero. Taking the square root delays it only slightly.
> > Both will have at least some parts that go above max_gradient, even of
> > you set it to 10000000 or more.
> >
> > One thing that you can do is to split the object. Pieces for the Height
> > values larger than 0.01 and smaller than -0.01, and a slice for the
> > -0.01..0.01 range. You may want to not use that slice at all.
> >
> > You may also hide the problem by using a container sized to not contain
> > the problem area. contained_by{ sphere{0,5*Radius scale<1, 1000, 1>} }
>
> Sorry, I should have been clearer in labeling the variables.  For any given
> object, Radius and Height are fixed values, while x, y, and z vary over the
> isosurface boundaries.  So, pow(y/Height,2) and sqrt(y/Height) both range
> between 0 at y=0 and 1 at y=Height.
>
>
> -- Chris R.

Any chance you can give a sample Radius/Height where the problem happens, and
what the contained_by is? I ran some quick tests and wasn't able to reproduce
what you are seeing (used Radius/Height of 0.5 and a contained_by { box { -1.2,
1.2 } }


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.