|
|
I'd like to apply media to a generic object, so that media
"intensity" is a function of the distance from the external
surface (for example decrease/increase linearly/exponentially
when distance grow up).
I don't know if this is a feature of Povray media. Is it
possible?
It seemed simple for spheres of cubes but I don't know if
it's the same thing for generic objects. For generic objects
df3 files can be used, but they must be generated ad hoc
for the media of the specific object.
First I thought to write a macro that calculate and generate
df3 entries, without using external generators or editors.
Follows the pseudo-code for my idea...
INPUT: object O, parameter E (I'll explain it later)
OUTPUT: container L (array, list, etc.)
01: calculate bounding box lengths (X,Y,Z) for axes x,y,z
02: i=0
03: while i<X begin
04: j=0
05: while j<Y begin
06: k=0
07: while k<Z begin
08: if point <x,y,z> is internal to O, the add it to L
09: k=k+E
10: end
11: j=j+E
12: end
13: i=i+E
14: end
After executing this procedure, L must contain all points
internal to O whose minum distance from each other is E,
that is a sort of grid of internal points. All the points
in L, placed in a 3D plane, approximate the object O.
The littler E is, the better the approximation will be.
Obviously value for E and intitial values (instead of 0)
for i,j,k can be optimized in order to better approximate
the object.
I know that 10^6 checks for internal points must be
performed when subdividing each axis in 100 parts, but
this is necessary in order to implement my idea...
Follows a 2D example, where X will be the points contained
in L:
+-------------------+
|XXXXXXXXXXXXXXXXXXX|
|XXXXXXXXXXXXXXXXXXX|
|XXXXXXXXXXXXXXXXXXX|
|XXXXXXXXXXXXXXXXXXX|
|XXXXXXXXXXXXXXXXXXX.------.
|XXXXXXXXXXXXXXXXXXXXXXXXXXX`--.
|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`.
|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+----------XXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXX:
|XXXXXXXXXXXXXXXXXXXXXXXXX|
:XXXXXXXXXXXXXXXXXXXXXXXXX;
XXXXXXXXXXXXXXXXXXXXXXX/
XXXXXXXXXXXXXXXXXXXXX/
`.XXXXXXXXXXXXXXXXX,'
'--.XXXXXXXXX_.-'
`------''
Simple algorithms exist in literature to calculate external
points for a set of points.
After having found external points, a constant intensity can
be assigned to them and such intensities can become entried
for a df3 file.
Example for exaternal points of level 1:
1111111111111111111
1 1
1 1
1 1
1 1
1 111111111
1 1111
1111111111 11
1 1
1 1
1 1
1 1
1 1
11 11
1111 1111
111111111
External points can be removed from L, obtaining a new container
L'. External points for L' constitutes the second level.
The process is reiterated for the next levels.
1111111111111111111
1222222222222222221
1233333333333333321
1234444444444444321
1234444444555554321
123333333345665432111111111
1222222222345665432222222221111
111111111123456654333333333222211
123456654444444443333221
1234566655555555544443321
1234555566666666655554321
1233444455555555544443321
12233334444444443333221
112222333333333222211
11112222222221111
111111111
Then... Do you think is it possible to write a macro that
generate df3 entries according to the described rules?
If not yet implemented, do you think that a functionality that
generates df3 entries inline as described (intensity as function
of the distance) could be added to Povray, without including
df3 file every time?
Thanks.
Antonio
Post a reply to this message
|
|
|
|
Wasn't it Antonio Ferrari who wrote:
>Then... Do you think is it possible to write a macro that
>generate df3 entries according to the described rules?
It's possible to perform all the calculation within POV code, but I
believe that df3 files are binaries, and POV #write operations can only
write ASCII, so POV can't write df3 files directly.
I've done a quick proof-of-concept scene (see binaries.images) where I
split an object into a 40*40*40 array, use "inside()" to determine if a
point is inside the object, and determine the distance of each cell from
the edge in the way you describe.
It would be possible to then write the data from the array and have it
processed by a program that can write binary files, but I just plotted a
transparent cube in each cell with the pigment transparency of each cube
corresponding to the value in the array.
--
Mike Williams
Gentleman of Leisure
Post a reply to this message
|
|