![](/i/fill.gif) |
![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
I've been experimenting a lot with creating mountains using isosurfaces, but
I can't seem to quite get it right.
I've been using a paraboloid function as the basic shape (x^2+y+z^2). I have
been trying to use pattern noise to carve out parts to make it look more
like a real mountain. I've mainly been using crackle and agate, since they
seem the closest to what I want.
The problem is that when I make the noise large enough (either by scaling
the #declared pigment function in the declaration, or by increasing the
multiplier at the end of subtracting it from the base function, or both),
it always leaves "floaters"... pieces of terrain that are not actually
connected or are connected by very thin sections to the main object. If I
make the noise small enough to prevent this from being noticeable, the
general silhouette of the mountain is still a perfect paraboloid and looks
very unnatural.
The bottom of the mountain doesn't matter at all because I have a fog layer
acting as low-flying clouds that completely obscure the lower elevations.
I think the problem is finding a good medium between the scaling of the
whole isosurface and the scaling of the noise. Right now I am using the
following measurements:
the base function: (x*x)/5000 + y/90 + (z*z)/5000
the pigment function: there are two, actually. One is crackle scale 50 and
the other is agate scale 5. Both are subtractive (meaning I use "+") from
the base shape.
contained_by: a box, with -500,500 as measurements.
Now, I have seen some great isosurface work before (particularly I remember
an entry in the Asia IRTC that had photorealistic terrain entirely made
with isosurfaces)... Anyone have an suggestions on what I could do? Thanks.
-Justin Smith
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
This is something I'd like to do somehow too. I think it needs to be kind of
fractalized, iterations from large to small perturbations. Unfortunately,
people were discussing function-made fractals elsewhere here at the
newsgroups and seemed this isn't possible because recursive calls into a
function aren't allowed. Or I hadn't noticed if anyone said there was a way.
Obviously you realize what needs to be done and just have not found a
suitable answer. Hope you do.
I worked a bit from your description and got a lumpy mountain that looks
like some sort of Baked Alaska desert. It's goofy but thought it was
interesting, isosurfaces usually are.
See script below your quote if you'd like...
--
Farewell,
Bob
"Justin Smith" <t74### [at] yahoo com> wrote in message
news:web.3d9bb34c33fc79509a66a6680@news.povray.org...
>
> The problem is that when I make the noise large enough (either by scaling
> the #declared pigment function in the declaration, or by increasing the
> multiplier at the end of subtracting it from the base function, or both),
> it always leaves "floaters"... pieces of terrain that are not actually
> connected or are connected by very thin sections to the main object. If I
> make the noise small enough to prevent this from being noticeable, the
> general silhouette of the mountain is still a perfect paraboloid and looks
> very unnatural.
// needs AA or there are terrible lines
light_source {
-10000*z, 1
rotate <45,45,0>
}
camera {
location -150*z
look_at -10*y
angle 40
rotate <15,0,0>
}
#declare F_Paraboloid=
function {
(x*x+y+z*z)
}
#declare F_Crackle=
function {
pigment {
crackle
turbulence 0.125
scale 10
}
}
#declare F_Agate=
function {
pigment {
agate
agate_turb 0.125
scale 10
}
}
#declare F_GradientY=
function {
pigment {
gradient y
scallop_wave
turbulence 0.125
scale 0.5
}
}
#include "functions.inc"
isosurface {
function {
F_Paraboloid((x*x)/999,y/9*f_noise3d(x/9,y/33,z/9), (z*z)/999)
-((F_Crackle(x,y,z).gray*2
+F_Agate(x,y,z).gray*2))*f_noise3d(x/3,y/9,z/3)*F_GradientY(x,y,z).gray*0.3
}
contained_by {
box { -50,50 }
}
threshold 1
accuracy 1 // yes, very low accuracy
max_gradient 1 // again, not much here
// evaluate 2,1,0.95
scale <1,0.25,1>
pigment {
rgb <1,1,1>
}
}
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Wasn't it Justin Smith who wrote:
>I've been experimenting a lot with creating mountains using isosurfaces, but
>I can't seem to quite get it right.
>
>I've been using a paraboloid function as the basic shape (x^2+y+z^2). I have
>been trying to use pattern noise to carve out parts to make it look more
>like a real mountain. I've mainly been using crackle and agate, since they
>seem the closest to what I want.
>
>The problem is that when I make the noise large enough (either by scaling
>the #declared pigment function in the declaration, or by increasing the
>multiplier at the end of subtracting it from the base function, or both),
>it always leaves "floaters"... pieces of terrain that are not actually
>connected or are connected by very thin sections to the main object. If I
>make the noise small enough to prevent this from being noticeable, the
>general silhouette of the mountain is still a perfect paraboloid and looks
>very unnatural.
Instead of using Pigment_Function(x,y,z)
try using Pigment_Function(x,0,z)
This returns a value that only depends on the x and z co-ordinates of
the point, and will prevent bits floating off in the y direction.
--
Mike Williams
Gentleman of Leisure
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
"Justin Smith" <t74### [at] yahoo com> wrote in message
news:web.3d9bb34c33fc79509a66a6680@news.povray.org...
<snip>
It's a fairly common problem - one way to guarantee that your surface will be
contigineous is to deform a plane. Basically, if all you are doing is raising
bits of a plane up or down, then you will never get bits of the surface breaking
away. This does impose the same limitation as a height-field - namely that you
will never get any recesses in the surface or overhangs.
For mountains, I'd strongly recommend taking a look at ridged multi-fractals,
which are specifically designed for this.
Try something like:
#version 3.5;
#include "colors.inc"
#include "functions.inc"
global_settings { assumed_gamma 1.0}
camera { location <0.0, 5, -10.0> look_at <0.0, 0.0, 0.0>}
sky_sphere { pigment { wrinkles color_map { [0.0 rgb <0.6,0.7,1.0>]
[0.7 rgb <0.0,0.1,0.8>] } }}
light_source { <0, 0, 0> color rgb <1, 1, 1> translate <-30, 30, -30>}
#declare MountFunc = function(x,y,z){f_ridged_mf(x,y,z,0.9, 5, 10, 0.75, 1, 0)}
#declare Mountains =
isosurface{
function{ y - MountFunc(x,0,z)}
contained_by{box{-5,5}}
accuracy 0.001
max_gradient 20
}
object{Mountains pigment{Gray50}}
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Justin Smith wrote:
>
> [...]
>
> The problem is that when I make the noise large enough (either by scaling
> the #declared pigment function in the declaration, or by increasing the
> multiplier at the end of subtracting it from the base function, or both),
> it always leaves "floaters"... pieces of terrain that are not actually
> connected or are connected by very thin sections to the main object. If I
> make the noise small enough to prevent this from being noticeable, the
> general silhouette of the mountain is still a perfect paraboloid and looks
> very unnatural.
To some extend that's a general problem of isosurfaces, Mike's suggestion
avoids it, but it will have some problems and restrictions as known from
heightfields then. To avoid the regular appearance when using not so
strong displacement you can deform the paraboloid object with a low
frequency noise function.
function { (x*x)/5000 + (y + f_noise3d(x/30, 0, z/30)*90)/90 + (z*z)/5000
}
will deform in y-direction (like what Mike suggested) so if you now apply
a displacement it will look less regular.
> [...]
>
> Now, I have seen some great isosurface work before (particularly I remember
> an entry in the Asia IRTC that had photorealistic terrain entirely made
> with isosurfaces)...
Thanks ;-)
Christoph
--
POV-Ray tutorials, IsoWood include,
TransSkin and more: http://www.tu-bs.de/~y0013390/
Last updated 13 Aug. 2002 _____./\/^>_*_<^\/\.______
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
In article <3d9bdcd2@news.povray.org>,
"hughes, b." <omn### [at] charter net> wrote:
> This is something I'd like to do somehow too. I think it needs to be kind of
> fractalized, iterations from large to small perturbations. Unfortunately,
> people were discussing function-made fractals elsewhere here at the
> newsgroups and seemed this isn't possible because recursive calls into a
> function aren't allowed. Or I hadn't noticed if anyone said there was a way.
Recursion isn't allowed, that doesn't mean you can't hard-code the
different levels of a fractal. This kind of function is actually pretty
common, there are a couple built-in functions for doing it.
--
Christopher James Huff <cja### [at] earthlink net>
http://home.earthlink.net/~cjameshuff/
POV-Ray TAG: chr### [at] tag povray org
http://tag.povray.org/
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
Christoph Hormann wrote:
>
>Justin Smith wrote:
>>
>> [...]
>>
>> The problem is that when I make the noise large enough (either by scaling
>> the #declared pigment function in the declaration, or by increasing the
>> multiplier at the end of subtracting it from the base function, or both),
>> it always leaves "floaters"... pieces of terrain that are not actually
>> connected or are connected by very thin sections to the main object. If I
>> make the noise small enough to prevent this from being noticeable, the
>> general silhouette of the mountain is still a perfect paraboloid and looks
>> very unnatural.
>
>To some extend that's a general problem of isosurfaces, Mike's suggestion
>avoids it, but it will have some problems and restrictions as known from
>heightfields then. To avoid the regular appearance when using not so
>strong displacement you can deform the paraboloid object with a low
>frequency noise function.
>
>function { (x*x)/5000 + (y + f_noise3d(x/30, 0, z/30)*90)/90 + (z*z)/5000
>}
>
>will deform in y-direction (like what Mike suggested) so if you now apply
>a displacement it will look less regular.
>
>> [...]
>>
>> Now, I have seen some great isosurface work before (particularly I remember
>> an entry in the Asia IRTC that had photorealistic terrain entirely made
>> with isosurfaces)...
>
>Thanks ;-)
>
>Christoph
>
>POV-Ray tutorials, IsoWood include,
>TransSkin and more: http://www.tu-bs.de/~y0013390/
>Last updated 13 Aug. 2002 _____./\/^>_*_<^\/\.______
>
Oh, was that yours? Yes, I was thoroughly impressed.
Thanks for all the help (from everyone)... I went with Mike's suggestion,
since the mountain is far away enough that you wouldn't be able to see any
overhangs anyways. I'll try the other method as well to see what it looks
like, though. Much appreciated.
-Justin
Post a reply to this message
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |
|
![](/i/fill.gif) |
| ![](/i/fill.gif) |
|
![](/i/fill.gif) |