CGEX.LT - Visiems, kuriuos domina animacija, žaidimų programavimas ir visa kita kas susiję su kompiuterine grafika.

Archyvas (pagal kategoriją) ‘Žaidimų fizika’

Trimačiuose žaidimuose automobiliai, žmonės ar kiti objektai dažniausiai juda žemės paviršiumi. Nors tikrovėje tai atrodo paprasta ir natūralu trimatėje erdvėje šiems veiksmams modeliuoti reikalinga atlikti tam tikrus nesudėtingus geometrinius skaičiavimus. Matematiškai šnekant sprendžiamas objekto pozicionavimo ant paviršiaus uždavinys. Trimatėje erdvėje dažnai naudojami iš trikampių sudaryti paviršiai ir objektai į šiuos trikampius „remiasi“ atitinkamais atraminiais taškais (1 pav.). Šiems taškams dažniausiai reikia surasti y (aukščio) koordinatę, nes jų x ir z koordinatės paprastai būna žinomos.

objekto-paviršiaus atramos taškai

1 pav. Objekto – paviršiaus atramos taškai

Kaip matome, kad galėtume apskaičiuoti objekto poziciją ant paviršiaus ir pasvyrimo kampą reikalinga rasti šiuos, su paviršiumi besiliečiančius, atramos taškus. Tai galime atlikti trimis paprastais žingsniais:

  1. Rasti trikampius į kuriuos patenka atramos taškai;
  2. Rastuose trikampiuose nustatyti ieškomų atramos taškų pozicijas;
  3. Pagal rastas pozicijas atlikti objekto pasukimus ir pozicionavimą.

1. Trikampio radimas

Kaip jau buvo minėta anksčiau paviršiai dažnai būna sudaryti iš trikampių. Priklausomai nuo modelio šių trikampių sandara (topologija) gali būti tvarkinga arba netvarkinga. Esant tvarkingai sandarai trikampių išsidėstymas primena stačiakampį tinklelį (2 pav.).

tvarkinga-trikampiu-sandara-ieskomas-taskas

2 pav. Tvarkinga trikampių sandara ir ieškomas taškas

Tvarkingos sandaros atveju surasti trikampį į kurį patenka ieškomas taškas galima gana paprastai. Pirmu žingsniu reikia patikrinti ar taškas P’ tikrai patenka į tinklelį t. y. ar jis patenka į tinklelio pradžios koordinatėmis P(0,0) ir aukščiu v bei pločiu h nusakomais rėžiais:

objekto_html_m67bf493e (1)

objekto_html_34dbf22c

Antru žingsniu reikalinga surasti tinklelio gardelę į kurią patenka taškas P’. Tam reikia taško P’ koordinates atimti iš tinklelio pradžios taško koordinačių P(0,0) ir padalinti atitinkamai iš gardelės aukščio ir pločio:

objekto_html_m641b757a (2)

tinklelio-eilute-2a-formule

Gautųjų reikšmių sveikosios dalys nurodo gardelę kurią sudaro du trikampiai. 2 paveiksle tai atitinka trikampius sudarytus iš viršūnių v0, v1 , v2, ir v3.

Trečiuoju žingsniu randamas trikampis kuriame yra taškas P’. Jeigu tinklelio gardelės kvadratinės tai trikampį galima surasti paprasčiausiai lyginant taško vertikalią ir horizontalią dedamąsias gardelės pradžios taško v0 atžvilgiu:

objekto_html_m2df453d4 – taškas priklauso trikampiui v0, v2, v3

objekto_html_1ba22919 – taškas priklauso trikampiui v0, v1, v2

Jei gardelė yra stačiakampis (nekvadratinė) tada trikampio į kurį patenka taškas radimui reikalinga lyginti jos aukščio ir pločio santykius:

objekto_html_m63e06105 – taškas priklauso trikampiui v0, v2, v3

objekto_html_2d23d93d - taškas priklauso trikampiui v0, v1, v2

Kai paviršiaus konstrukcija pasižymi netvarkinga sandara pirmasis metodas netinka. Tokiu atveju būtų galima tikrinti taško patekimą visiems trikampiams, tačiau toks sprendimas nėra optimalus todėl į pagalbą pasitelkiami taip vadinamieji erdvės dalinimo algoritmai (angl. space partitioning). Vienas jų – paprastas ir gana efektyvus – sudalinti paviršiaus užimamą erdvę į stačiakampį tinklelį ir to tinklelio gardelėms (angl. cells) priskirti į jas patenkančius trikampius (3 pav.).

objekto_html_m36874202

3 pav. Netvarkinga trikampių sandara ir kvadratinis tinklelis

Kaip matome iš 3 paveikslo raudonas stačiakampis tinklelis perdengia kelis trikampius, todėl skirtingoms gardelėms gali būti priskiriami tie patys trikampiai. Pavyzdžiui gardelei (0,0) priskiriami A, B, C, D, E, F, G trikampiai, o gardelei (0, 1) priskiriami G, H, D, J trikampiai.

Tikrinant taško patekimą pirmiausiai surandama gardelė į kurią taškas patenka, o tada tikrinama kuriam iš gardelei priskirtų trikampių taškas priklauso. Vienas iš būdų nustatyti ar taškas priklauso trikampiui yra parametrinės plokštumos lygties sprendimas (4 pav.).

objekto_html_5b99330f

4 pav. Taško plokštumoje aprašymas u ir v parametrais

Kaip matome iš 4 paveikslo taško P poziciją plokštumoje galime nusakyti tokia formule:

objekto_html_m566074e2 (3)

Paprastumo dėlei išraiškas (B-A) ir (C-A) užrašome vektoriais rAB ir rAC, o A perkėlę į kitą lygties pusę gautą išraišką (P-A) užrašome kaip vektorių rAP. Tokiu būdu pertvarkę lygtį gauname:

objekto_html_m6e105b5a (4)

Kadangi turime du nežinomuosius reikalingos dvi lygtys, kad galėtume juos rasti. Abiejoms lygties pusėms atlikę skaliarinę sandaugą su rAB ir rAC, gauname:

objekto_html_m6980febc (5)

objekto_html_m3b17f26

Pertvarkome (5):

objekto-judejimas-ant-pavirsiaus_html_m4597b6a9 (6)

objekto-judejimas-ant-pavirsiaus_html_5b964ca5

Turime dvi lygtis ir du nežinomuosius todėl galime išsivesti u ir v:

objekto-judejimas-ant-pavirsiaus_html_78bbda4f(7)

objekto-judejimas-ant-pavirsiaus_html_72c00a06

Apskaičaivus u ir v reikšmes tikrinama ar tenkinamos sąlygos u > 0 ir v > 0 ir u+v < 1. Jei šios sąlygos tenkinamos taškas priklauso trikampiui.

2. Taškų pozicijos (aukščio) nustatymas

Nustačius faktą, kad taškas priklauso trikampiui reikalinga nustatyti ieškomo taško aukščio poziciją y (kadang x ir z pozicijos yra žinomos). Tam reikia nustatyti kurioje vietoje taškas guli trikampio plokštumoje. Šio uždavinio sprendimas remiasi tuo kad trikampio normalės (vektoriaus statmeno trikampio plokštumai) ir ant plokštumos gulinčio vektoriaus skaliarinė sandauga yra lygi 0 (5 pav.).

objekto-judejimas-ant-pavirsiaus_html_6eb9ceb5 (8)

objekto-judejimas-ant-pavirsiaus_html_m7048313c

5 pav. Plokštuma ir taškas P ant jos

Kadangi ieškomo taško x ir z koordinatės žinomos tai iš 8 lygties galime išskaičiuoti P taško y reikšmę:

objekto-judejimas-ant-pavirsiaus_html_m430f668e (9)

Iš 9 lygties išsivedę Py gauname:

objekto-judejimas-ant-pavirsiaus_html_275460a0 (10)

3. Objekto pasukimas

Objekto pozicionavimui ant erdvinio paviršiaus dažniausiai naudojami keturi atramos taškai. Jie nebūtinai turi būti išdėstyti stačiakampiu. Automobilio modeliui, pavyzdžiui, dažnai naudojama schema pateikta 6a paveiksle. Kaip matome iš paveikslo objektą reikalinga sukti atitinkamai pagal vieną ir kitą ašį. Tam galima pritaikyti sinusų teoremą (6b pav.).

objekto-judejimas-ant-pavirsiaus_html_m4ed693fc (11)

objekto-judejimas-ant-pavirsiaus_html_4f9baec9

6 pav. Objekto pasukimas ir pozicionavimas

Iš sinusų teoremos išsivedus α gauname ieškomo objekto vienos iš ašių pasvyrimo kampo formulę:

objekto-judejimas-ant-pavirsiaus_html_m18cb2ad7 (12)

Atitinkamai apskaičiuojama ir kita posvyrio objekto ašis.

3 pav. Netvarkinga trikampių sandara ir kvadratinis tinklelis

Kaip matome iš 3 paveikslo raudonas stačiakampis tinklelis perdengia kelis trikampius, todėl skirtingoms gardelėms gali būti priskiriami tie patys trikampiai. Pavyzdžiui gardelei (0,0) priskiriami A, B, C, D, E, F, G trikampiai, o gardelei (0, 1) priskiriami G, H, D, J trikampiai.

Tikrinant taško patekimą pirmiausiai surandama gardelė į kurią taškas patenka, o tada tikrinama kuriam iš gardelei priskirtų trikampių taškas priklauso. Vienas iš būdų nustatyti ar taškas priklauso trikampiui yra parametrinės plokštumos lygties sprendimas (4 pav.).

Sveiki visi! Tikimės, kad jau pasiilgote naujienų, todėl nieko nelaukdami pristatome jums antrąjį pirmojo Lietuvoje atviro animacijos projekto “2011″ trailerį (animatic, production trailer). Tuo pačiu norime pasveikinti visus dalyvavusius InfoShow 3D konferencijoje bei šios konferencijos organizatorius. Dėkui už klausimus, šiltą sutikimą ir palaikymą !

Projektas “2011″ – Production traileris

Įrašė CGEX