POV-Ray : Newsgroups : povray.general : Isosurface takes FOREVER, what can I do Server Time
31 Jul 2024 18:17:48 EDT (-0400)
  Isosurface takes FOREVER, what can I do (Message 1 to 10 of 11)  
Goto Latest 10 Messages Next 1 Messages >>>
From: dave vanhorn
Subject: Isosurface takes FOREVER, what can I do
Date: 15 Dec 2006 12:45:26
Message: <4582df36$1@news.povray.org>
I just posted to scene-files, my "polyheart.pov"

The problem that I'm having is that even with photons and radiosity turned 
way down, this is taking forever to render.  I have the accuracy set to just 
beyond where it needs to be to get the surface defect free, and that's taken 
over a week's spare time rendering to establish.

I'm using a bounding box, just barely bigger than the isosurface.

What else can I do to speed this up?


Post a reply to this message

From: Paul Bourke
Subject: Re: Isosurface takes FOREVER, what can I do
Date: 15 Dec 2006 19:15:00
Message: <web.45833a0015b5c780820eac890@news.povray.org>
> The problem that I'm having is that even with photons and radiosity turned
> way down, this is taking forever to render.  I have the accuracy set to just
> beyond where it needs to be to get the surface defect free, and that's taken
> over a week's spare time rendering to establish.
> I'm using a bounding box, just barely bigger than the isosurface.

I might go back to earlier versions and see where this started .... if you
look here
   http://local.wasp.uwa.edu.au/~pbourke/surfaces_curves/
many of these are rendered using POVRay and isosurface{}, they certainly
used to render quite quickly compared to version 3.6.

-------------------------------------
P a u l   B o u r k e
http://local.wasp.uwa.edu.au/~pbourke/


Post a reply to this message

From: George Pantazopoulos
Subject: Re: Isosurface takes FOREVER, what can I do
Date: 15 Dec 2006 22:15:00
Message: <web.458364a015b5c780c0bad8570@news.povray.org>
"Paul Bourke" <pau### [at] uwaeduau> wrote:
> > The problem that I'm having is that even with photons and radiosity turned
> > way down, this is taking forever to render.  I have the accuracy set to just
> > beyond where it needs to be to get the surface defect free, and that's taken
> > over a week's spare time rendering to establish.
> > I'm using a bounding box, just barely bigger than the isosurface.
>
> I might go back to earlier versions and see where this started .... if you
> look here
>    http://local.wasp.uwa.edu.au/~pbourke/surfaces_curves/
> many of these are rendered using POVRay and isosurface{}, they certainly
> used to render quite quickly compared to version 3.6.
>
> -------------------------------------
> P a u l   B o u r k e
> http://local.wasp.uwa.edu.au/~pbourke/

If all else fails, I created a patched version of MegaPOV that can be used
to render in parallel. I rendered a massive isosurface landscape on 22
dual-core computers, and it only took ~6.5 hours instead of 12 days! ;-)

MegaPOV XRS (Extreme Render System)
http://www.gammaburst.net/xrs


Post a reply to this message

From: dave vanhorn
Subject: Re: Isosurface takes FOREVER, what can I do
Date: 15 Dec 2006 22:39:40
Message: <45836a7c$1@news.povray.org>
I shouldn't need any extreme measures, it's a function that's defined as an 
iso.
Thing is, if I set the accuracy any larger, I get an ugly horizontal defect 
in the middle.

// The Heart Shape
// DONT scale/translate/rotate here!
//


//The function
#declare Heart_Function = function (x, y, z) { pow ( ( 2 * pow ( z, 2 )
                                             + pow ( x, 2 ) + pow ( y, 
2 ) -1 ), 3 )
                                      - ( 0.1 * pow ( z, 2 )
                                      + pow (x, 2 ) ) * pow ( y, 3 )
                                             }
//The heart shape and bounding box
#declare Heart = isosurface { function { Heart_Function (x, y, z) }
                       accuracy 0.000025  // Less than this shows a cutline 
across the middle.

                       max_trace 1 // 1 if solid
                       //max_trace 3         // 3 for simple glass
                       //all_intersections // Or use this for max quality in 
a transparent

                       max_gradient 101   // Pov reports 100 used, and we 
want to be > that

                       //Bump the result by 0.001 before entering here.
                       contained_by { box { < 1.046, 1.20, 0.721 >, -< 
1.046, 0.900, 0.721 > }}
                            }

//finally, the heart as an object
#declare MyHeart =
    object { Heart material  { M_Ruby_Glass }

                   #ifndef(NoPhotons)
                     photons { //collect off
                               refraction on
                               reflection on
                               target  1.0
                             }
                   #end

          }


Post a reply to this message

From: Slime
Subject: Re: Isosurface takes FOREVER, what can I do
Date: 16 Dec 2006 05:15:41
Message: <4583c74d@news.povray.org>
The function you're using has the bad property that its value gets bigger
really fast towards the edge of the contained_by box, but stays close to
zero almost everywhere else (This is because it uses so many pow() calls).
The quick rise in values near the edge necessitates a large max_gradient,
but since the value is so close to zero in most of the area around the
surface, POV-Ray thinks it's near the surface and takes only tiny steps
forward, reevaluating the function each time.

In other words, you're getting the problem you would get if you used a
max_gradient way higher than you needed, but you can't just lower the
max_gradient because there are small parts of the function that actually
*have* that gradient.

The solution is usually to change the function so that it increases at a
steady pace as you move away from the surface (instead of first slow and
then fast). I see that may not be an option for you as the function is
fairly complicated.

It may help to change your contained_by shape to be a sphere, and pack it as
tightly as you possibly can around the heart. This will cut out some of the
parts that have a high gradient and allow you to lower max_gradient.

 - Slime
 [ http://www.slimeland.com/ ]


Post a reply to this message

From: Grassblade
Subject: Re: Isosurface takes FOREVER, what can I do
Date: 16 Dec 2006 06:10:00
Message: <web.4583d38c15b5c780485e86890@news.povray.org>
"dave vanhorn" <mic### [at] gmailcom> wrote:
> I shouldn't need any extreme measures, it's a function that's defined as an
> iso.
> Thing is, if I set the accuracy any larger, I get an ugly horizontal defect
> in the middle.
>
> // The Heart Shape
> // DONT scale/translate/rotate here!
> //
>
>
> //The function
> #declare Heart_Function = function (x, y, z) { pow ( ( 2 * pow ( z, 2 )
>                                              + pow ( x, 2 ) + pow ( y,
> 2 ) -1 ), 3 )
>                                       - ( 0.1 * pow ( z, 2 )
>                                       + pow (x, 2 ) ) * pow ( y, 3 )
>                                              }
> //The heart shape and bounding box
> #declare Heart = isosurface { function { Heart_Function (x, y, z) }
>                        accuracy 0.000025  // Less than this shows a cutline
> across the middle.
>
>                        max_trace 1 // 1 if solid
>                        //max_trace 3         // 3 for simple glass
>                        //all_intersections // Or use this for max quality in
> a transparent
>
>                        max_gradient 101   // Pov reports 100 used, and we
> want to be > that
>
>                        //Bump the result by 0.001 before entering here.
>                        contained_by { box { < 1.046, 1.20, 0.721 >, -<
> 1.046, 0.900, 0.721 > }}
>                             }
>
> //finally, the heart as an object
> #declare MyHeart =
>     object { Heart material  { M_Ruby_Glass }
>
>                    #ifndef(NoPhotons)
>                      photons { //collect off
>                                refraction on
>                                reflection on
>                                target  1.0
>                              }
>                    #end
>
>           }

I wouldn't know, but you can try changing your function. There's another
heart shaped function here, that reportedly renders very quickly:
http://www.econym.demon.co.uk/isotut/real.htm (Yet Another Heart)


Post a reply to this message

From: stm31415
Subject: Re: Isosurface takes FOREVER, what can I do
Date: 16 Dec 2006 10:25:00
Message: <web.45840f0815b5c780cf1900cc0@news.povray.org>
I would use a different heart function, but if that is not an option, split
your isosurface into the par that has the giganitc gradient and the part
that doesn't. Just use two isosurface definitions, each with the same
function but different bounding boxes. One bounding box includes just the
area around the errors, the other takes in the rest. Use as many bits as
you need to keep the max_gradient on the large portion of the final object
low.

-Sam Bleckley
stm 31415 (at) g mail . com


Post a reply to this message

From: dave vanhorn
Subject: Re: Isosurface takes FOREVER, what can I do
Date: 16 Dec 2006 12:15:10
Message: <4584299e@news.povray.org>
> I wouldn't know, but you can try changing your function. There's another
> heart shaped function here, that reportedly renders very quickly:
> http://www.econym.demon.co.uk/isotut/real.htm (Yet Another Heart)

I have that now, and it's workable, but when I put it in my scene, I get a 
parse error.
His file renders correctly, so I must be doing something wrong, but I'm not 
seeing it.

Error is : Expected 'operator', ( found instead

#declare Bend=0.5;
#declare Sharpness=0.8;

#declare Heart = isosurface {
                            function { f_torus 
(y-pow(abs(x),Sharpness)*Bend,z,x,0.8,0.1) }
                            max_gradient 1.5
                            contained_by { sphere {0,1.5}}
                            }

//finally, the heart as an object
#declare MyHeart =
    object { Heart material  { M_Ruby_Glass }

                   #ifndef(NoPhotons)
                     photons { //collect off
                               refraction on
                               reflection on
                               target  1.0
                             }
                   #end

          }


Post a reply to this message

From: Alain
Subject: Re: Isosurface takes FOREVER, what can I do
Date: 16 Dec 2006 16:37:25
Message: <45846715$1@news.povray.org>
dave vanhorn nous apporta ses lumieres en ce 16-12-2006 12:13:
>> I wouldn't know, but you can try changing your function. There's another
>> heart shaped function here, that reportedly renders very quickly:
>> http://www.econym.demon.co.uk/isotut/real.htm (Yet Another Heart)

> I have that now, and it's workable, but when I put it in my scene, I get a 
> parse error.
> His file renders correctly, so I must be doing something wrong, but I'm not 
> seeing it.

> Error is : Expected 'operator', ( found instead

> #declare Bend=0.5;
> #declare Sharpness=0.8;

> #declare Heart = isosurface {
>                             function { f_torus 
> (y-pow(abs(x),Sharpness)*Bend,z,x,0.8,0.1) }
>                             max_gradient 1.5
>                             contained_by { sphere {0,1.5}}
>                             }

> //finally, the heart as an object
> #declare MyHeart =
>     object { Heart material  { M_Ruby_Glass }

>                    #ifndef(NoPhotons)
>                      photons { //collect off
>                                refraction on
>                                reflection on
>                                target  1.0
>                              }
>                    #end

>           } 


f_torus is not deffined. You need to #include "functions.inc"

-- 
Alain
-------------------------------------------------
A critic is a man who knows the way, but can't drive the car.


Post a reply to this message

From: Grassblade
Subject: Re: Isosurface takes FOREVER, what can I do
Date: 16 Dec 2006 16:50:00
Message: <web.4584694015b5c780485e86890@news.povray.org>
"dave vanhorn" <mic### [at] gmailcom> wrote:
> > I wouldn't know, but you can try changing your function. There's another
> > heart shaped function here, that reportedly renders very quickly:
> > http://www.econym.demon.co.uk/isotut/real.htm (Yet Another Heart)
>
> I have that now, and it's workable, but when I put it in my scene, I get a
> parse error.
> His file renders correctly, so I must be doing something wrong, but I'm not
> seeing it.
>
> Error is : Expected 'operator', ( found instead
>
> #declare Bend=0.5;
> #declare Sharpness=0.8;
>
> #declare Heart = isosurface {
>                             function { f_torus
> (y-pow(abs(x),Sharpness)*Bend,z,x,0.8,0.1) }
>                             max_gradient 1.5
>                             contained_by { sphere {0,1.5}}
>                             }
>
> //finally, the heart as an object
> #declare MyHeart =
>     object { Heart material  { M_Ruby_Glass }
>
>                    #ifndef(NoPhotons)
>                      photons { //collect off
>                                refraction on
>                                reflection on
>                                target  1.0
>                              }
>                    #end
>
>           }

My guess is that you need to include functions.inc before declaring this
function. Might it also be an issue with M_Ruby_Glass? I changed it to a
default texture and it rendered correctly. BTW, the funtion you picked is
the heart hoop; the heart function is the other one:
(f_sphere(y-pow(abs(x),0.8)*0.5,z*2,x,0.6).


Post a reply to this message

Goto Latest 10 Messages Next 1 Messages >>>

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