Re: spinning/rotating object with shadow
- To: mathgroup at smc.vnet.net
- Subject: [mg38947] Re: spinning/rotating object with shadow
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Tue, 21 Jan 2003 07:39:19 -0500 (EST)
- Organization: Universitaet Leipzig
- References: <b0g2ah$mrt$1@smc.vnet.net>
- Reply-to: kuska at informatik.uni-leipzig.de
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
a) computing the true shadows of the 3 light sources
would requite the construction of the shadow volumes
and take an half hour per frame
b) fake a single shadow is easy with
Needs["Graphics`Polyhedra`"]
Needs["Graphics`Shapes`"]
toShadow[gray_?MatrixQ, {x1_, x2_}, {y1_, y2_}, z_] :=
Module[{n, m, dx, dy, points, cgraph},
{m, n} = Dimensions[gray];
dx = (x2 - x1)/(n);
dy = (y2 - y1)/(m);
points = Table[{x1 + dx*i, y1 + dy*j, z}, {j, 0, m}, {i, 0, n}];
poly =
Drop [#, -1] & /@
Drop[Transpose[{points, RotateRight[points],
RotateLeft /@ RotateRight[points], RotateLeft /@ points},
{3, 1,
2}], -1];
{EdgeForm[], Transpose[{Map[SurfaceColor[GrayLevel[#]] &, gray,
{2}],
Map[Polygon, poly, {2}]}, {3, 1, 2}]}
]
makeShadow[t_, opts___?OptionQ] :=
Module[{sh},
sh = DensityPlot[
1 - Exp[-(3 + Sin[t/2])*(x^2 + y^2)], {x, -2, 2}, {y, -2, 2},
DisplayFunction -> Identity, opts];
toShadow[sh[[1]], {-2, 2}, {-2, 2}, -2]
]
obj = Table[RotateShape[Icosahedron[], t, t/2, t/3], {t, 0, 8, 1/10}];
MapIndexed[
Show[Graphics3D[{makeShadow[First[#2], PlotPoints -> 30], #1},
Boxed -> False, PlotRange -> {{-2, 2}, {-2, 2}, {-2, 2}}]] &,
obj];
but that is *not* the shadow that the three colored light sources would
produce -- that would be much more expensive.
If some one else would like to have (hard) shadows I can include it into
MathGL3d -- just send a mail about it to me.
Regards
Jens
Selwyn Hollis wrote:
>
> I'm interestied in using Mathematica to do something similar to this:
>
> http://www.mapleapps.com/powertools/logos/appess3.gif
>
> Does anyone have a guess at what kind of rotation is being used?
> And how one might get a similar shadow effect? (Without resorting to a
> different rendering engine.)
>
> Thanks,
>
> Selwyn
From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>
To: mathgroup at smc.vnet.net
Subject: [mg38947] RE: [mg38909] Prefix[f[x]], why is it not working
>-----Original Message-----
>From: Ashraf El Ansary [mailto:Elansary at btopenworld.com]
To: mathgroup at smc.vnet.net
>Sent: Saturday, January 18, 2003 6:39 AM
>To: mathgroup at smc.vnet.net
>Subject: [mg38947] [mg38909] Prefix[f[x]], why is it not working
>
>
>Hi all,
>Does anyone why f@a_=2 a gives a proper answer for f[1]
>and not in the case of Prefix[s[a_]]= 2 a eventhough that
>Prefix[s[a_]]=
>f@a_???
>
>Thanks
>In[1]:=
>f@a_=2 a
>f[1]
>Out[1]=
>2 a
>Out[2]=
>2
>In[3]:=
>Prefix[s[a_]]
>Prefix[s[a_]]=2 a
>s[1]
>Out[3]=
>s@a_
>Set::write: Tag Prefix in s@a_ is Protected.
>Out[4]=
>2 a
>Out[5]=
>s[1]
>
>
>
Ashraf,
the question is: what behaviour did you expect? An answer to that might
solve your problem.
First, Prefix[s[a_]] is *not* the same as f@a_
In[1]:= f@a_ := 2 a
In[2]:= ?f
Global`f
f[a_] := 2 a
In[3]:= f[1]
Out[3]= 2
Compare this to
In[4]:= Prefix[s[a_]]
Out[4]= s@a_
In[5]:= % // FullForm
Out[5]//FullForm=
Prefix[s[Pattern[a, Blank[]]]]
So Prefix is a wrapper for printing purposes (only). Such you cannot make
definitions for it (as it is protected), but also, it is a special form not
submitted to the standard evaluation sequence, see:
In[7]:= Prefix[s[aaa___]] ^= s[aaa]
Out[7]= s[aaa]
In[8]:= s[a_] := 2 a
In[9]:= ?s
Global`s
Prefix[s[aaa___]] ^= s[aaa]
s[a_] := 2 a
In[10]:= Prefix[s[2]]
Out[10]= Prefix[4]
So even Upvalues won't work. You may however do
In[12]:= Prefix[Unevaluated[s[2]]]
Out[12]= 4
The very question, however, is whether this is what you intended, or say,
what did you want to achieve at all?
--
Hartmut Wolf