3D-fysiikkamoottori
Sariola, Toni (2020)
Sariola, Toni
2020
All rights reserved. This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.
Julkaisun pysyvä osoite on
https://urn.fi/URN:NBN:fi:amk-2020052714272
https://urn.fi/URN:NBN:fi:amk-2020052714272
Tiivistelmä
Insinöörityön tarkoituksena oli toteuttaa 3D-fysiikkamoottori, jota voidaan käyttää pelisovelluksissa mallintamaan jäykkien kappaleiden liikettä ja niiden välisiä törmäyksiä kolmiulotteisessa tilassa. Fysiikkamoottorille asetettiin vaatimuksiksi olla tarpeeksi tehokas soveltuakseen käytettäväksi yksinkertaisissa pelisovelluksissa sekä helposti muokattavissa vastaamaan erilaisten projektien vaatimuksiin. Työtä varten tutkittiin peleissä tyypillisesti käytettyjen fysiikkamoottorien ohjelmointitoteutuksia ja niiden taustalla toimivaa fysiikkaa.
Työssä ohjelmoitiin 3D-fysiikkamoottori Unity-pelimoottorille käyttäen C#-ohjelmointikieltä. Fysiikkamoottoriin määriteltiin tarvittavat luokat noudattaen Unityn komponenttipohjaista arkkitehtuuria. Toteutuksessa hyödynnettiin joitakin Unityn tarjoamia apufunktioita ja kirjastoja.
Kappaleisiin vaikuttavien voimien ja niistä aiheutuvan liikkeen simuloiminen toteutettiin numeerisesti integroimalla käyttäen semi-implisiittistä Euler-menetelmää. Kappaleiden välisten törmäysten tunnistuksessa käytettävät algoritmit toteutettiin hyödyntämällä työssä luotua geometristen funktioiden kirjastoa. Suorituskyvyn optimoimiseksi törmäysten tunnistus jaettiin karkeaan ja tarkkaan vaiheeseen. Törmäysten käsittelemiseksi päädyttiin impulssipohjaiseen ratkaisumenetelmään. Menetelmän havaittiin kuitenkin aiheuttavan kappaleiden ei toivottua tunkeutumista toisiinsa, jonka korjaamiseksi päädyttiin käyttämään lineaariseksi projisoinniksi kutsuttua tekniikkaa.
Fysiikkamoottorin testausta ja esittelyä varten luotiin esittelysovellus. Sovelluksessa simuloidaan painovoiman alaisten kappaleiden törmäämistä keskenään sekä staattisten, liikkumattomien kappaleiden kanssa.
Insinöörityön lopputuloksena saatiin aikaiseksi toimiva 3D-fysiikkamoottori, joka täyttää sille asetetut vaatimukset. Fysiikkamoottoria voidaan hyödyntää sellaisenaan yksinkertaisissa peliprojekteissa tai laajentaa vaativampia projekteja varten. Fysiikkamoottorin lisäksi syntyi kattava geometriakirjasto, jota voidaan hyödyntää erillään moottorista tai sen laajentamisessa.
Työssä ohjelmoitiin 3D-fysiikkamoottori Unity-pelimoottorille käyttäen C#-ohjelmointikieltä. Fysiikkamoottoriin määriteltiin tarvittavat luokat noudattaen Unityn komponenttipohjaista arkkitehtuuria. Toteutuksessa hyödynnettiin joitakin Unityn tarjoamia apufunktioita ja kirjastoja.
Kappaleisiin vaikuttavien voimien ja niistä aiheutuvan liikkeen simuloiminen toteutettiin numeerisesti integroimalla käyttäen semi-implisiittistä Euler-menetelmää. Kappaleiden välisten törmäysten tunnistuksessa käytettävät algoritmit toteutettiin hyödyntämällä työssä luotua geometristen funktioiden kirjastoa. Suorituskyvyn optimoimiseksi törmäysten tunnistus jaettiin karkeaan ja tarkkaan vaiheeseen. Törmäysten käsittelemiseksi päädyttiin impulssipohjaiseen ratkaisumenetelmään. Menetelmän havaittiin kuitenkin aiheuttavan kappaleiden ei toivottua tunkeutumista toisiinsa, jonka korjaamiseksi päädyttiin käyttämään lineaariseksi projisoinniksi kutsuttua tekniikkaa.
Fysiikkamoottorin testausta ja esittelyä varten luotiin esittelysovellus. Sovelluksessa simuloidaan painovoiman alaisten kappaleiden törmäämistä keskenään sekä staattisten, liikkumattomien kappaleiden kanssa.
Insinöörityön lopputuloksena saatiin aikaiseksi toimiva 3D-fysiikkamoottori, joka täyttää sille asetetut vaatimukset. Fysiikkamoottoria voidaan hyödyntää sellaisenaan yksinkertaisissa peliprojekteissa tai laajentaa vaativampia projekteja varten. Fysiikkamoottorin lisäksi syntyi kattava geometriakirjasto, jota voidaan hyödyntää erillään moottorista tai sen laajentamisessa.