190 likes | 314 Views
Tehnička demonstracija proširene stvarnosti. FERmula 1.0. Projekt iz programske potpore. Računalna grafika i animacija Mentor: Prof.dr.sc. Željka Mihajlović, ZEMRIS Adnan Abdagić Toni Kork Nikola Martinec Petar Mrazović Robert Mrkonjić Željko Mijočević Ana Nekić Mario Volarević.
E N D
Tehnička demonstracija proširene stvarnosti FERmula 1.0
Projekt iz programske potpore • Računalna grafika i animacija • Mentor: Prof.dr.sc. Željka Mihajlović, ZEMRIS • Adnan Abdagić • Toni Kork • Nikola Martinec • PetarMrazović • Robert Mrkonjić • Željko Mijočević • Ana Nekić • Mario Volarević Voditelj
Sadržaj • Alati • Proširena stvarnost • Kretanje FERmule • Zakretanje kotača • Upravljanje • Kolizija • Sučelje • Modeli
Alati • Modeli • 3ds Max 2010 • Kod • Visual Studio 2008, C++ ARToolkit + OpenSceneGraph osgART
Proširena stvarnost • Eng. AugmentedReality • Mogućnost da računalno generiranu virtualnu stvarnost možemo dodati našem percipiranju prave stvarnosti oko nas • Obilježja: interakcija u stvarnom vremenu, kombinacija prividnog i stvarnog, 3D
Primjer realizacije AR WEB kamera Osobno računalo Markeri Prividna stvarnost Korisnik
Projekt FERmula 1.0 • Tehnička demonstracija prividne stvarnosti na primjeru igre s vozilima nazvanim FERmula. • Upravljanje prividnih vozila u stvarnom vremenu, na prividnoj sceni.
Zakretanje kotača FERmule // funkcija za traženje dijelova modela (služi za animaciju kotaca) osg::Node* FindNodeByName( osg::Node* pNode, conststd::string& sName ) { if ( pNode->getName()==sName ) { returnpNode; } osg::Group* pGroup = pNode->asGroup(); if ( pGroup ) { for ( unsigned int i=0; i<pGroup->getNumChildren(); i++ ) { osg::Node* pFound = FindNodeByName( pGroup->getChild(i), sName ); if ( pFound ) { returnpFound; } } } return 0; } voidokreniLijevo(bool t) { if (t) okrenutL = 1; elseokrenutD = 0; osg::Node* lijeviKotac = FindNodeByName( Model, "kotacPL" ); osg::Node* desniKotac = FindNodeByName( Model, "kotacPD" ); osg::MatrixTransform* ltr = AddMatrixTransform(lijeviKotac); osg::MatrixTransform* dtr = AddMatrixTransform(desniKotac); ltr->setMatrix(osg::Matrix::rotate(osg::inDegrees(30.0f),osg::Z_AXIS)); dtr->setMatrix(osg::Matrix::rotate(osg::inDegrees(30.0f),osg::Z_AXIS)); } “Dummy” kotacPD kotacPL case osgGA::GUIEventAdapter::KEY_Left: { voziloInputDeviceState->rotLReq = true; if (v->okrenutL == 0) v->okreniLijevo(true); return false; }
Upravljanje FERmulom virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) { osg::MatrixTransform* vmt=dynamic_cast<osg::MatrixTransform*> (node); if (vmt) { if ((voziloInputDeviceState>moveFwdRequest)&&(!voziloInputDeviceState- >moveBcwRequest)) { if (v->brzina<=(maxBrzina-1)&&(v->brzina>=0)) { v->brzina=(maxBrzina*(v->vrijeme)/(v->vrijeme+1)); v->vrijeme+=0.03f; } if (v->brzina<0) { v->brzina+=0.6; //pritisak na gas dok formula ide u rikverc } vmt->preMult(osg::Matrix::translate(0,-(v->brzina),0)); } //… } • Koriste se strelice na tipkovnici BoolMyKeyboardEventHandler::handle(const osgGA::GUIEventAdapter&ea,osgGA::GUIActionAdapter& aa) { switch (ea.getEventType()) { case (osgGA::GUIEventAdapter::KEYDOWN): { switch (ea.getKey()) { case osgGA::GUIEventAdapter::KEY_Up: voziloInputDeviceState->moveFwdRequest = true; return false; } //… } } } • Akceleracija ostvarena pomoću funkcije tipa x/(x+1)
Kolizija na virtualnoj sceni • Kontakt između dva ili više virtualnih objekata • Virtualni modeli aproksimirani su kvadrima radi ubrzanja performansi • Nakon svakog pomaka vozila, ispituje se postojanje presjeka kvadra vozila sa kvadrima scene
Aproskimacije volumena Kvadar – nešto preciznija aproksimacija Kugla – veoma gruba aproksimacija
Implementacija kolizije • Kvadri su generirani iz podataka sfere. Centar je identičan, a radijus sfere je skaliran u pravilnom omjeru za svaku os, tako je dobiven tzv. Bounding box • OSG ima gotove funkcije za ispitivanje kolizije između kugli i između kvadara
HUD sučelje • Eng. Heads up display • Potrebno izgraditi podstablo koje ima kao korijen odgovarajuću projekciju i model view matricu • Potrebno osigurati iscrtavanje HUD sučelja nakon ostatka scene osg::Projection* HUDProjectionMatrix = new osg::Projection; HUDProjectionMatrix->setMatrix(osg::Matrix::ortho2D(0,1024,0,768)); osg::MatrixTransform* HUDModelViewMatrix = newosg::MatrixTransform; HUDModelViewMatrix->setMatrix(osg::Matrix::identity()); HUDModelViewMatrix->setReferenceFrame(osg::Transform::ABSOLUTE_RF); root->addChild(HUDProjectionMatrix); HUDProjectionMatrix->addChild(HUDModelViewMatrix); HUDModelViewMatrix->addChild(HUDGeode); HUDStateSet->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF); HUDStateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); HUDStateSet->setRenderBinDetails(500,"RenderBin");
Modeliranje 3D modela • Autodesk 3ds Max
Postupak modeliranja • Počinje od standardnog objekta
Postupak modeliranja • Alati : delete. extrude, bridge, cap
Postupak modeliranja clone