|
|
I want to remap a texture (say something from stones.inc) so that what
you see is not a function of <x,y,z> but rather of <f(x,y,z), g(x,y,z),
h(x,y,z)>, i.e. some substitute for the actual coordinates which is
still a (nonlinear) function of those coordinates. How hard is that to do?
If this is unclear, I'll try to rephrase.
(What I have in mind is to illustrate the various point symmetry groups
with seamless pigments that show the relevant symmetries.)
--
Anton Sherwood, http://www.ogre.nu/
Post a reply to this message
|
|
|
|
Wasn't it Anton Sherwood who wrote:
>I want to remap a texture (say something from stones.inc) so that what
>you see is not a function of <x,y,z> but rather of <f(x,y,z), g(x,y,z),
>h(x,y,z)>, i.e. some substitute for the actual coordinates which is
>still a (nonlinear) function of those coordinates. How hard is that to do?
Here's some code that remaps a single-layer pigment in this way. If you
really want to remap complex stone textures, then you'd have to do the
same to each of the pigment layers.
The basic trick is to make a function from the pigment, and then make a
pigment from that function. When you make a pigment from the function
you can specify an arbitrary remapping.
The sphere on the left has the original stone pigment.
The sphere on the right has the arbitrarily remapped pigment.
The lower sphere has a remapped pigment, using the identity mapping. if
the procedure works correctly, then this should look identical to the
original sphere.
>If this is unclear, I'll try to rephrase.
>
>(What I have in mind is to illustrate the various point symmetry groups
>with seamless pigments that show the relevant symmetries.)
Now you've lost me.
global_settings {
assumed_gamma 1.0
}
camera { orthographic location <0,-0.8,-4> look_at <0, -0.8, 0>}
light_source {<-200,400,-200> colour rgb 1}
// Declare the original pigment
#declare C = color_map
{ [0.0, 0.3 color rgb 1 color rgb 0.4]
[0.3, 0.4 color rgb 0.4 color rgb 0.6]
[0.4, 0.6 color rgb 0.6 color rgb 0.3]
[0.6, 1.0 color rgb 0.3 color rgb 0.6]
}
#declare P = pigment {granite turbulence 0.5 color_map {C}}
#declare Fin = finish {phong 0.5 phong_size 6}
// Make a pigment function from its structure (but skip the colour map)
#declare PF=function{pigment{granite turbulence 0.5}}
// Three non-linear functions
#declare f = function{x*x + y}
#declare g = function{sin(3*y)}
#declare h = function{z*3 + cos(x)}
// A sphere with the original pigment
sphere {<-1,0,0> 1 pigment {P} finish{Fin}}
// A sphere with the transformed pigment (put the colour map back in)
sphere {<1,0,0>,1
pigment { function { PF(f(x,y,z),g(x,y,z),h(x,y,z)).grey }
color_map {C}
}
finish{Fin}
}
// a sphere using the same technique, but with the identity
transformation
// to check that this procedure really does
sphere {<-1,0,0>,1
pigment { function { PF(x,y,z).grey }
color_map {C}
}
finish{Fin}
translate <1,-1.7,0>
}
Post a reply to this message
|
|
|
|
> Wasn't it Anton Sherwood who wrote:
>> (What I have in mind is to illustrate the various point symmetry
>> groups with seamless pigments that show the relevant symmetries.)
Mike Williams wrote:
> Now you've lost me.
May I always be so fortunate, that the most obscure parts of my writing
are in the footnotes. ;)
Consider the Mercator projection: the surface of a sphere is mapped to
that of an endless cylinder. I've heard that someone once made a globe
on which the reverse Mercator projection was applied twice, i.e. two
copies of a six-inch cylinder (say) were used to form a twelve-inch
cylinder, and the projection applied in reverse to a globe, with the
result that an orthographic eye in the plane of the equator would see a
map of the entire world. The oddity was said to be hard to spot -
partly because the mapping is conformal (shapes are locally preserved)
and partly because the doubling is seamless (except for a singularity at
the poles).
Well, given a `globe' pigment, this multiplication effect is
accomplished with the following functions (if my algebra is good):
Xnew = Re[(x+i*y)^n] / ((1+z)^n + (1-z)^n)
Ynew = Im[(x+i*y)^n] / ((1+z)^n + (1-z)^n)
Znew = ((1+z)^n - (1-z)^n) / ((1+z)^n + (1-z)^n)
(n=2 for the above example.) The pigment of the resulting globe has the
symmetry group C[n]. Other symmetry groups can arise from other sorts
of functions. Simple examples, not conformal:
Xnew = Re[(x+i*y)^n]
Ynew = Im[(x+i*y)^n]
Znew = z^2
This gives C[n]h, i.e. the same nfold symmetry as above plus a
reflection plane perpendicular to the axis.
Xnew = Re[(x+i*y)^n]
Y1 = Im[(x+i*y)^n]
Ynew = Y1^2 - z^2
Znew = z*Y1
This gives D[n], the rotation group of an n-gonal prism.
...Thanks for the code! I'll play with it when I'm more awake.
--
Anton Sherwood, http://www.ogre.nu/
Post a reply to this message
|
|