Krmiljenje oken


Krmiljenje vsebine okna

V našem oknu imamo tako imenovano platno (canvas) in nanj program nariše našo 3D sceno z objekti. Program ima vsaj eno sceno, katere ime je"scene". Nanjo umeščamo 3D objekte. Na sceni mora biti umeščen vsaj en objekt, če naj bo vidna.
Dodatna platna (ali scene ) lahko tvorimo z ukazom canvas() in pri tem določimo naslov takega platna, barvo njegovega ozadja, velikost platna. Da lahko ločimo med posameznimi scenami, mora vsaka imeti neko ime.
Primer:
Tvorimo novo sceno, ki bo imela ime "scene2", naslov scene bo "Primeri tetraedrov". Platno bo širine 600 in višine 200. Ozadje bo pobarvano nebesno modro:

scene2 = canvas(title='Primeri tetraedrov', width=600, height=200, center=vector(5,0,0), background=color.cyan)


Izbira scene oziroma platna

Privzeto bodo novi objekti tvorjeni v zadnje odprti sceni, kot je na primer scene. Če odpremo novo sceno, bodo naslednji novi objekti v novi sceni.
Kasneje lahko med objekti preklapljamo z ukazom tipa scene3.select() (in preklopimo na platno scene3).

Z ukazom tipa current =canvas.get_selected() naslovimo trenutno aktivno sceno. Lahko pa pri tvorbi objekta povemo, v katero sceno sodi, na primer box(canvas=scene2, .....).


Lastnosti platna

width, height Širina in višina platna v pikslih. Privzeti vrednosti sta 640 in 400. Določimo ju pri tvorbi platen, kasneje pa ju lahko spreminjamo.
align Platno lahko prisilimo na levo (left) ali desno (right) okna, privzeto je "none".
resizable Če je True (privzeto) lako uporabnik spreminja velikost platna. Če imamo na primer platn C in funkcijo R, bi ukaz C.bind('resize', R) pri vsaki spremembi platna klical to funkcijo.
background Nastavi barvo , s katero se zapolni ozadje platna. Privzeta vrednost je "black" (črna).
ambient Barva neusmerjene osvetlitve scene (takoimenovani "ambient") Privzeta ambienna osvetlitrv je siva: color.gray(0.2).

lights Seznam svetil za dano sceno. Privzeti seznam teh luči je:

[distant_light(direction=vec( 0.22,  0.44,  0.88), color=color.gray(0.8)),
distant_light(direction=vec(-0.88, -0.22, -0.44), color=color.gray(0.3))]


Spremembo barve prve luči v tem seznamu lahko naredimo na primer tako:

scene.lights[0].color = color.red

objectsTo je seznam objetov, ki so vidni na platnu; Nevidnih objektov ni v tem seznamu. Naslednji primer kaže, kako bi vse, na scenui vidne objekte pobarvali rdeče:
for obj in scene2.objects:
if isinstance(obj, box):
obj.color = color.red



visible Če nastavimo scene.visible = False, ne bi bil noben objekt na sceni viden, dokler ne napišemo ukaza scene.visible = True.
delete() To ni lastnost. Je metoda, ki zbriše vse objekte na platnu in zatem še platno samo




Krmiljenje kamere (našega gledišča na sceno)

scene.camera.pos Pomeni trenutni položaj kamer (torej našega gledišča ma sceno).


scene.camera.follow() Privzeto kaže kamera vedno v središče scene, vendar lahko smer pogleda spremenimo in namesto tega gledamo stalno v nek objekt. Primer;

scene.camera.follow(ball)

Center scene (torej naš pogled) bo stalno resetiran na položaj krogle.Sledenje žogi zaustavimo s stavkom scene.camera.follow(None).

Prikaz besedila

Nad platno lahko zapišemo naslov, pod njim pa podnaslov z ukazi naslednjega tipa:
scene.title = "To je naslov nad platnom"
scene.caption = "To je podnaslov pod platnom"

Podnaslov je lahko dolg več vrstic, pri čemer za konec vrstice uporabljamo "\n"



Pogled na sceno

Naslednja slika kaže relacije med veličinami, ki vplivajo na naš pogled. Predstavljamo si, da na sceno gledamo kot skozi kamero:

center To je točka, v katero gleda kamera. Ta točka se ne spreminja, četudi spreminjamo položaj kamere. Če spremenimo scene.center, bo kamera gledala v novo točko, razen če spremenimo scene.forward (ta atribut je opisan malo naprej). Privzeti center pogleda je (0,0,0).
autocenter Pogled, torej "scene.center" je stalno osveževan glede na središče najmanjše kocke (box), poravnane z osmi in ki vsebuje sceno. Drugače rečeno: Če program premika celotno sceno, bo središče te scene stalno v središču okna.
forward To je vektor, ki kaže v isto smer, v katero gleda kamera, torej od trenutne lokacije kamere (ki jo podaja " scene.mouse.camera") proti središču scene ("scene.center"). Če spremenimo vektor "forward", se spremeni položaj kamere tako, da še vedno gleda v središče scene. Privzeta vrednost je (0,0,-1).
fov Ime tega atributa pomeni "Field of view" oziroma zorni kot kamere. Podan je v radianih. Definiran je z maksimalno vrednostjo vodoravnega in navpičnega zornega kota. Privzeto vrednost ima  pi/3.0 radianov (60 stopinj).
range Območje našega zanimanja za sceno vzdolž posameznih osi. To je vedno enako "1.0/scale", kar pomeni, da sta ta dva atributa soodvisna. Spreminjamo enega ali drugega. Privzeto velja (10,10,10).
scale Skalirni faktor, ki umeri območje zanimanja v kroglo enote (kroglo s polmerom 1). Privzeta vrednost je  (0.1,0.1,0.1).
uniform Pove, kako so umerjane posamezne osi.
scene.uniform = False # Posamezne osi imajo različne, neodvisne enote skaliranja
scene.uniform= True # vse osi imajo enake enote (privzeto je scene.uniform = True)

up Vektor, ki predstavlja v sceni smer navzgor. Ta vektor bi na zaslon vedno projiciral navpično črto. Kamera se vedno vrti okoli te osi. Privzeto je vektor "up" poravnan z osjo y.
Med vektorjema "up" in "forward" obstaja soodvisnost. Privzeto kaže kamera v smeri -z (0,0,-1). V tem primeru lahko za vektor "up" deklariramo os x ali y, ne pa osi z.Če naj bi navzgor kazala os z, moramo najprej nastaviti "forward" na kaj drugega (na primer na (1,0,0)).

autoscale S tem atributom vklopimo ali izklopimo avtomatsko skaliranje. Privzeto velja scene.autoscale = True.
userzoom S tem atributom vklopimo ali izklopimo možnost, da uporabnik sliko povečuje ali zmanjšuje. Privzeto je ta atribut enak True. Primer:
scene.userzoom =False # uporabnik slike ne more povečevati
userspin Če je ta atribut enak False, uporabnik scene ne more vrteti. Privzeto je ta atribut enak True.
userpan Če je ta atribut enak False, uporabnik ne bo mogel premikati (pan) scene, privzeto je scene.userpan = True
canvas




Krmiljenje pogleda z uporabo scene.camera

Prej opisani mehanizmi zagotavljajo pogled tako, da bodo 3D objekti vidni ne glede na to, kako jih uporabnik vrti ali povečuje. Kamera bo vedno usmerjena v scene.center, ki je privzeto v koordinatnem izhodišču. Uporabnikovi povečavi je vedno avtomatično prilagojen  scene.range .Če pa želimo "leteti" nad sceno, bi morali spreminjati scene.center, pri tem pa imeti konstanten "zoom". Tako je v tem primeru bolj priročno, če neposredno premikamo kamero. Vendar pozor: pri tem tvegamo, da naenkrat ne vidimo ničesar več, ker morda usmerimo kamero "v prazno".

scene.camera.pos The current location of the camera, whether due to your own settings, autoscaling, or as positioned by the user, is scene.camera.pos. For example, mag(scene.center - scene.camera.pos) is the distance from the current position of the camera to the center of the scene. The vectors scene.camera.pos and scene.mouse.ray together define all of the 3D points under the mouse cursor.

You can place the camera where you want it by executing
 
scene.camera.pos = vector(x,y,z)
.
When you set the camera position in this way, scene.center is reset to the location scene.camera.pos + scene.camera.axis. The effect is that the camera continues to point in the same direction as before, but from a new location.

 scene.camera.axis The current direction that the camera is pointing, whether due to your own settings, autoscaling, or as positioned by the user, is scene.camera.axis, which is equal to scene.center - scene.camera.pos; it points from the camera to scene.center.

When you change
 scene.camera.axis, scene.camera.pos is unaffected, but scene.center is reset to the location scene.camera.pos + scene.camera.axis, and scene.forward is reset to norm(scene.camera.axis).

 scene.up Changing scene.up rotates the display around the z axis and would be appropriate for example if you imagine the camera is attached to an airplane that rotates around its own axis in a turn or barrel roll.

 scene.camera.rotate(angle=..., axis=..., origin=...) As with other VPython objects, you can rotate the camera by an angle in radians, about a specified axis (which by default is scene.camera.axis), relative to a specified origin (which by default is scene.camera.pos).

canvas