<< | #414 ; Iom da 3-dimensia grafiko por la 3D-mondo |
>> |
La veterinformoj jam rakontas pri venonta pli varma vetero por suda kaj okcidenta parto de Finnlando, sed ankoraŭ estis iom da frosto kaj iom multe da neĝo sur tero ĉi tie en urbo "Pori" antaŭ la Julo. La loka Julo tamen eble ne estos tre blanka ĉijare? Forta (akva) pluvo povas iom rapide konsumi la iom malpezan neĝon.
Mi amare malamas vintron kaj neĝon. La sezono de vintra solstico estas por mi deprimiga kaj trista. Oni tamen devas batali tra la vivo por kiel eble plej bone elturniĝi. Sufiĉe da tempo por ripozi en tombejo post morto.
La mikrokomputilo "Raspberry Pi" (mallongigita RPi) ja estis por mi grava. Printempe mi espereble povos renovigi mian 3D-fotilan projekton. Kaj eble mi iam povos eksperimenti eĉ kun la HQ-fotilo kaj apartaj objektivoj kun RPi endome.
Pretaj komerce haveblaj fotiloj tamen fakte certe estas pli praktikaj ekzemple por foti eksterdome. Provizore por mi nome ne eblas por uzi RPi kun propra akumulatoro kaj RPi konsumas relative multe da elektra kurento. RPi ja estas vera forta komputilo kaj ne nur io humila aldona parto por fotilo.
Nature mi daŭre revas pri simplaj robotoj. Fortaj industriaj robotoj klare estas tute ekster miaj ekonomiaj eblecoj, sed malgranda robota brako estus interesa por eksperimentoj. Eble ion belan tagon? Robota aŭto tamen provizore ne ŝajnas tre interesa. Por malgranda roboto estus iom malfacile por veturi ekzemple en naturo kaj endome la utilo de radoj ne estas tre granda.
Nu, ekzistas do iom multe da dolĉaj praktikaj revoj por la futuro, sed kiom provizore ĵus nun por mi restas pri la 3D-mondo? La eksterdoma mondo evidente estas reala kaj grava, sed nur malmulte por mi eblas al ĝi efiki en praktiko. Restas teorio. Kaj nature estas bona teorio grava afero.
Mi trovis interesaj pretaj metodoj por kalkuli utilaj 3D-rezultoj en finna libro de 3D-grafiko. Apude vi vidas iom da bildoj el la libro. La metodoj uzas vektoroj.
Grava baza problemo estas la tranĉaĵo de rekta linio kaj ebeno en 3D-spaco. La metodon oni eble povus utiligi ekzemple por la tempa skalo de sunhorloĝo.
La ebenon oni - eble iom surprize - povas prezenti per vektoro N kio estas perpendikla (orta) al la ebeno. Nu, nature estas du aliaj flankoj en ebeno kaj tial gravas por selekti la konvenan flankon de ebeno, sed alie oni povas libere pensi la lokon de orta vektoro N sur la ebeno kie oni volas.
Praktikaj ebenoj nature havas randojn, sed provizore ni ne pensu tro multe pri la randoj, nur pri la rekta ebeno en spaco, la principon.
Reflekto de lumo estas alia grava temo. Tion prezentas la suba foto. Provizore ni pensu nur reflekton el ebeno, el ebena spegulo. Pli kompleksan (ekzemple sferan) spegulon ni eble povos poste pritrakti aparte kiel kombinaĵo de multaj aliaj ebenoj. Gravas tamen ke ni scias la ortan vektoron N por ĉiu aparta parto de ebeno kaj la lokon de surfaca punkto kion ni volas utiligi.
La suba desegnaĵo aperas nur 2-dimensia, sed la sama principo validas ankaŭ por la praktike grava 3-dimensia kazo, kiam oni uzas 3D-vektoroj.
La apude desegnitaj ebenoj aperas horizontalaj, sed nature la ebeno ne povas ĉiam esti horizontala. Por utiligi la metodojn, ni certe unue lernu kiel kalkuli la vektorojn.
Parton de rekta linio inter la spacaj punktoj p kaj q oni povas prezenti kiel rekta linio pq. Vidu la supran bildon. Ni povas pensi ke estas vektoro el punkto p al punkto q.
Ni principe scias la 3D-koordinatojn de punktoj p = [ xp, yp, zp ]
kaj q = [ xq, yq, zq ]
kaj el tioj valuoj ni povas kalkuli la vektoron pq = q - p aŭ pli detale:
Estu la vektoro pq = q - p = [ xq - xp, yq - yp, zq - zp ]
Oni memoru ke oni subtrahu la koordinatojn de ekira punkto p el la koordinatoj de fina punkto q por kalkuli la vektoron pq, la vektoron el la ekira punkto p al la fina punkto q
Certe ekzistas ankaŭ aliaj metodoj por prezenti la vektoron. Eble ni jam scias la punkton p kaj ni scias ke la vektoro v el tio punkto havas la koordinatojn v = [ Δx, Δy, Δz ] = [ xv, yv, zv ]
Ni povus plilongigi la vektoron per simpla multipliko tiel ke la direkto restas la sama. Estu la simpla valuo t
(nenia vektoro, nur simpla numera valuo) la konvena multiplikanto. Ni povus atingi ion punkton x el la ekira punkto p per multipliko ĉi tiel: x = p + t * v, aŭ pli detale ĉi tiel : x = [ xx, yx, zx ] = [ xp, yp, zp ] + [ t*xv, t*yv, t*zv ]
Por la bildo de libro oni povus skribi v = pq = q - p = [ xq - xp, yq - yp, zq - zp ]
kaj tial por io multiplikanto t
estus x = [ xx, yx, zx ] = [ xp, yp, zp ] + [ t*(xq - xp), t*(yq - yp), t*(zq - zp) ]
Ni povas pensi ke la punkto x estas la punkto en la ebeno, la punkto kie la rekta linio tranĉas la ebenon, se la linio estus sufiĉe longa. Problemo nun restas kiel oni trovu la konvenan multiplikanton, la gravan valuon t
, tiel ke la plilongigita vektoro atingu la ebenon.
La libro donas formulon por funkcio s(t) = p + t*(pq)
kaj la ideo estus por trovi konvenan valuon por t
tiel ke la funkcio s(t)
produktas la koordinatojn de punkto x en la ebeno. Ni pensu pri la ebeno kion prezentas la formulo A*x + B*y + C*z + D = 0
kaj tiam havas la al ebeno orta vektoro N simple la sekvantajn valuojn por xyz -koordinatoj:
/ \ | A | N = | B | | C | \ /
Ni povas nun skribi la formulon por la ebeno ankaŭ jene : N · x + D = 0
kie la meza punkto (·) signifas vektoran skalaran produton inter la vektoroj N kaj x. Skalara produto de du vektoroj produktas kiel rezulto unu nuran nombron (skalaron), tute ne vektoron.
Sekve eblas kalkuli, ĉar ni ja volas ke estu s(t) = x, la punkto sur la ebeno:
N · s(t) + D = 0 N · (p + t*(pq)) + D = 0 N · p + t*N · pq + D = 0 t*(N · pq) = -N · p - D
Sekve eblas solvi la gravan valuon t
el la sekvanta formulo, kie kaj la dividato kaj la dividanto estas nuraj skalaroj.
N · p + D t = - ------------ N · pq
Nenio utila solvo tamen eblas se egalas la dividanto N · pq = 0
Unu simpla kalkula ekzemplo certe povus esti utila. Estas iom maloportune por kalkuli vektoroj mane, kaj tial ni prefere uzu la libere haveblan programon GNU Octave. Estu simpla ekzemplo pri horizontala sunhorloĝo. Estu longo de vertikala, al tempa skalo perpendikla ombra stango a = 1,00
kaj la koordinatoj por la punkto p, la fino de ombra stango do estu ( x = 0, y = 0, z = 1 )
Ni povas simple skribi la al horizontala ebeno ortan vektoron N = ( 0, 0, 1 ) ĉar estas en direkto de Z-akso. Do estas la valuoj por la ebeno A = 0, B = 0, C = 1. Sed kiom estas D? Ni scias la formulon de ebeno A*x + B*y + C*z + D = 0
kaj nun do egalas 1*z + D = 0
kaj sekve D = -z
sed sur horizontala ebeno estas z = 0 kaj tial estu D = 0.
Por kalkuli la komponantojn de vektoro pq ni unue kalkulu la koordinatojn por la punkto q. Ni ja jam scias ke punkto p = (0, 0, 1).
El apuda bildo ni povas vidi ke estas en la ortangula triangulo sin h = a/c
kaj kun a = 1
tial validas c = 1 / sin h
, kie la valuo c
estas la tuta longo de ombro el punkto p al punkto q.
Ni vidas ankaŭ ke validas cos h = b/c
kaj tial b = c * cos h
kaj kiam ni jam scias ke egalas c = 1 / sin h
, ni povas kalkuli la longon de ombro sur ebeno b = c * cos h = 1 * cos h / sin h = 1 / tan h
Nu certe ni povus ankaŭ kalkuli la saman rezulton b = 1 / tan h
pli simple el tan h = a/b
kiam ja egalas a = 1
En la horizontala ebeno ni vidas ke la longo de ombro sur ebeno b
estas hipotenuzo en du ortangulaj trianguloj kie la x- kaj y- koordinatoj de fina ombro estas katetoj. Tial ni povas kalkuli la xy -koordinatojn de fina ombro uzante la Azimuton A.
Rekte ni vidas el bildo cos A = y/b
kaj sin A = x/b
kaj tial validas y = b * cos A
kaj x = b * sin A
La Suno brilu el sudokcidento (Azimuto A = 45°) el alta angulo 30° super horizonto (altitudo h = 30°) kaj el tioj valuoj ni kalkulu la komponentojn por la vektoro de suna lumo. Unue la koordinatoj de fina ombro sur la ebeno, la punkto q.
b = 1 / tan h = 1 / tan 30° = 1,7321 # ombro sur ebeno x = b * sin A = 1,2247 y = b * cos A = 1,2247 z = 0 # sur ebeno
Sekve ni kalkulas la vektoron pq.
p = ( 0, 0, 1 ) q = ( 1,2247, 1,2247, 0 ) pq = q - p = ( 1,2247, 1,2247, -1 )
La komponantoj por la vektoro de suna lumo do estu pq = ( 1,2247, 1,2247, -1 )
kaj la al ebeno orta vektoro estu:
/ \ | 0 | N = | 0 | | 1 | \ /
Por la bona programo GNU Octave ni donu la valuojn de vektoroj en iom alia formo:
>> p = [0, 0, 1]; >> N = [0, 0, 1]; >> pq = [1.2247, 1.2247, -1];
Nun eblas kalkuli la skalarajn produtojn N · p
kaj N · pq
kaj la valuon t
:
>> y = dot (N, p) y = 1 >> x = dot(N, pq) x = -1 >> t = -y/x t = 1
Ni jam scias la formulon s(t) = p + t*(pq)
kaj tiel ni povas kalkuli la punkton q (kion ni fakte jam scias). Nu, la direkto de vektoro pq relative al la por ebeno orta vektoro N ja estas alia ol en la bildo de libro, sed nenia problemo.
>> q = p + t*pq q = 1.22470 1.22470 0.00000
Sendube iom stranga kalkula ekzemplo ... sed mi ja volis nur simplan ekzemplon por pruvi la korektecon de metodo.
Cetere, ni povas kalkuli la ortan vektoron N per la programo GNU Octave kiel skalara produto de horizontalaj X- kaj Y-aksoj.
>> x = [1, 0, 0] x = 1 0 0 >> y = [0, 1, 0] y = 0 1 0 >> N = cross (x, y) N = 0 0 1
Nia kara Vikipedio ankaŭ afable proponas esperante iom da informo pri la gravaj konceptoj Vektoro kaj pri la kalkulaj metodoj Skalara produto ( · ) kaj ankaŭ pri Vektora produto ( × )
Se iu vere nepre volus - en la moderna mondo - kalkuli mane vektoran produton, ekzistas ja ankaŭ la iom malbela formulo ...
/ \ / \ / \ | x | | x' | | y·z' - z·y' | v × u = | y | × | y' | = | z·x' - x·z' | | z | | z' | | x·y' - y·x' | \ / \ / \ /
... kie la normaj literoj (kiel x, y, z) estas komponantoj de vektoroj kaj la dikaj literoj ( v kaj u ) estas vektoroj de 3 komponantoj, same kiel antaŭe.
Do la antaŭa tre simpla ekzemplo mane:
/ \ / \ / \ / \ | 1 | | 0 | | 0·0 - 0·1 | | 0 | x × y = | 0 | × | 1 | = | 0·0 - 1·0 | = | 0 | = N | 0 | | 0 | | 1·1 - 0·0 | | 1 | \ / \ / \ / \ /
Kaj certe fine ..........
NI VENKOS!
La Ambasadoro en Finnlando de sendependa nacio Mueleja Insulo |