A 3-dimenziós ábrákat az egérrel szabadon forgathatjuk. Bizonyos esetekben hasznos lehet az éppen aktuális pozíció számszerű megjelenítése, ami pl. lehetővé teszi, hogy egy kiválasztott helyzetet alapértelmezettnek állítsunk be. A feladat a következőképpen oldható meg dinamikus változók használatával:

Module[{v={1.,2.,.5},f={1.,0.,3.}},
Labeled[Show[Plot3D[Sin[x y],{x,-2,2},{y,-2,2}],Graphics3D[Line[{{0,0,-1},{0,0,1}}]],
ViewPoint->Dynamic[v],ViewVertical->Dynamic[f],ViewAngle->0.8,ImageSize->400,Axes->False
,PreserveImageOptions->False,RotationAction->Clip],
Dynamic[NumberForm[Column[{ViewPoint->v,ViewVertical->f},Right],{∞,2},
ExponentFunction->(Null&),NumberSigns->{"-","+"}]],Top]]

Module[{v={1.,2.,.5},f={1.,0.,3.}},
Labeled[Graphics3D[{Plot3D[Sin[x y],{x,-2,2},{y,-2,2}][[1]],Line[{{0,0,0},{0,0,1}}]},
ViewPoint->Dynamic[v],ViewVertical->Dynamic[f],ImageSize->400,Axes->False,ViewAngle->0.8],
Dynamic[NumberForm[Column[{ViewPoint->v,ViewVertical->f},Right],{∞,2},
ExponentFunction->(Null&),NumberSigns->{"-","+"}]],Top]]

Figyeljük meg a csupán formázásért felelős Labeled, Column és NumberForm függvények alkalmazását.

Figyeljük meg a Graphics3D objektumot generáló függvényeknél használt opciók hatását. Egy további lényeges opció a Method->{"RotationControl"->...}.

Figyeljük meg, hogy eme utóbbi opció értékének különbözősége miatt a fenti két ábra másként reagál az egérrel való forgatásra.
	Az első ábra forgatásakor a z-tengely képe a 2-dimenziós ábrán mindig függőleges, ami ugyanazt jelenti, mint hogy ViewVertical értéke ± a z-irányú egységvektor.
	A második ábra forgatásával viszont elferdíthető a z-tengely 2-dimenziós képe, így természetesen a ViewVertical értéke is változik, mivel definíció szerint az mindig egy olyan vektor, aminek a képe függőleges a 2-dimenziós ábrán.

Vegyük észre, hogy explicit nem adtuk meg a Method opció RotationControl paraméterének értékét. Ennek impliciten létező alapértelmezett értékének felderítésében a következő egyébként is tanulságos módszerek voltak segítségünkre:

Elemezzük először mit az vissza egy Plot3D:

p=Plot3D[sin(x y),{x,-2,2},{y,-2,2}];
FullForm@p
G@@p
Length@p
p[[0]]
p[[2]]
Options@p

Próbáljuk ki, melyik hogy mozog:

p
Graphics3D@p[[1]]
p[[1]]~Graphics3D~p[[2]]

Látszik tehát, hogy a Plot3D eredménye egy egyszerű Graphics3D, megspékelve néhány opcióval. A speciális mozgásért Method->{"RotationControl"->"Globe"} beállítás a felelős. Kérdés, hogy mi ennek az opciónak az értéke alapból, ha egy ábrát közvetlenül a Graphics3D függvénnyel hozunk létre.

k=Graphics3D[Cuboid[]]
Options[k,Method]
AbsoluteOptions[k,Method]

Ezzel az Automatic-kal még nem értünk célt. Nézzük meg, mit találunk a Frontend globális beállításaiban (másként: Ctrl+Shift+O -> Global Preferences):

Graphics3DBoxOptions/.Options@$FrontEnd
Off[ToExpression::"notstrbox"]
Graphics3DBoxOptions/.AbsoluteOptions@$FrontEnd
Method/.(Graphics3DBoxOptions/.AbsoluteOptions@$FrontEnd)

Itt a válasz: ArcBall. Valójában az eddigi kettőn túl más érték mindeddig nem ismert a RotationControl paraméterre. Ebből kifolyólag valószínűsíthető, hogy nem is létezik.

Ha a globális értéket át akarjuk állítani, azt megtehetjük a menüből, vagy a következő kifejezéssel:

SetOptions[$FrontEnd,Graphics3DBoxOptions->{Method->{"RotationControl"->"Globe"}}]

Ehhez hasonlóan a Frontend minden beállítása módosítható. Ennek egy praktikus alkalmazása az automatikus sortörés ki-bekapcsolására:

SetOptions[$FrontEnd,AbsoluteOptions[$FrontEnd,LineBreakWithin]/.{Automatic->False,False->Automatic}];

Itt fölhívom még egy hasznos funkcióra a figyelmet. Ha, tegyük föl, valaki úgy gondolja, hogy ilyen ki-bekapcsolós parancs jól jönne neki a mindennapi munka közben, akkor adja hozzá a következő sort az init.m fájlhoz, és máris bármikor átkapcsolhat az st váltzó kiértékelésével:

st:=(SetOptions[$FrontEnd,AbsoluteOptions[$FrontEnd,LineBreakWithin]/.{Automatic->False,False->Automatic}];)

Az init.m fájlt megnyitja nekünk a következő parancs:

NotebookOpen[ToFileName[{$BaseDirectory,"Kernel"},"Init.m"]];

Sőt, vérszemet kapva, hozzáadhatjuk a következő sort is, hogy máskor is könnyen megnyithassuk ezt a fájlt:

al:=(NotebookOpen[ToFileName[{$BaseDirectory,"Kernel"},"Init.m"]];)

Remélem, hasznos volt.

Salát Máté
salatmate@zaradek.hu