Manipulate[
(*by Nasser M. Abbasi*)

tick; 
Module[{x0,y0,z0,point,d=0.5},

If[state=="running"||state=="step",
t=t+speed;
phi=currentW1*t+1/2 w1dot*t^2;
theta=currentW2*t+1/2 w2dot*t^2;
currentW1=currentW1+w1dot*t;
currentW2=currentW2+w2dot*t;
currentRaoV=currentRaoV+raoAcc*t;
rr=currentRaoV*t+1/2 raoAcc*t^2;
If[state=="running",
tick+=del
],
If[state=="reset",
t=-speed;phi=0;theta=0;rr=0;x=0;y=0;z=0;currentRaoV=raoV;currentW1=w1;currentW2=w2;phi=0;theta=0;rr=0;line={LL};tick=0
]
];

x0=L1+r Cos[theta];
y0=-L3+r Sin[theta];
z0=L4+L2+d;

x=L1+rr Cos[theta];
y=-L3+rr Sin[theta];
z=L4+L2+d;

point={x,y,z};
AppendTo[line,point];

g=Text@Grid[{
{
Grid[
{
{Style["Simulation for problem 1, HW3, EMA 542, Fall 2013, Univ. Of Wisconsin, Madison",Small],SpanFromLeft},
{Style["ant coordinates",Bold],SpanFromLeft},
{Grid[
{
{"(w2) disk","w1 (frame)","inertial"},
{Grid[{
{"x","y","z"},
{padIt1[If[Abs[#]>1000,Sign[#]*1000,#]&/@rr ,{7,3}],0,0}
},Frame->All,Spacings->{.2,.4}
],
Grid[{
{"X","Y","Z"},
{padIt1[If[Abs[x]>1000,1000*Sign[x],x],{7,3}],padIt1[If[Abs[y]>1000,Sign[y]*1000,y],{7,3}],padIt1[L2,{7,3}]}
},Frame->All,Spacings->{.2,.4}],
Grid[{
{Style["X",Bold],Style["Y",Bold],Style["Z",Bold]},
{padIt1[L1 Cos[phi]+L2 Sin[phi]+rr Cos[theta]Cos[phi],{7,3}],
padIt1[-L3+rr Sin[theta],{7,3}],
padIt1[-L1 Sin[phi]+L2 Cos[phi],{7,3}]}
},Frame->All,Spacings->{.2,.4}]
}
},Spacings->{.2,.2},Frame->True,FrameStyle->Directive[Thickness[.001],Gray]
],SpanFromLeft
}
},Frame->True,FrameStyle->Directive[Thickness[.001],Gray],Alignment->Center
]
},
{
Graphics3D[
{
Text["inertial",{-r-5,0,3}],
{Arrowheads[Medium],Arrow[{{-r-5,-2,3},{-r-4,-2,3}}]},
Text[Style["X",Bold,12],{-r-3.5,-2,3},{-1,0}],

{Arrowheads[Medium],Arrow[{{-r-5,-2,3},{-r-5,-1,3}}]},
Text[Style["Y",Bold,12],{-r-5,-.8,3},{-1,0}],

{Arrowheads[Medium],Arrow[{{-r-5,-2,3},{-r-5,-2,2}}]},
Text[Style["Z",Bold,12],{-r-5,-2,1.8},{-1,0}],

GeometricTransformation[
{

If[showW2Coordinates,
{
{Arrowheads[Medium],Arrow[{LL,LL+{r Cos[theta],r Sin[theta],0}}]},
Text[Style["x",12],LL+{1.1r Cos[theta],1.1r Sin[theta],0},{-1,0}],
{Arrowheads[Medium],Arrow[{LL,LL+{r Cos[theta+Pi/2],r Sin[theta+Pi/2],0}}]},
Text[Style["y",12],{LL+{1.1r Cos[theta+Pi/2],1.1r Sin[theta+Pi/2],0}},{-1,0}],
{Arrowheads[Medium],Arrow[{LL,LL+{0,0,r}}]},
Text[Style["z",12],{1.1*(LL+{0,0, r})},{-1,0}]
},
{}
],
{Red,Thin,Line[line]},
{Red,PointSize[Medium],Point[point]},

{Opacity[Dynamic@op],Cylinder[{{L1,-L3,L4+L2},{L1,-L3,L4+L2+d}},r]},
{Red,Cylinder[{{0,-0.2,0},{0,0.2,0}},0.2]},

{Blue,Cylinder[{{0,-0.8,0},{0,2,0}},0.1]},
Tube[{{0,0,0},{L1,0,0},{L1,0,L2},{L1,-L3,L2},{L1,-L3,L4+L2}},0.06],
Cylinder[{{L1,-L3,L2},{L1,-L3,L4+L2}},0.2],

If[showW1Coordinates,
{
{Arrowheads[Medium],Arrow[{{0,0,0},{1,0,0}}]},
Text[Style["X",12],{1.1,0,0},{-1,0}],

{Arrowheads[Medium],Arrow[{{0,0,0},{0,3,0}}]},
Text[Style["Y",12],{0,3.1,0},{-1,0}],

{Arrowheads[Medium],Arrow[{{0,0,0},{0,0,1}}]},
Text[Style["Z",12],{0,0,1.1},{-1,0}]
},
{}
]


},
RotationTransform[phi,{0,1,0}]
]
}
,ImageSize->{400,400},Boxed->False,AxesLabel->{"x","y","z"},ViewVertical->{0,1,0},ViewPoint->{1,.5,2},SphericalRegion->True,PlotRange->{{-r-5,r+3},{-r-3,r+2},{-r-3,r+3}},ImagePadding->1,Axes->None,ViewAngle->Dynamic[zoom*Pi/180.0]
]
}},Spacings->{0,.1},Alignment->Center];
g
],

Text@Grid[{
{
Grid[{
{
Button[Text[Style["run",11]],state="running";tick+=del,ImageSize->{50,35}],
Button[Text[Style["pause",11]],state="paused";tick+=del,ImageSize->{50,35}],
Button[Text[Style["step",11]],state="step";tick+=del,ImageSize->{50,35}],
Button[Text[Style["reset",11]],state="reset";
tick=0,ImageSize->{50,35}]
}
},Spacings->{0.4,.2},Alignment->Center
]
},
{
Grid[{
{
"slow",
Manipulator[Dynamic[speed,{speed=#}&],{0.0001,0.001,0.0001},ImageSize->Tiny,ContinuousAction->True],
"fast",SpanFromLeft
},
{
"disk r",
Manipulator[Dynamic[r,{r=#;state="paused";tick+=del}&],{0.5,2.3,0.1},ImageSize->Tiny,ContinuousAction->True],
Dynamic[padIt2[r,{2,1}]],"ft"
},
{
"w1",
Manipulator[Dynamic[w1,{w1=#;state="reset";
tick+=del}&],{0.001,10,0.001},ImageSize->Tiny,ContinuousAction->True],
Dynamic[padIt2[w1,{4,3}]],"rad/sec"
},
{
"w2",
Manipulator[Dynamic[w2,{w2=#;state="reset";
tick+=del}&],{0.001,30,0.001},ImageSize->Tiny,ContinuousAction->True],
Dynamic[padIt2[w2,{5,3}]],"rad/sec"
},
{
"d/dt(w1)",
Manipulator[Dynamic[w1dot,{w1dot=#;state="reset";
tick+=del}&],{0.001,1,0.001},ImageSize->Tiny,ContinuousAction->True],
Dynamic[padIt2[w1dot,{4,3}]],"rad/sec^2"
},
{
"d/dt(w2)",
Manipulator[Dynamic[w2dot,{w2dot=#;state="reset";
tick+=del}&],{0.001,1,0.001},ImageSize->Tiny,ContinuousAction->True],
Dynamic[padIt2[w2dot,{4,3}]],"rad/sec^2"
},
{
"ant speed",
Manipulator[Dynamic[raoV,{raoV=#;state="reset";
tick+=del}&],{0.001,3,0.001},ImageSize->Tiny,ContinuousAction->True],
Dynamic[padIt2[raoV,{4,3}]],"ft/sec"
},
{
"ant acc",
Manipulator[Dynamic[raoAcc,{raoAcc=#;state="reset";
tick+=del}&],{0.001,3,0.001},ImageSize->Tiny,ContinuousAction->True],
Dynamic[padIt2[raoAcc,{4,3}]],"ft/sec^2"
},
{
"disk opacity",
Manipulator[Dynamic[op,{op=#}&],{0.1,1,0.1},ImageSize->Tiny,ContinuousAction->True],
Dynamic[padIt2[op,{1,1}]],SpanFromLeft
},
{
"zoom",
Manipulator[Dynamic[zoom,{zoom=#}&],{10,130,1},ImageSize->Tiny,ContinuousAction->True],
Dynamic[padIt2[zoom,2]],SpanFromLeft
}
},Alignment->Left
]
},
{
Grid[
{
{"time",Dynamic@padIt2[t,{7,5}],"sec"}
},Spacings->{.5,.2}]
},
{
Grid[{
{"show disk coordinates",Spacer[4],Checkbox[Dynamic[showW2Coordinates,{showW2Coordinates=#;tick+=del}&]]
},
{"show bar coordinates",Spacer[4],Checkbox[Dynamic[showW1Coordinates,{showW1Coordinates=#;tick+=del}&]]
}

}
]
}


},Frame->All,Alignment->Left],

{{showW2Coordinates,True},None},
{{showW1Coordinates,False},None},
{{speed,0.001},None},
{{r,2.3},None},
{{tick,0},None},
{{del,$MachineEpsilon},None},
{{state,"reset"},None},
{{t,0},None},
{{x,0},None},
{{y,0},None},
{{z,0},None},
{{line,{{0,0,0}}},None},
{{w1dot,1},None},
{{w2dot,0.2},None},
{{w1,1},None},
{{w2,11},None},
{{raoV,0.5},None},
{{raoAcc,0.1},None},
{{currentRaoV,0.01},None},
{{currentW1,0.6},None},
{{currentW2,0.01},None},
{{op,0.1},None},
{{phi,0},None},
{{theta,0},None},
{{rr,0},None},
{{zoom,32},None},
TrackedSymbols:> {tick},

ControlPlacement->Left,
SynchronousUpdating->False,
SynchronousInitialization->False,
ContinuousAction->False,
Alignment->Center,
ImageMargins->0,
FrameMargins->0,
Paneled->True,
Frame->False,
AutorunSequencing-> {1},

Initialization:>
(
L1=2.5;
L2=0.7;
L3=1.4;
L4=1;
LL={L1,-L3,L4+L2+0.5};
(*definitions used for parameter checking*)
integerStrictPositive=(IntegerQ[#]&&#>0&);
integerPositive=(IntegerQ[#]&&#≥0&);
numericStrictPositive=(Element[#,Reals]&&#>0&);
numericPositive=(Element[#,Reals]&&#≥0&);
numericStrictNegative=(Element[#,Reals]&&#<0&);
numericNegative=(Element[#,Reals]&&#≤0&);
bool=(Element[#,Booleans]&);
numeric=(Element[#,Reals]&);
integer=(Element[#,Integers]&);
(*--------------------------------------------*)
padIt1[v_?numeric,f_List]:=AccountingForm[v,
f,NumberSigns->{"-","+"},NumberPadding->{"0","0"},SignPadding->True];
(*--------------------------------------------*)
padIt1[v_?numeric,f_Integer]:=AccountingForm[Chop[v],
f,NumberSigns->{"-","+"},NumberPadding->{"0","0"},SignPadding->True];
(*--------------------------------------------*)
padIt2[v_?numeric,f_List]:=AccountingForm[v,
f,NumberSigns->{"",""},NumberPadding->{"0","0"},SignPadding->True];
(*--------------------------------------------*)
padIt2[v_?numeric,f_Integer]:=AccountingForm[Chop[v],
f,NumberSigns->{"",""},NumberPadding->{"0","0"},SignPadding->True];
(*--------------------------------------------*)


)
]