Z´apadoˇcesk´a univerzita v Plzni Fakulta aplikovan´ych vˇed Katedra informatiky a v´ypoˇcetn´ı techniky
Bakal´ aˇ rsk´ a pr´ ace Ohmat´av´an´ı a modifikace geometrick´ych model˚ u pomoc´ı haptick´eho pera
Plzeˇ n, 2013
Barbora Jansk´ a
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem bakal´aˇrskou pr´aci vypracovala samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u.
V Plzni dne 10.kvˇetna 2013
Barbora Jansk´a
Podˇ ekov´ an´ı T´ımto bych chtˇela podˇekovat vedouc´ı pr´ace Prof. Dr. Ing. Ivanˇe Kolingerov´e za jej´ı trpˇelivost a podnˇetn´e rady a pˇripom´ınky a Ing. V´aclavu Purchartovi za cenn´e rady a pomoc pˇri vytv´aˇren´ı pr´ace.
Anotace C´ılem t´eto pr´ace bylo navrˇzen´ı a vytvoˇren´ı aplikace pro ohmat´av´an´ı geometrick´ ych model˚ u pomoc´ı haptick´eho pera. Pr´ace se soustˇred´ı na ohmat´av´an´ı 3D model˚ u lidsk´ ych hlav poskytnut´ ych Ing. Petrem Mart´ınkem, a to pomoc´ı dvou r˚ uzn´ ych knihoven z knihovny OpenHaptics firmy SensAble. Prvn´ı ˇc´ast je zamˇeˇrena na prozkoum´an´ı moˇznost´ı a v´ yhod ˇci nev´ yhod vyˇsˇs´ı knihovny HLAPI, kter´a umoˇzn ˇuje haptick´e renderov´an´ı pomoc´ı OpenGL geometrick´ ych primitiv. S pomoc´ı t´eto knihovny je vytvoˇrena aplikace pro ohmat´av´an´ı 3D model˚ u hlav vˇcetnˇe odliˇsen´ı r˚ uzn´ ych haptick´ ych materi´al˚ u pro vlasy, k˚ uˇzi a vousy. V druh´e ˇc´asti jsou pak pops´any klady a z´apory niˇzˇs´ı knihovny HDAPI. Bˇehem vytv´aˇren´ı aplikace pro ohmat´av´an´ı 3D model˚ u hlav s pouˇzit´ım t´eto knihovny bylo nutn´e vyˇreˇsit v´ ypoˇcet koliz´ı haptick´eho pera s 3D modelem pro haptickou odezvu. Dosaˇzen´e v´ ysledky byly otestov´any uˇzivateli. Zpracovan´e v´ ysledky test˚ u jsou uvedeny na konci t´eto pr´ace.
Abstract The goal of this thesis was to design and implement an application for touching geometrical models using haptic pen. The work concentrates on touching 3D models of human heads provided by Ing. Petr Mart´ınek, using two different libraries from the library OpenHaptics of SensAble company. The first part is focused on exploring the possibilities and advantages or disadvantages of the higher library HLAPI, that allows the haptic rendering using OpenGL geometric primitives. By using this library there has been created an application for touching 3D head models including differentiation of various haptic materials for hair, skin and beard. The second part then describes the pros and cons of the lower library HDAPI. During the creation of application for touching 3D head models using this library it was necessary to resolve the calculation of the collisions of the haptic pen with the 3D model for haptic feedback. The results were user tested. Processed results of the tests are included at the end of this thesis.
Obsah ´ 1 Uvod
1
2 Haptika 2.1 Pouˇzit´e haptick´e zaˇr´ızen´ı . . . 2.2 Dostupn´e knihovny . . . . . . 2.2.1 Knihovna CHAI 3D . . 2.2.2 Knihovna OpenHaptics
2 2 3 3 4
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
3 Navrˇ zen´ eˇ reˇ sen´ı 3.1 Popis ˇreˇsen´ı pomoc´ı knihovny HLAPI . . . . . . . . . . . . . . . . 3.1.1 Form´at soubor˚ u s 3D modely hlav . . . . . . . . . . . . . . 3.1.2 Naˇcten´ı troj´ uheln´ıkov´e s´ıtˇe (3D modelu) . . . . . . . . . . 3.1.3 Vykreslen´ı 3D kurzoru . . . . . . . . . . . . . . . . . . . . 3.2 Struktura programu pouˇz´ıvaj´ıc´ıho knihovnu HLAPI . . . . . . . . 3.2.1 Struktura tˇr´ıdy pro naˇcten´ı PLY . . . . . . . . . . . . . . 3.2.2 Inicializace OpenGL . . . . . . . . . . . . . . . . . . . . . 3.2.3 Nastaven´ı HLAPI . . . . . . . . . . . . . . . . . . . . . . . 3.2.4 Namapov´an´ı haptiky na grafick´e prostˇred´ı . . . . . . . . . 3.2.5 Vykreslen´ı grafiky . . . . . . . . . . . . . . . . . . . . . . . 3.2.6 Haptick´e renderov´an´ı . . . . . . . . . . . . . . . . . . . . . 3.2.7 Vykreslen´ı 3D kurzoru . . . . . . . . . . . . . . . . . . . . 3.3 Zhodnocen´ı dosaˇzen´ ych v´ ysledk˚ u implementace s vyuˇzit´ım knihovny HLAPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Popis ˇreˇsen´ı pomoc´ı knihovny HDAPI . . . . . . . . . . . . . . . . 3.4.1 Vykreslen´ı 3D kurzoru . . . . . . . . . . . . . . . . . . . . 3.4.2 Haptick´a smyˇcka . . . . . . . . . . . . . . . . . . . . . . . 3.5 Struktura programu pouˇz´ıvaj´ıc´ıho knihovnu HDAPI . . . . . . . . 3.5.1 Tˇr´ıda pro operace s vektory . . . . . . . . . . . . . . . . . 3.5.2 Nastaven´ı HDAPI . . . . . . . . . . . . . . . . . . . . . . . 3.5.3 Namapov´an´ı haptiky na grafick´e prostˇred´ı . . . . . . . . . 3.5.4 Vykreslen´ı 3D kurzoru . . . . . . . . . . . . . . . . . . . . 3.5.5 Implementace haptick´e smyˇcky a pl´anovaˇce . . . . . . . . . 3.5.6 Poˇca´teˇcn´ı postup . . . . . . . . . . . . . . . . . . . . . . . 3.5.7 Vylepˇsen´e ˇreˇsen´ı . . . . . . . . . . . . . . . . . . . . . . .
6 6 7 8 8 9 10 13 15 15 15 17 19 19 20 20 20 22 22 22 23 23 24 26 31
4 Uˇ zivatelsk´ e testy 4.1 V´ ysledky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34 36
5 Z´ avˇ er
47
Seznam obr´ azk˚ u
48
Reference
50
A Pˇ r´ıloha - dotazn´ık
51
´ 1 Uvod
1
1
´ Uvod
V souˇcasn´e dobˇe jsou aplikace haptiky a haptick´a zaˇr´ızen´ı v popˇred´ı z´ajmu mnoha v´ yzkumn´ ych skupin a pracoviˇst’. Vytvoˇren´e aplikace uˇzivatel˚ um umoˇzn ˇuj´ı umocnit dojem z interakce s poˇc´ıtaˇcem ˇci nˇejak´ ym zaˇr´ızen´ım, a to pˇrid´an´ım dalˇs´ıho smyslov´eho vjemu - hmatu. T´ım je umoˇznˇeno posunut´ı hranice simulac´ı i interaktivn´ıho ovl´ad´an´ı na zcela novou u ´roveˇ n. Napˇr´ıklad zapojen´ı haptick´ ych zaˇr´ızen´ı v medic´ınˇe umoˇzn ˇuje simulovat chirurgick´e z´akroky tak, jakoby byly opravdu prov´adˇeny. V d´alkov´em ovl´ad´an´ı zaˇr´ızen´ı pak oper´ator˚ um tato zaˇr´ızen´ı umoˇzn ˇuj´ı poc´ıtit zpˇetnou vazbu efektor˚ u dan´ ych zaˇr´ızen´ı. C´ılem t´eto pr´ace bylo navrhnout a realizovat aplikaci vyuˇz´ıvaj´ıc´ı haptick´eho pera. Tato aplikace umoˇzn ˇuje ohmat´av´an´ı 3D model˚ u lidsk´ ych hlav, vˇcetnˇe zprostˇredkov´an´ı rozd´ıln´ ych vjem˚ u pˇri ohmat´av´an´ı r˚ uzn´ ych povrch˚ u (vlasy, vousy). Bˇehem n´avrhu bylo potˇreba prostudovat moˇznosti existuj´ıc´ıch knihoven pro zpˇetnou vazbu, a pot´e po v´ ybˇeru t´e nejvhodnˇejˇs´ı knihovny prov´est vlastn´ı implementaci.
2 Haptika
2
2
Haptika
S pouˇzit´ım haptick´e technologie (haptiky) lze doc´ılit ohmat´av´an´ı virtu´aln´ıch objekt˚ u uˇzivatelem. Tato technologie je zaloˇzena na hmatov´e zpˇetn´e vazbˇe. Umoˇzn ˇuje uˇzivateli pomoc´ı uplatˇ nov´an´ı sil, vibrac´ı a pohyb˚ u poc´ıtit hmatov´ y kontakt s ohmat´avan´ ym objektem a pˇr´ıpadnˇe s n´ım i pohybovat. Jak pro v´ yzkumn´e, tak pro komerˇcn´ı u ´ˇcely existuje mnoho haptick´ ych zaˇr´ızen´ı, kter´a umoˇzn ˇuj´ı uˇzivatel˚ um hmatovou odezvu pˇri dotyku virtu´aln´ıch tˇeles. Pozn.: Slovo haptika je ˇreck´eho p˚ uvodu a znamen´a smysl pro dotek.
2.1
Pouˇ zit´ e haptick´ e zaˇ r´ızen´ı
Pro u ´ˇcely sv´e bakal´aˇrsk´e pr´ace jsem pouˇzila haptick´e zaˇr´ızen´ı dostupn´e na katedˇre informatiky a v´ ypoˇcetn´ı techniky na Z´apadoˇcesk´e univerzitˇe. Jedn´a se o zaˇr´ızen´ı PHANTOM Omni od firmy Sensable viz Obr.2.1. Toto haptick´e zaˇr´ızen´ı, kter´e lze nazvat haptick´ ym perem, m´a ˇsest stupˇ n˚ u volnosti pro sn´ım´an´ı pozice a dvˇe integrovan´a tlaˇc´ıtka na stylusu, kter´a se daj´ı uˇzivatelem naprogramovat na r˚ uzn´e ud´alosti. Rozsah pohybu zaˇr´ızen´ı je omezen na pohyb ruky a jej´ı ot´aˇcen´ı v z´apˇest´ı. Podrobn´e parametry zaˇr´ızen´ı je moˇzn´e nal´ezt v Tabulce 2.1.
Obr´azek 2.1: Haptick´e zaˇr´ızen´ı PHANTOM Omni [Zdroj: www.sensable.com]
2 Haptika Pracovn´ı plocha zpˇetn´e vazby V´aha Nomin´aln´ı rozliˇsen´ı polohy Tˇren´ı Maxim´aln´ı s´ıla Souvisl´a s´ıla (24h) Tuhost v ose X Tuhost v ose Y Tuhost v ose Z Setrvaˇcnost Silov´a zpˇetn´a vazba Rozhran´ı
3 > 160 W x 120 H x 70 D mm 3 lbs 15 oz > 0.055 mm < 0.26 N 3.3 N > 0.88 N > 1.26 N / mm > 2.31 N / mm > 1.02 N / mm ∼ 45 g x, y, z IEEE-1394 FireWire port: 6-pin to 6-pin
Tabulka 2.1: Technick´e specifikace haptick´eho zaˇr´ızen´ı PHANTOM Omni [Zdroj dat: www.sensable.com]
2.2
Dostupn´ e knihovny
Pro vytvoˇren´ı aplikace, kter´a bude umoˇzn ˇovat ohmat´av´an´ı virtu´aln´ıch objekt˚ u pomoc´ı manipulace se zvolen´ ym haptick´ ym zaˇr´ızen´ım, lze vyuˇz´ıt nˇekterou z dostupn´ ych haptick´ ych knihoven. V pr˚ ubˇehu anal´ yzy jsem uvaˇzovala o n´asleduj´ıc´ıch dvou knihovn´ach. 2.2.1
Knihovna CHAI 3D
CHAI 3D je multi-platformn´ı opensource sada knihoven pro haptick´e renderov´an´ı, kter´a je vyuˇz´ıv´ana v mnoha v´ yzkumn´ ych a v´ yrobn´ıch projektech, jako napˇr´ıklad v simul´atorech nebo l´ekaˇrsk´ ych aplikac´ıch. CHAI 3D je naps´ana v jazyce C++ a je urˇcena pro vytv´aˇren´ı aplikac´ı, kter´e kombinuj´ı 3D modelov´an´ı se silovou zpˇetnou vazbou. Pouˇz´ıv´a velk´e mnoˇzstv´ı algoritm˚ u pro renderov´an´ı s´ıly, kter´e umoˇzn ˇuj´ı program´ator˚ um snadno vyv´ıjet sofistikovan´e simulace se schopnost´ı integrovan´e silov´e zpˇetn´e vazby. OpenGL grafick´e j´adro poskytuje z´aklady pro snadn´e vykreslov´an´ı virtu´aln´ıch prostˇred´ı pomoc´ı speci´aln´ıho 3D grafick´eho akceleraˇcn´ıho hardwaru. V´ıce informac´ı o t´eto knihovnˇe lze nal´ezt na webov´ ych str´ank´ach, viz [1].
2 Haptika
2.2.2
4
Knihovna OpenHaptics
Tato knihovna je poskytov´ana firmou SensAble (nejnovˇejˇs´ı verze 3.1) a skl´ad´a se z nˇekolika knihoven. Tˇemi jsou QuickHaptics micro API, Haptic Device API (HDAPI) a Haptic Library API (HLAPI). Jednotliv´e knihovny jsou uspoˇra´d´any dle Obr.2.2. Podrobn´e informace o t´eto knihovnˇe je moˇzn´e nal´ezt na str´ank´ach firmy Sensable [4].
Obr´azek 2.2: Uspoˇra´d´an´ı jednotliv´ ych knihoven v OpenHaptics
QuickHaptics micro API Tato knihovna je nejnovˇejˇs´ı ze zm´ınˇen´ ych knihoven. Je implementov´ana v C++. Umoˇzn ˇuje snadn´e a rychl´e vytv´aˇren´ı haptick´ ych aplikac´ı nebo pˇrid´av´an´ı haptiky do jiˇz existuj´ıc´ıch aplikac´ı. D´ıky vestavˇen´ ym geometrick´ ym parser˚ um a inteligentn´ım v´ ychoz´ım parametr˚ um je moˇzn´e vytvoˇrit haptick´e/grafick´e aplikace s minim´aln´ım mnoˇzstv´ım k´odu. Definuje ˇctyˇri z´akladn´ı funkˇcn´ı tˇr´ıdy: • DeviceSpace - pracovn´ı prostˇred´ı, v nˇemˇz se m˚ uˇze haptick´e zaˇr´ızen´ı pohybovat
2 Haptika
5
• QHRenderer - z´akladn´ı tˇr´ıda pro QHWin32 a QHGLUT. Vytvoˇren´ı okna, kter´e vykresl´ı tvary z pohledu kamery a umoˇzn´ı uˇzivateli c´ıtit tyto tvary pomoc´ı hmatov´eho zaˇr´ızen´ı. • Shape - z´akladn´ı tˇr´ıda pro jeden ˇci v´ıce geometrick´ ych objekt˚ u, kter´e jsou renderov´any jak graficky tak hapticky. • Cursor - grafick´e zn´azornˇen´ı koncov´eho bodu haptick´eho pera
Haptic Device API (HDAPI) Tato knihovna poskytuje n´ızko´ urovˇ nov´ y pˇr´ıstup k haptick´emu zaˇr´ızen´ı a umoˇzn ˇuje program´atorovi pˇr´ımo generovat s´ılu a mˇenit konfiguraci runtime chov´an´ı. Vyˇzaduje implementaci efektivn´ıch algoritm˚ u pro renderov´an´ı s´ıly a algoritm˚ u pro detekci koliz´ı. Z´aroveˇ n se program´ator mus´ı starat o synchronizaci jednotliv´ ych vl´aken. HDAPI neumoˇzn ˇuje implementaci reakc´ı na ud´alosti.
Haptic Library API (HLAPI) Tato knihovna poskytuje oproti HDAPI vysoko´ urovˇ nov´e haptick´e renderov´an´ı. Vyuˇz´ıv´a OpenGL API. Umoˇzn ˇuje pouˇz´ıt OpenGL k´od jak pro grafick´e, tak pro haptick´e renderov´an´ı. V´ ypoˇcet haptick´eho renderov´an´ı je zaloˇzen na geometrick´ ych primitivech, transformac´ıch a vlastnostech materi´alu. V´ yraznˇe zjednoduˇsuje synchronizaci grafick´ ych a haptick´ ych vl´aken. D´ale umoˇzn ˇuje implementaci reakc´ı na ud´alosti, coˇz usnadˇ nuje implementaci komplikovan´ ych haptick´ ych interakc´ı, jako napˇr´ıklad dot´ yk´an´ı se geometrie, stisknut´ı tlaˇc´ıtek a pohyb s objektem.
Vˇsechny tyto knihovny je moˇzno v aplikaci propojit a vyuˇz´ıvat tak vlastnost´ı vˇsech knihoven. HLAPI je postavena na HDAPI, proto m˚ uˇze program´ator pˇri vytv´aˇren´ı aplikace zaloˇzen´e na HLAPI vyuˇz´ıt ˇc´ast funkˇcnosti z HDAPI. HDAPI je nutn´e pouˇz´ıt pro inicializaci a konfiguraci popisovaˇce haptick´eho zaˇr´ızen´ı (HDD). Ten je pak vyuˇz´ıv´an HL haptick´ ym renderov´ ym kontextem (HHLRC) pro rozhran´ı s haptick´ ym zaˇr´ızen´ım. T´ım je program´atorovi umoˇznˇeno ˇr´ıdit chov´an´ı haptick´eho zaˇr´ızen´ı.
3 Navrˇzen´e ˇreˇsen´ı
3
6
Navrˇ zen´ eˇ reˇ sen´ı
C´ılem t´eto pr´ace bylo navrˇzen´ı a vytvoˇren´ı aplikace pro ohmat´av´an´ı virtu´aln´ıch geometrick´ ych model˚ u pomoc´ı haptick´eho pera. Pro testov´an´ı t´eto aplikace jsem mˇela za u ´kol pouˇz´ıt 3D modely lidsk´ ych hlav. Tyto triangularizovan´e modely jsou v´ ysledkem diplomov´e pr´ace Ing. Petra Mart´ınka [5]. Pro realizaci ˇreˇsen´ı jsem si vybrala knihovnu OpenHaptics od firmy SensAble, jej´ımˇz v´ yrobkem je i pouˇz´ıvan´e haptick´e zaˇr´ızen´ı, a to pro v´ıce moˇznost´ı v rozd´ılnosti pˇr´ıstup˚ u k haptick´emu renderov´an´ı neˇz tomu je u knihovny CHAI 3D. Nejprve jsem se rozhodla vyuˇz´ıt moˇznost´ı vyˇsˇs´ı knihovny HLAPI, s n´ıˇz jsem jiˇz mˇela zkuˇsenost z pˇredmˇetu KIV/PRJ5, pro jej´ı vysoko´ urovˇ nov´ y pˇr´ıstup k haptick´emu renderov´an´ı a pro moˇznost vyuˇzit´ı OpenGL k´odu. V´ ypoˇcet s´ıly zpˇetn´e vazby haptick´eho zaˇr´ızen´ı je moˇzn´e v tomto pˇr´ıpadˇe ovlivˇ novat pouze nastaven´ım vlastnost´ı ohmat´avan´eho materi´alu, coˇz s nejvˇetˇs´ı pravdˇepodobnost´ı nebude pro tuto aplikaci postaˇcuj´ıc´ı vzhledem k tomu, ˇze bude tˇreba napodobit r˚ uzn´e materi´aly, jako jsou vlasy a vousy. Aby bylo moˇzn´e implementovat vlastn´ı v´ ypoˇcet s´ıly, bude potˇreba vyuˇz´ıt moˇznost´ı knihovny HDAPI. Vˇsechny aplikace byly vytv´aˇreny ve v´ yvojov´em prostˇred´ı Microsoft Visual Studio 2010, pomoc´ı nˇejˇz je moˇzn´e kompilovat program i se vˇsemi nutn´ ymi soubory z knihovny OpenHaptics verze 3.1.
3.1
Popis ˇ reˇ sen´ı pomoc´ı knihovny HLAPI
ˇ sen´ı se skl´ad´a z n´asleduj´ıc´ıch ˇc´ast´ı. Nejprve je naˇctena troj´ Reˇ uheln´ıkov´a s´ıt’ 3D modelu hlavy pomoc´ı upraven´e tˇr´ıdy p˚ uvodnˇe vytvoˇren´e Ing. Purchartem. Tuto troj´ uheln´ıkovou s´ıt’ pot´e pouˇz´ıv´am pro grafickou vizualizaci 3D modelu a t´eˇz pˇri haptick´em renderov´an´ı, kdy je pomoc´ı knihovn´ıch funkc´ı uloˇzena geometrie jednotliv´ ych troj´ uheln´ık˚ u troj´ uheln´ıkov´e s´ıtˇe a tato s´ıt’ je n´aslednˇe hapticky vyrenderov´ana. D´ale je zapotˇreb´ı vykreslit 3D kurzor, kter´ y zn´azorˇ nuje polohu haptick´eho pera ve virtu´aln´ım prostˇred´ı, kde je um´ıstˇen virtu´aln´ı objekt odpov´ıdaj´ıc´ı naˇcten´emu modelu.
3 Navrˇzen´e ˇreˇsen´ı
3.1.1
7
Form´ at soubor˚ u s 3D modely hlav
Triangularizovan´e modely jsou uloˇzeny ve form´atu PLY (Polygon File Format), kter´ y slouˇz´ı pro ukl´ad´an´ı grafick´ ych objekt˚ u popsan´ ych jako soubor polygon˚ u. Tento form´at m˚ uˇze obsahovat r˚ uzn´e vlastnosti, jako je barva, norm´ala nebo souˇradnice textur. V hlaviˇcce PLY souboru jsou vyps´any vˇsechny druhy parametr˚ u, kter´e jsou v nˇem obsaˇzeny. Pot´e jsou po ˇra´dk´ach vyps´any souˇradnice vrchol˚ u spolu s jejich vlastnostmi, n´asleduj´ı v´ ypisy jednotliv´ ych stˇen (polygon˚ u), kde je u kaˇzd´e stˇeny pops´ano, z kolika vrchol˚ u se skl´ad´a a jak´e jsou indexy tˇechto vrchol˚ u. Hlaviˇcka soubor˚ u s modely hlav m´a n´asleduj´ıc´ı strukturu. Tato struktura se u r˚ uzn´ ych model˚ u liˇs´ı pouze v poˇctu vrchol˚ u a troj´ uheln´ık˚ u: ply format ascii 1.0 comment VCGLIB generated element vertex 32334 property float x property float y property float z property float nx property float ny property float nz property uchar red property uchar green property uchar blue property uchar alpha property float texture_u property float texture_v element face 64544 property list uchar int vertex_indices end_header
Soubor tedy obsahuje souˇradnice vrchol˚ u spolu s jejich norm´alami, barvami, pr˚ uhlednost´ı, texturov´ ymi souˇradnicemi a indexy vrchol˚ u, z nichˇz se skl´adaj´ı jednotliv´e polygony. Oˇcek´av´ame, ˇze vˇsechny polygony, ze kter´ ych se model skl´ad´a, jsou troj´ uheln´ıky. Jin´a moˇznost v t´eto pr´aci nen´ı oˇsetˇrena.
3 Navrˇzen´e ˇreˇsen´ı
3.1.2
8
Naˇ cten´ı troj´ uheln´ıkov´ e s´ıtˇ e (3D modelu)
Pro naˇcten´ı 3D modelu ze souboru jsem pouˇzila tˇr´ıdu vytvoˇrenou Ing. Purchartem v jazyce C++, kterou bylo potˇreba upravit pro danou strukturu PLY souboru. Troj´ uheln´ıkov´a s´ıt’ je vytvoˇrena ze samostatn´ ych troj´ uheln´ık˚ u. Souˇradnice jednotliv´ ych vrchol˚ u troj´ uheln´ık˚ u jsou naˇcteny ze souboru a jsou uloˇzeny do pˇripraven´e struktury. Aby bylo moˇzn´e z jednotliv´ ych vrchol˚ u poskl´adat vˇsechny troj´ uheln´ıky, je potˇreba pro kaˇzd´ y troj´ uheln´ık zn´at indexy (poˇradov´e ˇc´ıslo) tˇr´ı vrchol˚ u, z nichˇz m´a b´ yt sestaven. Tyto indexy jsou tak´e naˇcteny ze souboru. Pot´e jiˇz staˇc´ı pouze pouˇz´ıt nˇekolik OpenGL pˇr´ıkaz˚ u (v´ıce v kapitole 3.2.5), kter´e pospojuj´ı jednotliv´e vrcholy do troj´ uheln´ık˚ u a troj´ uheln´ıky zobraz´ı. Pro grafickou vizualizaci je nav´ıc naˇctena norm´ala a barva vrcholu. U nˇekter´ ych 3D model˚ u hlav jsou jednotliv´e vrcholy obarveny podle um´ıstˇen´ı vlas˚ u a vous˚ u na modelu. 3.1.3
Vykreslen´ı 3D kurzoru
Haptick´e renderov´an´ı geometrie (v naˇsem pˇr´ıpadˇe troj´ uheln´ık˚ u) se prov´ad´ı pomoc´ı proxy metody. Proxy je z´astupn´ y bod haptick´eho zaˇr´ızen´ı. Poloha tohoto bodu je omezena pouze na vnˇejˇs´ı plochu ohmat´avan´ ych objekt˚ u. Tento bod se st´ale aktualizuje tak, aby odpov´ıdal poloze haptick´eho zaˇr´ızen´ı, ale z´aroveˇ n nezasahoval do vytvoˇren´ ych objekt˚ u. Zat´ımco skuteˇcn´a poloha haptick´eho zaˇr´ızen´ı m˚ uˇze b´ yt uvnitˇr objektu, proxy bod bude vˇzdy mimo. Pokud se haptick´e pero nedot´ yk´a tvaru, bude z´astupn´ y bod um´ıstˇen v poloze haptick´eho zaˇr´ızen´ı. Pˇri kontaktu s objektem vˇsak poloha haptick´eho zaˇr´ızen´ı pronikne skrz plochu, ale proxy z˚ ustane na jej´ım povrchu. S´ıla zpˇetn´e vazby, kter´a je odes´ıl´ana na haptick´e zaˇr´ızen´ı, je vypoˇc´ıt´ana natahov´an´ım virtu´aln´ı soustavy pruˇzina-tlumiˇc mezi polohou haptick´eho zaˇr´ızen´ı a pozic´ı proxy - viz Obr.3.1, kde Proxy Position je pozice proxy bodu, New Haptic Device Position je aktu´aln´ı poloha haptick´eho zaˇr´ızen´ı a damper-spring je soustava pruˇzina-tlumiˇc. Pro vykreslen´ı 3D kurzoru je zapotˇreb´ı pouze naˇc´ıst souˇradnice proxy bodu, kde m´a b´ yt kurzor vykreslen, a urˇcit mˇeˇr´ıtko kurzoru, protoˇze bude vykreslen jako 3D objekt ve sc´enˇe.
3 Navrˇzen´e ˇreˇsen´ı
9
Obr´azek 3.1: Zn´azornˇen´ı proxy bodu [Zdroj: http://geomagic.com/files/4013/ 4851/4367/OpenHaptics_ProgGuide.pdf]
3.2
Struktura programu pouˇ z´ıvaj´ıc´ıho knihovnu HLAPI
Aplikace je implementov´ana v jazyce C++. Souˇca´st´ı programu pro haptick´e renderov´an´ı je i upraven´a tˇr´ıda pro naˇcten´ı PLY souboru. Haptick´a ˇca´st programu a grafick´a vizualizace jsou obsaˇzeny v souboru Touch.cpp. Typick´ y HL program m´a strukturu zn´azornˇenou na Obr.3.2. Program lze tedy kromˇe naˇcten´ı PLY souboru rozdˇelit na nˇekolik d´ılˇc´ıch ˇca´st´ı. Tˇemi jsou nastaven´ı OpenGL a HLAPI, namapov´an´ı pracovn´ıho prostˇred´ı haptick´eho zaˇr´ızen´ı na grafick´e prostˇred´ı a pak opakovanˇe prob´ıhaj´ıc´ı vykreslen´ı grafiky, haptiky a 3D kurzoru.
3 Navrˇzen´e ˇreˇsen´ı
10
Obr´azek 3.2: Typick´a struktura HL programu [Zdroj: http://geomagic.com/ files/4013/4851/4367/OpenHaptics_ProgGuide.pdf]
3.2.1
Struktura tˇ r´ıdy pro naˇ cten´ı PLY
Naˇcten´ı 3D modelu zajiˇst’uje tˇr´ıda, jeˇz se skl´ad´a ze souboru PlyFile.cpp a pˇr´ısluˇsn´eho hlaviˇckov´eho souboru PlyFile.h. P˚ uvodn´ı tˇr´ıda poskytnut´a Ing. Purchartem umoˇzn ˇovala jen naˇcten´ı PLY souboru, kter´ y obsahoval kromˇe hlaviˇcky pouze souˇradnice vrchol˚ u a indexy vrchol˚ u kaˇzd´eho polygonu. Bylo zde zajiˇstˇeno i prohozen´ı y-ov´ych souˇradnic se z-ov´ymi souˇradnicemi pro potˇreby OpenGL souˇradnicov´eho syst´emu a tak´e seˇrazen´ı podle hloubky (z-ov´e souˇradnice) pomoc´ı algoritmu quicksort - viz [6]. Soubor obsahoval i normalizaci souˇradnic vrchol˚ u. Pro naˇcten´ı PLY souboru s 3D modelem bylo potˇreba upravit tuto tˇr´ıdu tak, aby kromˇe naˇcten´ı souˇradnic vrchol˚ u umoˇzn ˇovala i uloˇzen´ı jejich norm´al, barev a
3 Navrˇzen´e ˇreˇsen´ı
11
texturov´ ych souˇradnic. Barvy vrchol˚ u urˇcuj´ı um´ıstˇen´ı vlas˚ u a vous˚ u na obliˇceji. Alpha sloˇzka je u kaˇzd´eho vrcholu rovna 255, nen´ı tedy nutn´e ji ukl´adat. Z´aroveˇ n jsem tˇr´ıdu modifikovala tak, aby bylo moˇzn´e model uloˇzit do stejn´eho souboru s jiˇz pˇrehozen´ ymi souˇradnicemi y a z a seˇrazen´ ymi vrcholy podle hloubky. T´ım bylo doc´ıleno vˇetˇs´ı rychlosti pˇri naˇc´ıt´an´ı modelu, protoˇze vzhledem k vˇetˇs´ımu poˇctu vrchol˚ u je doba jejich seˇrazen´ı velmi dlouh´a. D´ıky moˇznosti uloˇzen´ı jiˇz upraven´eho modelu pot´e staˇc´ı jen naˇc´ıst ze souboru poˇzadovan´e hodnoty. Pro v´ ybˇer moˇznosti, zda chceme model uloˇzit nebo pouze naˇc´ıst, slouˇz´ı parametr konstruktoru action: static const int ACTION_LOAD = 1; static const int ACTION_SAVE = 2; PlyFile(std::string path, int action); Souˇradnice vrchol˚ u, jejich barvy a texturov´e souˇradnice jsou pro kaˇzd´ y vrchol uloˇzeny do struktury vertex: typedef struct { float x,y,z; float nx,ny,nz; int r,g,b; float u,v; } vertex; kde parametry x, y a z jsou souˇradnice dan´eho vrcholu, nx, ny a nz souˇradnice jeho norm´aly, r, g, b sloˇzky jeho barvy a u a v jeho texturov´e souˇradnice. Vˇsechny vrcholy uchovan´e v t´eto struktuˇre jsou postupnˇe pˇrid´av´any do kontejneru jazyka C++ typu vector pojmenovan´eho vertices. Naˇc´ıt´an´ı parametr˚ u vrchol˚ u ze souboru a jejich n´asledn´e ukl´ad´an´ı do kontejneru prob´ıh´a v metodˇe loadFile(std::string path), kter´a se automaticky vykon´a po zad´an´ı akce naˇcten´ı do konstruktoru a jej´ımˇz atributem je cesta k souboru s modelem. Po naˇcten´ı vˇsech vrchol˚ u je v metodˇe zajiˇstˇeno i naˇcten´ı index˚ u polygon˚ u. Indexy vrchol˚ u kaˇzd´eho troj´ uheln´ıku jsou naˇcteny do struktury int3:
3 Navrˇzen´e ˇreˇsen´ı
12
typedef struct { int a,b,c; } int3; kde parametry a, b a c jsou jednotliv´e indexy vrchol˚ u dan´eho troj´ uheln´ıka. Pro kaˇzd´ y troj´ uheln´ık jsou takto uloˇzen´e informace o jeho vrcholech postupnˇe pˇrid´av´any do kontejneru vector s n´azvem faces. V metodˇe loadFile je nejprve naˇctena hlaviˇcka s informac´ı o poˇctu vrchol˚ ua poˇctu troj´ uheln´ık˚ u do promˇenn´ ych vertexCount a faceCount. D´ale jiˇz prob´ıh´a postupn´e naˇc´ıt´an´ı parametr˚ u vrchol˚ u a index˚ u troj´ uheln´ıku podle v´ yˇse zm´ınˇen´eho postupu, kter´e vypad´a takto: int alpha; for (int i=0; i
> v->x >> v->y >> v->z; //normaly f >> v->nx >> v->ny >> v->nz; //barvy f >> v->r >> v->g >> v->b; //skip alphy f >> alpha; //textur. souradnice f >> v->u >> v->v; this->vertices.push_back(v); } int vertCount;
3 Navrˇzen´e ˇreˇsen´ı
13
for (int i=0; i> vertCount; if(vertCount != 3) { cout << "vertCount: "<< vertCount << endl; } int3 *face = new int3; f >> face->a >> face->b >> face->c; this->faces.push_back(face); }
Do promˇenn´e vertCount se naˇc´ıt´a prvn´ı hodnota z ˇr´adky, kter´a informuje o poˇctu vrchol˚ u polygonu. Je zde provedena kontrola, zda jsou vˇsechny polygony troj´ uheln´ıky. Pokud tomu tak nen´ı, pouze se vyp´ıˇse poˇcet vrchol˚ u dan´eho polygonu.
3.2.2
Inicializace OpenGL
Ve sv´em programu jsem nejprve provedla inicializaci OpenGL, jako je nastaven´ı velikosti okna, nastaven´ı glut funkc´ı a nastaven´ı barvy pozad´ı. V programu je vytvoˇrena struktura udrˇzuj´ıc´ı informace o rozmˇerech a textu okna, o poloze pˇredn´ı a zadn´ı oˇrez´avac´ı roviny a o pozorovac´ım u ´hlu - viz n´asleduj´ıc´ı k´od. typedef struct { int width; int height; char* title; float field_of_view_angle; float z_near; float z_far; } glutWindow;
3 Navrˇzen´e ˇreˇsen´ı
14
Mezi glut funkce, kter´e jsou v programu nastavov´any patˇr´ı nastaven´ı okna, kde jsou pouˇzity atributy struktury glutWindow: glutInitWindowSize(win.width,win.height); glutCreateWindow(win.title);
D´ale je inicializov´an poˇca´teˇcn´ı zobrazovac´ı reˇzim pomoc´ı funkce glutInitDisplayMode(GLUT RGB | GLUT DOUBLE | GLUT DEPTH) , kde GLUT RGB znamen´a zobrazen´ı vˇsech tˇr´ı sloˇzek barvy, GLUT DOUBLE pouˇzit´ı okna s dvojit´ ym bufferem a GLUT DEPTH umoˇzn´ı pouˇzit´ı depth (hloubkov´eho) bufferu. Dalˇs´ımi funkcemi, kter´e jsou nastaveny jsou glutDisplayFunc(render), kde je jako zobrazovac´ı funkce nastavena funkce render, kter´a obsahuje vykreslen´ı grafiky a haptiky, a glutReshapeFunc(glutReshape), kde je jako obnovovac´ı funkce nastavena glutReshape. V t´eto metodˇe je nastavena ˇc´ast okna, do kter´e se bude kreslit, pomoc´ı glViewport(). D´ale je zde nastaven´ı maticov´eho reˇzimu projekce pomoc´ı glMatrixMode(GL PROJECTION), perspektivy pomoc´ı gluPerspective() a pohledu na sc´enu pomoc´ı funkce gluLookAt(). Inicializace OpenGL prob´ıh´a pˇredevˇs´ım v metodˇe initGL, kde je pro vykreslov´an´ı povolen hloubkov´ y buffer a nastavena funkce pro tento buffer, nastaven zp˚ usob v´ ypoˇctu perspektivy, urˇcena hodnota hloubky pouˇzit´a, kdyˇz je tento buffer vymaz´an a nastavena barva pozad´ı - viz n´asleduj´ıc´ı k´od. glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); glClearDepth( 1.0f ); glClearColor(0, 0, 0, 0);
Je zde um´ıstˇeno i nastaven´ı osvˇetlen´ı, kter´e je nejprve nutn´e povolit. Pot´e je jiˇz nastavena poloha svˇetla. glEnable(GL_LIGHTING);
3 Navrˇzen´e ˇreˇsen´ı
15
float lightPos[4] = {0, 0, 0.5, 0.0}; glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glEnable(GL_LIGHT0);
3.2.3
Nastaven´ı HLAPI
D´ale je v programu provedeno nastaven´ı HLAPI v metodˇe initHL, kde je inicializov´an popisovaˇc haptick´eho zaˇr´ızen´ı a n´aslednˇe pˇred´an haptick´emu renderov´emu kontextu - viz n´asleduj´ıc´ı k´od. ghHD = hdInitDevice(HD_DEFAULT_DEVICE); ghHLRC = hlCreateContext(ghHD); hlMakeCurrent(ghHLRC); 3.2.4
Namapov´ an´ı haptiky na grafick´ e prostˇ red´ı
Pro definov´an´ı jednotn´eho namapov´an´ı pracovn´ıho prostoru na pozorovac´ı souˇradnice grafick´e vizualizace tak, aby tento prostor zcela obklopoval rozsah projekce, tedy aby vˇse, co je viditeln´e, bylo tak´e hmatateln´e, je pouˇzita funkce hluFitWorkspace() s projekˇcn´ı matic´ı, kter´a definuje rozsah projekce - viz n´asleduj´ıc´ı k´od.
hlMatrixMode(HL_TOUCHWORKSPACE); hluFitWorkspace(projection);
3.2.5
Vykreslen´ı grafiky
Pro vykreslen´ı troj´ uheln´ıkov´e s´ıtˇe 3D model˚ u hlav jsem v programu pouˇzila pˇr´ıkazy knihovny OpenGL. V programu je implementov´ana struktura udrˇzuj´ıc´ı informace o souˇradnic´ıch vrcholu: struct VertexCoords{ GLfloat x; GLfloat y;
3 Navrˇzen´e ˇreˇsen´ı
16
GLfloat z; };
Vˇsechny souˇradnice vrchol˚ u jsou do pole tˇechto struktur s n´azvem vertexArray postupnˇe pro kaˇzd´ y vrchol naˇcteny ze struktury vertex nach´azej´ıc´ı se ve tˇr´ıdˇe PlyFile. Z t´eto struktury jsou z´aroveˇ n naˇcteny norm´aly vrchol˚ u do pole s n´azvem normals a barvy do pole s n´azvem colors. Indexy vrchol˚ u jednotliv´ ych troj´ uheln´ık˚ u jsou naˇcteny ze struktury int3 do pole s n´azvem indexes, kter´e je typu GLuint (OpenGL integer bez znam´enka). Vykreslen´ı troj´ uheln´ıkov´e s´ıtˇe je pak uskuteˇcnˇeno pomoc´ı OpenGL vertex array, normal array a color array, kdy jsou jednotliv´e pointery nastaveny na pole vrchol˚ u, norm´al a barev. Pot´e je pomoc´ı funkce glDrawElements() s pouˇzit´ım pole index˚ u vykreslena cel´a troj´ uheln´ıkov´a s´ıt’. K´od pro vykreslen´ı cel´e troj´ uheln´ıkov´e s´ıtˇe vypad´a takto: //Povoleni vertex, normal a color array. glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3, GL_FLOAT, 0, colors); glNormalPointer(GL_FLOAT, 0, normals); glVertexPointer(3, GL_FLOAT, 0, vertexArray);
glDrawElements(GL_TRIANGLES, triCount*3, GL_UNSIGNED_INT, indexes); // Deaktivace vertex, normal a color array po vykresleni. glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_COLOR_ARRAY);
3 Navrˇzen´e ˇreˇsen´ı
3.2.6
17
Haptick´ e renderov´ an´ı
Veˇsker´e haptick´e renderov´an´ı je obsaˇzeno v haptick´em r´amci mezi pˇr´ıkazy hlBeginFrame() a hlEndFrame(). Prvn´ı z tˇechto pˇr´ıkaz˚ u zjist´ı aktu´aln´ı stav haptick´eho renderov´an´ı. Jakmile je haptika vykreslena, pˇr´ıkaz konce r´amu synchronnˇe vyhodnot´ı dynamick´e zmˇeny pozice haptick´eho zaˇr´ızen´ı. Pro haptick´e vykreslen´ı ploch a objekt˚ u skl´adaj´ıc´ıch se z r˚ uzn´ ych geometrick´ ych primitiv je nutn´e pouˇz´ıt tzv. renderov´an´ı tvar˚ u. Geometrie jednotliv´ ych tvar˚ u je specifikov´ana pomoc´ı OpenGL pˇr´ıkaz˚ u a mus´ı b´ yt ohraniˇcena pˇr´ıkazy hlBeginShape() a hlEndShape(). HLAPI pak pouˇz´ıv´a tuto geometrii pro haptick´e renderov´an´ı. To se m˚ uˇze d´ıt dvˇema r˚ uzn´ ymi zp˚ usoby. Bud’ s pouˇzit´ım depth bufferu nebo feedback bufferu. Pokud HLAPI zachyt´ı geometrii pouˇzit´ım OpenGL depth bufferu, bude se moci uˇzivatel ve v´ ysledn´e aplikaci dot´ ykat pouze viditeln´ ych ploch objekt˚ u. Pokud v programu nastav´ıme pouˇzit´ı OpenGL feedback bufferu pro zachycen´ı geometrie, m˚ uˇze uˇzivatel ve v´ ysledn´em programu ohmat´avat napˇr´ıklad i tunel. Ve sv´em programu pouˇz´ıv´am feedback buffer, protoˇze umoˇzn ˇuje pouˇzit´ı OpenGL vertex array. OpenGL pˇr´ıkazy pro vykreslen´ı haptiky jsou t´emˇeˇr stejn´e jako pro vykreslen´ı grafiky, pouze bez pouˇzit´ı norm´al a barev vrchol˚ u. Pro nastaven´ı vlastnost´ı ohmat´avan´eho materi´alu jsem vyuˇzila fakt, ˇze vrcholy modelu jsou obarveny podle um´ıstˇen´ı vlas˚ u a vous˚ u. V oblasti 3D modelu hlavy, kde nejsou vlasy ani vousy, maj´ı vrcholy ˇsedou barvu. Vrcholy v oblasti vlas˚ u jsou obarveny ˇcervenou barvou a v oblasti vous˚ u zelenou barvou. Aby bylo moˇzn´e pro kaˇzdou z tˇechto tˇr´ı oblast´ı nastavit jin´e vlastnosti materi´alu, bylo tˇreba rozdˇelit troj´ uheln´ıky podle barevn´eho rozliˇsen´ı. To jsem zajistila rozdˇelen´ım pole indexes na tˇri dalˇs´ı pole. V cyklu, kter´ y postupnˇe proch´az´ı indexy vrchol˚ u pro kaˇzd´ y troj´ uheln´ık, je zjiˇstˇeno, jakou barvu dan´ y troj´ uheln´ık m´a. Troj´ uheln´ık se m˚ uˇze skl´adat z vrchol˚ u maxim´alnˇe dvou r˚ uzn´ ych barev, jelikoˇz oblasti vlas˚ u a vous˚ u spolu nesoused´ı. Pro kaˇzd´ y troj´ uheln´ık je spoˇctena pˇrevl´adaj´ıc´ı barva jeho vrchol˚ u a tento troj´ uheln´ık, pˇresnˇeji indexy jeho vrchol˚ u, je n´aslednˇe zaˇrazen do jednoho z kontejner˚ u typu vector s n´azvy vecIndexesS (ˇsediv´e troj´ uheln´ıky), vecIndexesR (ˇcerven´e troj´ uheln´ıky), vecIndexesG (zelen´e troj´ uheln´ıky).
3 Navrˇzen´e ˇreˇsen´ı
18
Typ vector je zde zvolen kv˚ uli moˇznosti dynamick´e zmˇeny jeho velikosti, jelikoˇz nen´ı zn´amo, kolik troj´ uheln´ık˚ u kter´e barvy je, jinak by bylo tˇreba cel´ y cyklus zopakovat. Z tˇechto ”vector˚ u” jsou pak indexy vrchol˚ u troj´ uheln´ık˚ u pouze pˇrekop´ırov´any do pol´ı s n´azvy indexesS, indexesR a indexesG, aby bylo moˇzn´e je pouˇz´ıt pro vytvoˇren´ı troj´ uheln´ıkov´e s´ıtˇe pomoc´ı OpenGL pˇr´ıkazu glDrawElements. Kaˇzd´a oblast modelu hlavy mus´ı b´ yt zvl´aˇst’ uzavˇrena mezi pˇr´ıkazy pro definov´an´ı tvaru (hlBeginShape() a hlEndShape()), aby bylo moˇzn´e kaˇzd´e oblasti nastavit jin´ y materi´al. Proto jsou nav´ıc vygenerov´ana jedineˇcn´a id s n´azvy ShapeIdS, ShapeIdR a ShapeIdG, kter´e je nutn´e pouˇz´ıt v pˇr´ıkazu hlBeginShape(). V haptick´em r´amci jsou tedy pro kaˇzd´ y tvar nastaveny jin´e vlastnosti tak, aby co nejv´ıce pˇripom´ınaly k˚ uˇzi, vlasy ˇci vousy. Vlastnosti pro ˇsediv´e troj´ uheln´ıky, tedy k˚ uˇzi, jsou nastaveny takto: hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK,
HL_STIFFNESS, 0.5f); //tuhost HL_DAMPING, 0.9f); //tlumeni HL_STATIC_FRICTION, 0.17f); //treni HL_DYNAMIC_FRICTION, 0.95f);
Materi´alov´e parametry ˇcerven´ ych troj´ uheln´ık˚ u, tedy vlas˚ u, jsem nastavila n´asleduj´ıc´ım zp˚ usobem. hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK,
HL_STIFFNESS, 0.5f); //tuhost HL_DAMPING, 0.9f); //tlumeni HL_STATIC_FRICTION, 0.7f); //treni HL_DYNAMIC_FRICTION, 0.5f);
Materi´alov´e vlastnosti zelen´ ych troj´ uheln´ık˚ u, kter´e zn´azorˇ nuj´ı um´ıstˇen´ı vous˚ u, jsou nastaveny takto: hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK, hlMaterialf(HL_FRONT_AND_BACK,
HL_STIFFNESS, 0.5f); //tuhost HL_DAMPING, 0.9f); //tlumeni HL_STATIC_FRICTION, 0.94f); //treni HL_DYNAMIC_FRICTION, 0.1f);
3 Navrˇzen´e ˇreˇsen´ı
3.2.7
19
Vykreslen´ı 3D kurzoru
Po vykreslen´ı haptiky a grafiky je vykreslen 3D kurzor reprezentuj´ıc´ı polohu haptick´eho pera. Kurzor je vykreslen na pozici proxy bodu, jehoˇz polohu z´ısk´ame pomoc´ı n´asleduj´ıc´ıch pˇr´ıkaz˚ u: HLdouble proxyxform[16]; hlGetDoublev(HL_PROXY_TRANSFORM, proxyxform);
3.3
Zhodnocen´ı dosaˇ zen´ ych v´ ysledk˚ u implementace s vyuˇ zit´ım knihovny HLAPI
V´ ysledn´a aplikace umoˇzn ˇuje uˇzivateli ohmat´avat 3D model hlavy, a to bez proniknut´ı dovnitˇr modelu s v´ yjimkou u ´st, kde doch´az´ı k proniknut´ı kurzorem zn´azorˇ nuj´ıc´ım polohu haptick´eho pera dovnitˇr modelu. Vzhledem k moˇznosti nastaven´ı pouze ˇctyˇr vlastnost´ı materi´alu nen´ı v´ ysledn´ y dojem bl´ızk´ y realitˇe, coˇz bylo z´aroveˇ n otestov´ano uˇzivateli, viz kapitola 4. Vlastnosti, kter´e je moˇzno nastavit, jsou pouze tuhost, tlumen´ı a statick´e a dynamick´e tˇren´ı. Pomoc´ı tˇechto parametr˚ u lze nastavit pouze odpor ˇci pˇrilnavost modelu. Nelze tak napodobit vystupuj´ıc´ı materi´al, jako jsou napˇr´ıklad vousy. Z tohoto d˚ uvodu jsem aplikaci pro ohmat´av´an´ı 3D model˚ u hlav implementovala i s pouˇzit´ım niˇzˇs´ı knihovny HDAPI.
3 Navrˇzen´e ˇreˇsen´ı
3.4
20
Popis ˇ reˇ sen´ı pomoc´ı knihovny HDAPI
Na rozd´ıl od vyˇsˇs´ı knihovny HLAPI mus´ı b´ yt v programu vytvoˇren´em s pouˇzit´ım HDAPI implementov´an vlastn´ı v´ ypoˇcet detekce koliz´ı haptick´eho pera s modelem a v´ ypoˇcet s´ıly. Grafick´a vizualizace modelu hlavy je ˇreˇsena stejnˇe jako u aplikace, kter´a vyuˇz´ıv´a HLAPI, a to pomoc´ı OpenGL - viz kapitola 3.2.5. Naˇcten´ı 3D model˚ u hlav je implementov´ano tak´e stejn´ ym zp˚ usobem jako v programu vyuˇz´ıvaj´ıc´ım HLAPI s pouˇzit´ım tˇr´ıdy obsaˇzen´e v PlyFile.cpp a PlyfFile.h - viz kapitola 3.2.1. 3.4.1
Vykreslen´ı 3D kurzoru
3D kurzor je vykreslen na pozici haptick´eho pera v prostˇred´ı, ve kter´em se nach´az´ı virtu´aln´ı objekt. Pro vykreslen´ı 3D kurzoru je zapotˇreb´ı pouze naˇc´ıst transformaˇcn´ı matici haptick´eho pera, kter´a shromaˇzd’uje informace o poloze a natoˇcen´ı haptick´eho zaˇr´ızen´ı v jeho vlastn´ıch souˇradnic´ıch. Proto mus´ı b´ yt OpenGL matice pˇren´asobena matic´ı, kter´a transformuje OpenGL souˇradnice do souˇradnic zaˇr´ızen´ı, na nˇeˇz je pak aplikov´ana zmiˇ novan´a transformaˇcn´ı matice haptick´eho zaˇr´ızen´ı. Jakmile je zn´amo, kde m´a b´ yt kurzor vykreslen, je urˇceno mˇeˇr´ıtko kurzoru pomoc´ı pˇrevodn´ı matice mezi OpenGL souˇradnicemi a souˇradnicemi haptick´eho zaˇr´ızen´ı. 3.4.2
Haptick´ a smyˇ cka
Jak jiˇz bylo zm´ınˇeno, v programu je tˇreba implementovat vlastn´ı detekci koliz´ı haptick´eho pera s virtu´aln´ım objektem a vlastn´ı v´ ypoˇcet s´ıly. To je zajiˇstˇeno v haptick´e smyˇcce, kter´a je pl´anovaˇcem spouˇstˇena s vysokou frekvenc´ı, tedy velmi ˇcasto tak, aby byla spoˇc´ıt´ana zpˇetn´a s´ıla i pˇri sebemenˇs´ı zmˇenˇe polohy haptick´eho pera. Pokud by tomu tak nebylo, rozd´ıl mezi silami by byl moc velk´ y a dojem z ohmat´av´an´ı virtu´aln´ıho objektu by nebyl dostateˇcnˇe hladk´ y. Detekce koliz´ı haptick´eho zaˇr´ızen´ı s troj´ uheln´ıkovou s´ıt´ı byla v t´eto pr´aci ˇreˇsena ˇ ast programu souvisej´ıc´ı s nastaven´ım HDAPI a hapdvˇema r˚ uzn´ ymi zp˚ usoby. C´ tickou smyˇckou je vˇsak shodn´a u obou ˇreˇsen´ı a bude proto pops´ana pouze jednou.
3 Navrˇzen´e ˇreˇsen´ı
21
Poˇ c´ ateˇ cn´ı ˇ reˇ sen´ı detekce koliz´ı Poˇc´ateˇcn´ı pˇr´ıstup k ˇreˇsen´ı detekce koliz´ı spoˇc´ıval v poˇc´ıt´an´ı pr˚ useˇc´ık˚ u paprsku, kter´ y je vytvoˇren na z´akladˇe znalosti pozice haptick´eho pera a jeho smˇerov´eho vektoru, se vˇsemi troj´ uheln´ıky tvoˇr´ıc´ımi model hlavy. Pozici haptick´eho pera i jeho natoˇcen´ı v prostoru je moˇzn´e z´ıskat z jeho transformaˇcn´ı matice. Tu bylo vˇsak potˇreba pˇrev´est do stejn´eho souˇradnicov´eho syst´emu, ve kter´em je um´ıstˇen virtu´aln´ı model hlavy. Pokud byly nalezeny nˇejak´e pr˚ useˇc´ıky paprsku s troj´ uheln´ıky, bylo zjiˇstˇeno, jak daleko se nach´az´ı od pozice haptick´eho pera. Nach´azel-li se pr˚ useˇc´ık dostateˇcnˇe bl´ızko, byla pro nˇej spoˇc´ıt´ana v´ ysledn´a s´ıla, kter´a mˇela smˇer norm´aly troj´ uheln´ıku. Velikost t´eto s´ıly byla urˇcena v z´avislosti na vzd´alenosti ˇ ım bl´ıˇze se pero nach´azelo, t´ım vˇetˇs´ı byla silov´a zpˇetn´a pera od pr˚ useˇc´ıku. C´ vazba. Postupn´e zvˇetˇsov´an´ı s´ıly pˇri pˇribliˇzov´an´ı haptick´eho pera k povrchu modelu je nutn´e, aby haptick´e pero nevyvinulo najednou velikou s´ılu a neuskoˇcilo proti uˇzivateli. Tento zp˚ usob detekce koliz´ı vˇsak neumoˇzn ˇuje dot´ yk´an´ı se modelu stranou haptick´eho pera, jelikoˇz pero a t´ım p´adem i paprsek jsou natoˇceny mimo model hlavy a nejsou nalezeny ˇz´adn´e pr˚ useˇc´ıky. Teprve jakmile se haptick´ ym perem pronikne skrze model, je nalezen pr˚ useˇc´ık, v´ ysledn´a s´ıla je spoˇc´ıt´ana jako maxim´aln´ı a pero uskoˇc´ı. Z´aroveˇ n kv˚ uli vysok´e frekvenci spouˇstˇen´ı v´ ypoˇctu haptick´e smyˇcky a vysok´emu poˇctu troj´ uheln´ık˚ u, pro kter´e je poˇc´ıt´an pr˚ useˇc´ık s paprskem haptick´eho pera, je haptick´e renderov´an´ı velmi pomal´e a nest´ıhaj´ı se tak poˇc´ıtat pr˚ useˇc´ıky dost ˇcasto. Proto bylo toto ˇreˇsen´ı optimalizov´ano tak, aby se poˇc´ıtaly pr˚ useˇc´ıky paprsku pouze s troj´ uheln´ıky, jejichˇz prvn´ı vrchol (uloˇzen v poli indexes jako prvn´ı) se od pera nach´azel do nˇejak´e maxim´aln´ı vzd´alenosti. Vylepˇ sen´ eˇ reˇ sen´ı detekce koliz´ı Kv˚ uli jiˇz zm´ınˇen´ ym probl´em˚ um s prvn´ım ˇreˇsen´ım jsem se rozhodla pro implementaci odliˇsn´eho zp˚ usobu detekce koliz´ı. Ten je zaloˇzen na poˇc´ıt´an´ı vzd´alenost´ı tˇeˇziˇst’ jednotliv´ ych troj´ uheln´ık˚ u cel´eho modelu od pozice haptick´eho pera, kter´a mus´ı b´ yt opˇet pˇrevedena do stejn´eho souˇradnicov´eho syst´emu, jako je virtu´aln´ı model. Pokud je nˇekter´a z tˇechto vzd´alenost´ı dostateˇcnˇe mal´a a haptick´e pero se tedy nach´az´ı v bl´ızkosti dan´eho troj´ uheln´ıku, je spoˇc´ıt´ana kolm´a vzd´alenost od
3 Navrˇzen´e ˇreˇsen´ı
22
roviny, v n´ıˇz troj´ uheln´ık leˇz´ı. Tato vzd´alenost je pot´e opˇet pouˇzita pro v´ ypoˇcet silov´e zpˇetn´e vazby. Smˇer s´ıly je urˇcen norm´alou, kter´a je spoˇc´ıt´ana pomoc´ı barycentrick´ ych souˇradnic, pro jejichˇz v´ ypoˇcet je nutn´e spoˇc´ıtat kolm´ y pr˚ umˇet polohy haptick´eho pera do roviny troj´ uheln´ıku (tedy vlastnˇe pr˚ useˇc´ık t´eto roviny s pˇr´ımkou urˇcenou pozic´ı pera a norm´alou troj´ uheln´ıku.) Barycentrick´e souˇradnice urˇcuj´ı v´ahu norm´al jednotliv´ ych vrchol˚ u, kter´e jiˇz zn´ame a z nichˇz je poˇc´ıt´ana v´ ysledn´a norm´ala. Pokud se pr˚ useˇc´ık nach´az´ı mimo troj´ uheln´ık, je smˇer s´ıly urˇcen norm´alou nejbliˇzˇs´ıho vrcholu troj´ uheln´ıku.
3.5
Struktura programu pouˇ z´ıvaj´ıc´ıho knihovnu HDAPI
Tato aplikace je, stejnˇe jako program vytvoˇren´ y ve vyˇsˇs´ı knihovnˇe HLAPI, implementov´ana v jazyce C++. Souˇc´ast´ı programu pro haptick´e renderov´an´ı je jiˇz dˇr´ıve zm´ınˇen´a tˇr´ıda pro naˇcten´ı PLY souboru a tak´e tˇr´ıda pro z´akladn´ı operace s vektory. Haptick´a ˇc´ast programu a grafick´a vizualizace jsou opˇet obsaˇzeny v souboru Touch.cpp. K´od v tomto souboru lze rozdˇelit do nˇekolika d´ılˇc´ıch ˇca´st´ı. Jak jiˇz bylo ˇreˇceno, nastaven´ı OpenGL a vykreslen´ı grafiky jsou stejn´e jako u aplikace pouˇz´ıvaj´ıc´ı vyˇsˇs´ı knihovnu HLAPI. Dalˇs´ımi d˚ uleˇzit´ ymi ˇca´stmi programu jsou nastaven´ı HDAPI, namapov´an´ı pracovn´ıho prostˇred´ı haptick´eho zaˇr´ızen´ı na grafick´e prostˇred´ı, vykreslen´ı 3D kurzoru a implementace haptick´e smyˇcky a pl´anovaˇce t´eto smyˇcky. 3.5.1
Tˇ r´ıda pro operace s vektory
Tato tˇr´ıda mi byla poskytnuta Ing. Purchartem a je rozdˇelena do soubor˚ u Vector3.cpp a Vector3.h. Definuje datov´ y typ Vector3, kter´ y se skl´ad´a ze tˇr´ı souˇradnic vektoru a pro nˇejˇz jsou implementov´any r˚ uzn´e operace, vˇcetnˇe sˇc´ıt´an´ı vektor˚ u, n´asoben´ı vektoru konstantou, skal´arn´ıho souˇcinu vektor˚ u, vektorov´eho souˇcinu ˇci normalizace vektoru. 3.5.2
Nastaven´ı HDAPI
Abychom mohli pouˇz´ıt moˇznosti knihovny HDAPI, je tˇreba ji nejprve inicializovat. To je provedeno v metodˇe initHD, kde je inicializov´ano haptick´e zaˇr´ızen´ı,
3 Navrˇzen´e ˇreˇsen´ı
23
povolena silov´a zpˇetn´a vazba zaˇr´ızen´ı a je zde tak´e spuˇstˇen pl´anovaˇc haptick´e smyˇcky: HHD ghHD = hdInitDevice(HD_DEFAULT_DEVICE); hdEnable(HD_FORCE_OUTPUT); hdStartScheduler(); 3.5.3
Namapov´ an´ı haptiky na grafick´ e prostˇ red´ı
Pro spr´avn´e namapov´an´ı pracovn´ıho prostoru haptick´eho zaˇr´ızen´ı na pozorovac´ı souˇradnice grafick´e vizualizace tak, aby zcela obklopoval rozsah projekce, je pouˇzita funkce hduMapWorkspaceModel(), kter´a vypoˇcte transformaˇcn´ı matici pro pˇrevod mezi souˇradn´ ymi syst´emy grafick´e vizualizace a haptick´eho pera. Parametry t´eto metody jsou projekˇcn´ı matice, modelview matice a matice, do n´ıˇz chceme uloˇzit v´ ysledek: hduMapWorkspaceModel(modelview, projection, workspacemodel); Je zde nastaveno i mˇeˇr´ıtko 3D kurzoru, pro jehoˇz v´ ypoˇcet je nutn´e pouˇz´ıt viewport matici a transformaˇcn´ı matici spoˇc´ıtanou v pˇredchoz´ım kroku. Zajiˇst’uje to metoda hduScreenToWorkspaceScale(), jej´ıˇz parametry jsou uspoˇra´d´any podle n´asleduj´ıc´ıho k´odu. screenTworkspace = hduScreenToWorkspaceScale( modelview, projection, viewport, workspacemodel); 3.5.4
Vykreslen´ı 3D kurzoru
3D kurzor je vykreslen na pozici haptick´eho pera v prostˇred´ı, ve kter´em se nach´az´ı virtu´aln´ı objekt. Toho doc´ıl´ıme tak, ˇze vyn´asob´ıme aktu´aln´ı OpenGL matici transformaˇcn´ı matic´ı workspacemodel a t´ım pˇrevedeme grafick´ y souˇradnicov´ y syst´em na syst´em haptick´eho pera. Pot´e staˇc´ı jiˇz jen vyn´asobit matic´ı haptick´eho zaˇr´ızen´ı state.transform. V´ yslednou polohu, na n´ıˇz je kurzor vykreslen, nastav´ıme tedy pomoc´ı n´asleduj´ıc´ıch pˇr´ıkaz˚ u: glMultMatrixd(workspacemodel); glMultMatrixd(state.transform);
3 Navrˇzen´e ˇreˇsen´ı
3.5.5
24
Implementace haptick´ e smyˇ cky a pl´ anovaˇ ce
Haptick´a smyˇcka je vol´ana v pl´anovac´ım vl´aknˇe, kter´e zas´ıl´a haptick´emu zaˇr´ızen´ı aktualizace s´ıly s frekvenc´ı pˇribliˇznˇe 1000 Hz. Proto m´a toto vl´akno velmi vysokou prioritu. Pokud je v aplikaci nutn´e zjistit stav haptick´eho zaˇr´ızen´ı, jako jeho polohu, natoˇcen´ı ˇci nastavenou s´ılu, je tˇreba tento dotaz prov´est uvnitˇr tohoto pl´anovac´ıho vl´akna, jelikoˇz stav zaˇr´ızen´ı se mˇen´ı velmi ˇcasto. Ve sv´em programu zjiˇst’uji tento stav zaˇr´ızen´ı pomoc´ı typick´e ”callback” metody, jeˇz je pl´anovaˇcem vol´ana. K´od struktury udrˇzuj´ıc´ı informaci o stavu zaˇr´ızen´ı je n´asleduj´ıc´ı: struct DeviceState { hduVector3Dd position; HDdouble transform[16]; hduVector3Dd force; }; Struktura obsahuje informaci o pozici, transformaˇcn´ı matici a aktu´aln´ı nastavenou s´ılu haptick´eho zaˇr´ızen´ı. Metoda pro zjiˇstˇen´ı tohoto stavu v pl´anovac´ım vl´aknˇe vypad´a takto: HDCallbackCode HDCALLBACK DeviceStateCallback(void *pUserData) { DeviceState *pState = static_cast(pUserData); hdGetDoublev(HD_CURRENT_POSITION, pState->position); hdGetDoublev(HD_CURRENT_FORCE, pState->force); hdGetDoublev(HD_CURRENT_TRANSFORM, pState->transform); return HD_CALLBACK_DONE; } N´avratov´a hodnota metody je HD CALLBACK DONE, coˇz znamen´a, ˇze metoda probˇehne pouze jednou a jiˇz nen´ı pl´anovaˇcem pˇrepl´anov´ana. Tato metoda je vol´ana
3 Navrˇzen´e ˇreˇsen´ı
25
u jiˇz zmiˇ novan´eho vykreslov´an´ı 3D kurzoru, kde je potˇreba pr´avˇe transformaˇcn´ı matice zaˇr´ızen´ı: DeviceState state; hdScheduleSynchronous(DeviceStateCallback, &state, HD_DEFAULT_SCHEDULER_PRIORITY);
Metoda hdScheduleSynchronous zajiˇst’uje vol´an´ı metody pro zjiˇstˇen´ı stavu pl´anovaˇcem synchronnˇe, coˇz znamen´a ˇze aplikaˇcn´ı vl´akno ˇcek´a, dokud vol´an´ı t´eto metody nen´ı dokonˇceno. Naproti tomu asynchronn´ı vol´an´ı se vrac´ı okamˇzitˇe, jakmile je napl´anov´ano. K asynchronn´ımu vol´an´ı doch´az´ı u haptick´e smyˇcky: gSchedulerCallback = hdScheduleAsynchronous( ForceCallback, 0, HD_DEFAULT_SCHEDULER_PRIORITY);
Hlaviˇcka metody haptick´e smyˇcky vypad´a n´asledovnˇe: HDCallbackCode HDCALLBACK ForceCallback(void *data)
V metodˇe je nejprve nastaven popisovaˇc haptick´eho zaˇr´ızen´ı pomoc´ı pˇr´ıkazu: HHD hHD = hdGetCurrentDevice();
Pot´e je spoˇc´ıt´ana a nastavena v´ ysledn´a s´ıla zaˇr´ızen´ı a nakonec je vr´acena hodnota HD CALLBACK CONTINUE, kter´a zajiˇst’uje, ˇze je smyˇcka pˇrepl´anov´ana a pobˇeˇz´ı znovu bˇehem dalˇs´ıho tiku pl´anovaˇce. Samotn´ y v´ ypoˇcet a nastaven´ı s´ıly zpˇetn´e vazby haptick´eho zaˇr´ızen´ı je uzavˇren do haptick´eho r´amce mezi pˇr´ıkazy hdBeginFrame(hHD) a hdEndFrame(hHD). V tomto r´amci je zajiˇstˇen nemˇenn´ y stav haptick´eho zaˇr´ızen´ı, aby s n´ım mohlo b´ yt pracov´ano a n´aslednˇe nastavena nov´a s´ıla. Obsah haptick´eho r´amce je tedy odliˇsn´ y pro r˚ uzn´e zp˚ usoby detekce koliz´ı a v´ ypoˇctu v´ ysledn´e s´ıly.
3 Navrˇzen´e ˇreˇsen´ı
3.5.6
26
Poˇ c´ ateˇ cn´ı postup
Jak jiˇz bylo pˇredesl´ano v kapitole 3.4.2, tento pˇr´ıstup spoˇc´ıv´a v poˇc´ıt´an´ı pr˚ useˇc´ık˚ u paprsku haptick´eho pera se vˇsemi troj´ uheln´ıky modelu hlavy. Smˇ er a pozice pera Pro urˇcen´ı paprsku haptick´eho pera je tˇreba zn´at jeho polohu a smˇer, a to ve stejn´ ych souˇradnic´ıch jako je model hlavy. Tyto u ´daje o haptick´em zaˇr´ızen´ı je moˇzn´e z´ıskat z jeho matice, vypov´ıdaj´ıc´ı o aktu´aln´ım stavu. Abychom tuto matici pˇrevedli do stejn´eho souˇradnicov´eho syst´emu jako jsou souˇradnice modelu, je tˇreba transformaˇcn´ı matici workspacemodel, kter´a zajiˇst’uje pˇrevod mezi souˇradn´ ymi syst´emy, vyn´asobit matic´ı haptick´eho zaˇr´ızen´ı. Z v´ ysledn´e matice jiˇz dostaneme polohu i smˇerov´ y vektor haptick´eho pera podle n´asleduj´ıc´ıho k´odu. GLdouble *result = multMatrices(workspacemodel,transform); //poloha pera position = Vector3(result[12], result[13], result[14]); //smerovy vektor pera direction = Vector3(result[8], result[9], result[10]) * (-1);
V´ ypoˇ cet pr˚ useˇ c´ıku paprsku s troj´ uheln´ıkem Pro kaˇzd´ y troj´ uheln´ık je nalezen pr˚ useˇc´ık s paprskem haptick´eho pera, pokud nˇejak´ y existuje. Tento v´ ypoˇcet prob´ıh´a v metodˇe getIntersect(), jej´ımiˇz parametry jsou vrcholy dan´eho troj´ uheln´ıku a smˇer a pozice pera. Zp˚ usob v´ ypoˇctu pr˚ useˇc´ıku je pˇrevzat´ y z [7]. Nejdˇr´ıve je potˇreba zjistit, zda paprsek prot´ın´a rovinu, v n´ıˇz leˇz´ı dan´ y troj´ uheln´ık. Pokud ne, neprot´ın´a paprsek ani troj´ uheln´ık. Je-li vˇsak nalezen pr˚ useˇc´ık, staˇc´ı jen zjistit, zda leˇz´ı uvnitˇr troj´ uheln´ıku. Nejprve je vypoˇctena norm´ala troj´ uheln´ıku jako vektorov´ y souˇcin vektor˚ u hran troj´ uheln´ıku:
3 Navrˇzen´e ˇreˇsen´ı
27
Vector3 u = V1 - V0; Vector3 v = V2 - V0; Vector3 n = Vector3::cross(u, v);
Pot´e je pomoc´ı skal´arn´ıho souˇcinu norm´aly se smˇerov´ ym vektorem haptick´eho pera urˇceno, zda paprsek prot´ın´a rovinu. b = Vector3::dot(n,direction); if (fabs(b) < SMALL_NUM) {...}
Pokud je v´ ysledn´a hodnota nulov´a (menˇs´ı neˇz velmi mal´e ˇc´ıslo - vyhnut´ı se pˇreteˇcen´ı pˇri dˇelen´ı), znamen´a to, ˇze je smˇerov´ y vektor kolm´ y k norm´ale troj´ uheln´ıku, tedy rovnobˇeˇzn´ y s rovinou troj´ uheln´ıku. Jakmile je zjiˇstˇeno, ˇze paprsek prot´ın´a rovinu, vypoˇcte se pr˚ useˇc´ık n´asledovnˇe: w0 = position - V0; a = - Vector3::dot(n,w0); r = a / b; Vector3 I = position + (direction * r);
D´ale jiˇz zb´ yv´a pouze zjistit, zda vypoˇcten´ y pr˚ useˇc´ık leˇz´ı uvnitˇr troj´ uheln´ıku. Definujeme si vektor w jako (I − V 0) a spoˇcteme barycentrick´e souˇradnice s a t, pˇriˇcemˇz w = su + tv. Odvozen´ı polohy pr˚ useˇc´ıku I pomoc´ı barycentrick´ ych souˇradnic s a t je zn´azornˇeno na Obr.3.3, kde V0 , V1 a V2 jsou vrcholy dan´eho troj´ uheln´ıku, n norm´ala troj´ uheln´ıku, u a v vektory hran troj´ uheln´ıku a bod P je poloha haptick´eho pera.
3 Navrˇzen´e ˇreˇsen´ı
28
Obr´azek 3.3: Zn´azornˇen´ı v´ ypoˇctu pr˚ useˇc´ıku
Barycentrick´e souˇradnice vypoˇcteme podle vzorc˚ u
(u.v)(w.v) − (v.v)(w.u) (u.v)2 − (u.u)(v.v) (u.v)(w.u) − (u.u)(w.v) t= (u.v)2 − (u.u)(v.v)
s=
(3.1)
Pokud s ≥ 0, t ≥ 0 a z´aroveˇ n s + t ≤ 1, pr˚ useˇc´ık leˇz´ı uvnitˇr troj´ uheln´ıku. V programu je v´ ypoˇcet barycentrick´ ych souˇradnic implementov´an n´asledovnˇe. float uu, uv, vv, wu, wv, D; uu = Vector3::dot(u,u); uv = Vector3::dot(u,v); vv = Vector3::dot(v,v); w = I - V0; wu = Vector3::dot(w,u); wv = Vector3::dot(w,v); D = uv * uv - uu * vv; float s, t; s = (uv * wv - vv * wu) / D;
3 Navrˇzen´e ˇreˇsen´ı
29
if (s < 0.0 || s > 1.0) return 0; }
{
t = (uv * wu - uu * wv) / D; if (t < 0.0 || (s + t) > 1.0) return 0; }
// I je vne T
{ // I je vne T
Pokud je zjiˇstˇeno, ˇze existuje pr˚ useˇc´ık paprsku s troj´ uheln´ıkem, je uloˇzen do kontejneru typu vector s n´azvem intersections. V´ ypoˇ cet parametru t Po dokonˇcen´ı cyklu pro v´ ypoˇcet pr˚ useˇc´ık˚ u se vˇsemi troj´ uheln´ıky modelu je pro vˇsechny nalezen´e pr˚ useˇc´ıky, pokud nˇejak´e existuj´ı, vypoˇcten parametr t podle parametrick´e rovnice pˇr´ımky:
− X = A + t.→ u ,
(3.2)
− kde X je nalezen´ y pr˚ useˇc´ık, A pozice pera a → u smˇerov´ y vektor pera. Rovnici staˇc´ı spoˇc´ıtat pouze pro x-ovou souˇradnici, parametr t mus´ı b´ yt pro vˇsechny souˇradnice stejn´ y. Z vypoˇc´ıtan´ ych parametr˚ u pr˚ useˇc´ık˚ u je vybr´an nejmenˇs´ı a otestov´an, zda je menˇs´ı neˇz definovan´a konstanta EPS T, kter´a je rovna 0.02 a kter´a oznaˇcuje nejvˇetˇs´ı moˇznou vzd´alenost pera od povrchu modelu, pro kterou se provede v´ ypoˇcet silov´e zpˇetn´e vazby. Pokud parametr t splˇ nuje podm´ınku, je pouˇzit pro v´ ypoˇcet s´ıly. V´ ypoˇ cet s´ıly Jej´ı smˇer je urˇcen norm´alou troj´ uheln´ıku, kter´a mus´ı b´ yt normalizov´ana. V´ yslednou s´ılu vypoˇcteme podle vzorce: → − − F =→ n .(EP S T − |t|)2 .
1 , (EP S T )2
(3.3)
− kde → n je norm´ala dan´eho troj´ uheln´ıku a EP S T je jiˇz dˇr´ıve definovan´a konstanta,
3 Navrˇzen´e ˇreˇsen´ı
30
kter´a je maxim´aln´ı hodnotou parametru |t|, pro kter´ y se prov´ad´ı v´ ypoˇcet s´ıly. T´ım je zajiˇstˇeno postupn´e zvyˇsov´an´ı s´ıly pˇri pˇribliˇzov´an´ı haptick´eho pera k modelu a to se zvyˇsuj´ıc´ı se rychlost´ı. Optimalizace v´ ypoˇ ctu s´ıly V´ ysledkem dosavadn´ıho postupu bylo velmi pomal´e poˇc´ıt´an´ı pr˚ useˇc´ık˚ u a tedy i v´ ysledn´e s´ıly. To jsem vylepˇsila tˇremi r˚ uzn´ ymi zp˚ usoby. Prvn´ı vylepˇsen´ı spoˇc´ıv´a v tom, ˇze pokud byl v pˇredeˇsl´em poˇc´ıt´an´ı pr˚ useˇc´ık˚ u nalezen nˇejak´ y dostateˇcnˇe bl´ızk´ y pr˚ useˇc´ık, je uloˇzen do pamˇeti troj´ uheln´ık, ve kter´em se pr˚ useˇc´ık nach´az´ı, a norm´ala, kter´a byla pro tento troj´ uheln´ık spoˇc´ıt´ana. Pˇri dalˇs´ım hled´an´ı pr˚ useˇc´ık˚ u se nejprve zjist´ı, zda se paprsek pera prot´ın´a se st´ale stejn´ ym troj´ uheln´ıkem, a tak´e, zda je parametr t, vypoˇcten´ y pomoc´ı nov´eho useˇc´ıky paprsku pr˚ useˇc´ıku, menˇs´ı neˇz EPS T. Pokud ano, nen´ı jiˇz tˇreba poˇc´ıtat pr˚ s ostatn´ımi troj´ uheln´ıky a s´ılu lze vypoˇc´ıst pouze na z´akladˇe znalosti pˇredeˇsl´e norm´aly a nov´eho parametru t. Dalˇs´ı optimalizac´ı je u ´pln´e vynech´an´ı v´ ypoˇctu s´ıly na 70 iterac´ı haptick´e smyˇcky, kdy z˚ ustane zachov´ana pˇredeˇsl´a s´ıla. Tak´e pokud bˇehem v´ ypoˇctu pr˚ useˇc´ık˚ u nen´ı ˇza´dn´ y nalezen, je k poˇctu iterac´ı, kter´e se maj´ı vynechat, pˇriˇcteno 200 iterac´ı. Posledn´ı optimalizace spoˇc´ıv´a v tom, ˇze je pˇred v´ ypoˇctem pr˚ useˇc´ıku pro kaˇzd´ y troj´ uheln´ık zkontrolov´ano, zda jeho prvn´ı vrchol v poˇrad´ı spad´a do sf´ery o polomˇeru 0.05 se stˇredem na pozici haptick´eho pera. To znamen´a, ˇze je pro kaˇzd´ y z tˇechto vrchol˚ u zjiˇstˇena jejich vzd´alenost od pozice haptick´eho pera, a pokud je menˇs´ı neˇz dan´ y polomˇer, je pro n´aleˇzej´ıc´ı troj´ uheln´ık proveden v´ ypoˇcet pr˚ useˇc´ıku s paprskem pera.
3 Navrˇzen´e ˇreˇsen´ı
3.5.7
31
Vylepˇ sen´ eˇ reˇ sen´ı
Druh´ y zp˚ usob ˇreˇsen´ı detekce koliz´ı spoˇc´ıv´a ve v´ ypoˇctu vzd´alenost´ı tˇeˇziˇst’ vˇsech troj´ uheln´ık˚ u od polohy haptick´eho pera. V´ ypoˇ cet tˇ eˇ ziˇ st’ troj´ uheln´ık˚ u Tˇeˇziˇstˇe vˇsech troj´ uheln´ık˚ u jsou spoˇc´ıt´ana pouze jednou na zaˇca´tku aplikace pˇri naˇc´ıt´an´ı modelu, a to podle vzorce:
T =
V0+V1+V2 , 3
(3.4)
kde V 0, V 1 a V 2 jsou vrcholy dan´eho troj´ uheln´ıku. Vzd´ alenost bod˚ u Pot´e je pro kaˇzd´ y troj´ uheln´ık spoˇc´ıt´ana vzd´alenost jeho tˇeˇziˇstˇe od pozice haptick´eho pera podle vzorce pro Eukleidovskou vzd´alenost:
q D = (Tx − Px )2 + (Ty − Py )2 + (Tz − Pz )2 ,
(3.5)
kde T je tˇeˇziˇstˇe troj´ uheln´ıku a P poloha pera. Ze zjiˇstˇen´ ych vzd´alenost´ı je vybr´ana ta nejmenˇs´ı. Pokud je tato hodnota menˇs´ı neˇz konstanta EPS T, kter´a je zde rovna 0.025, je pro dan´ y troj´ uheln´ık vypoˇctena v´ ysledn´a s´ıla. V´ ypoˇ cet parametru t K v´ ypoˇctu s´ıly je opˇet potˇreba vypoˇc´ıst parametr t, kter´ y je zde urˇcen jako kolm´a vzd´alenost haptick´eho pera od roviny troj´ uheln´ıku. Abychom mohli tuto vzd´alenost spoˇc´ıtat, je tˇreba nejprve vytvoˇrit vektor z bodu troj´ uheln´ıku k bodu polohy haptick´eho pera. Pot´e je jiˇz moˇzn´e vzd´alenost spoˇc´ıtat jako skal´arn´ı souˇcin vytvoˇren´eho vektoru s norm´alou roviny troj´ uheln´ıku. Velikost t´eto vzd´alenosti
3 Navrˇzen´e ˇreˇsen´ı
32
bude rovna maxim´alnˇe EPS T. Aby se s´ıla postupnˇe zvyˇsovala i po proniknut´ı skrze model, kde je parametr t z´aporn´ y, je k nˇemu pˇriˇctena konstanta EPS T, takˇze hodnota v´ ysledn´eho parametru je v rozmez´ı h0, 2 EPS T i . V´ ypoˇ cet norm´ aly Aby byla hmatov´a odezva co nejhladˇs´ı, je norm´ala, kter´a je pouˇzita k v´ ypoˇctu smˇeru s´ıly, vypoˇctena pomoc´ı barycentrick´ ych souˇradnic troj´ uheln´ıku, kter´e urˇcuj´ı v´ahu norm´al vˇsech tˇr´ı vrchol˚ u. Nejprve je tˇreba vypoˇc´ıtat kolm´ y pr˚ umˇet polohy haptick´eho pera do roviny troj´ uheln´ıku, tedy vlastnˇe pr˚ useˇc´ık roviny s pˇr´ımkou urˇcenou pozic´ı pera a opaˇcnou norm´alou roviny. Pro tento u ´ˇcel jsem pouˇzila jiˇz dˇr´ıve pouˇzitou a implementovanou metodu pro v´ ypoˇcet pr˚ useˇc´ıku paprsku s troj´ uheln´ıkem. Pokud v´ ysledn´ y pr˚ useˇc´ık neleˇz´ı uvnitˇr troj´ uheln´ıku, je jako norm´ala urˇcuj´ıc´ı smˇer s´ıly pouˇzita norm´ala vrcholu, kter´ y leˇz´ı nejbl´ıˇze pr˚ useˇc´ıku. Pokud se vˇsak pr˚ useˇc´ık nach´az´ı uvnitˇr troj´ uheln´ıku, jsou spoˇcteny barycentrick´e souˇradnice podle vzorc˚ u:
A(p, q1 , q2 ) A(q0 , q1 , q2 ) A(p, q2 , q0 ) = A(q0 , q1 , q2 ) A(p, q0 , q1 ) = , A(q0 , q1 , q2 )
a0 = a1 a2
(3.6)
kde A(p, qi , qj ) je obsah troj´ uheln´ıku tvoˇren´eho vrcholy p, qi a qj , viz Obr.3.4. Jin´ y v´ ypoˇcet barycentrick´ ych souˇradnic neˇz v kapitole 3.5.6 je zde zvolen z d˚ uvodu, ˇze je potˇreba tˇr´ı souˇradnic, z nichˇz kaˇzd´a je pouˇzita jako v´ahov´ y koeficient norm´aly jednoho z vrchol˚ u troj´ uheln´ıka pˇri v´ ypoˇctu v´ ysledn´e norm´aly. V´ ysledkem pˇredchoz´ıho v´ ypoˇctu barycentrick´ ych souˇradnic byly pouze dvˇe souˇradnice a slouˇzily jako v´ahov´e koeficienty vektor˚ u hran troj´ uheln´ıku pro urˇcen´ı polohy bodu uvnitˇr nebo vnˇe troj´ uheln´ıku.
3 Navrˇzen´e ˇreˇsen´ı
33 q2
p
q1
q0
Obr´azek 3.4: Uk´azka rozdˇelen´ı troj´ uheln´ıku pro v´ ypoˇcet barycentrick´ ych souˇradnic Tyto souˇradnice urˇcuj´ı relativn´ı polohu pr˚ useˇc´ıku vzhledem k vrchol˚ um troj´ uheln´ıku. Jsou to tedy v´ahov´e koeficienty, kter´e jsou pouˇzity pro v´ ypoˇcet v´ ysledn´e norm´aly: → − − − − n = a0 → n0 + a1 → n 1 + a2 → n2
(3.7)
V´ ypoˇ cet s´ıly Silov´a zpˇetn´a vazba je spoˇctena podle vzorce (s max. velikost´ı s´ıly 1.6 N):
→ − − F =→ n .(2EP S T − t)2 .
1 .1.6 , (2EP S T )2
(3.8)
− kde → n je norm´ala dan´eho troj´ uheln´ıku a 2EP S T je maxim´aln´ı hodnota parametru t. Optimalizace Aby byl v´ ypoˇcet s´ıly rychlejˇs´ı, je v programu provedeno n´asleduj´ıc´ı vylepˇsen´ı. Pokud nen´ı ˇza´dn´a z vypoˇc´ıtan´ ych kolm´ ych vzd´alenost´ı haptick´eho pera od roviny troj´ uheln´ıku menˇs´ı neˇz EPS T, pˇriˇcte se k iterac´ım, kdy se nepoˇc´ıt´a nov´a s´ıla, 200 iterac´ı. Po spoˇc´ıt´an´ı s´ıly jsou tak´e pˇrid´any tˇri dalˇs´ı iterace, bˇehem kter´ ych se nepoˇc´ıt´a nov´a s´ıla.
4 Uˇzivatelsk´e testy
4
34
Uˇ zivatelsk´ e testy
V´ ysledky sv´e pr´ace jsem pˇredloˇzila k otestov´an´ı skupinˇe uˇzivatel˚ u, kteˇr´ı z´aroveˇ n vyplnili pˇripraven´ y dotazn´ık - viz pˇr´ıloha. Testy zahrnovaly pˇrev´aˇznˇe uk´azky z vyˇsˇs´ı knihovny HLAPI. Nejprve byl uˇzivatel˚ um spuˇstˇen program bez grafick´e vizualizace, pouze s vykreslen´ ym 3D kurzorem, aby mˇel uˇzivatel pˇribliˇznou pˇredstavu, v jak´e ˇc´asti OpenGL projekce se haptick´e pero nach´az´ı - viz Obr.4.1. V tomto programu byl bud’ hapticky vyrenderov´an deformovan´ y elipsoid nebo lidsk´a hlava s obliˇcejem. Uˇzivatel´e mˇeli poznat, zda je ohmat´avan´ y model modelem hlavy ˇci ne, a urˇcit, do jak´e m´ıry je to poznat.
Obr´azek 4.1: Uk´azka aplikace urˇcen´e pro uˇzivatelsk´e testy bez grafick´e vizualizace, pouze s vykreslen´ ym 3D kurzorem
V dalˇs´ı ˇca´sti testu jiˇz byl uˇzivateli zobrazen model hlavy a uˇzivatel mˇel na z´akladˇe hmatov´eho dojmu urˇcit, zda m´a tento model vlasy a vousy - viz Obr.4.2. Pro kaˇzd´ y z tˇechto materi´al˚ u pak byla v dotazn´ıku poloˇzena ot´azka, na kolik je materi´al podobn´ y realitˇe.
4 Uˇzivatelsk´e testy
35
Obr´azek 4.2: Uk´azka aplikace urˇcen´e pro uˇzivatelsk´e testy, kde je zobrazen a ohmat´av´an model lidsk´e hlavy
D´ale byla uˇzivatel˚ um najednou spuˇstˇena dvˇe okna. V jednom byly zobrazeny dva modely, model hlavy muˇze a model hlavy ˇzeny - viz Obr.4.3. V druh´em oknˇe byl zobrazen pouze kurzor a byl zde hapticky vyrenderov´an jeden ze zobrazen´ ych model˚ u z prvn´ıho okna. Uˇzivatel´e mˇeli poznat, kter´ y ze zobrazen´ ych model˚ u ohmat´avaj´ı, a opˇet urˇcit, nakolik je to poznat. Posledn´ı ˇca´st´ı uˇzivatelsk´eho testu bylo ohodnocen´ı vˇerohodnosti ohmat´av´an´ı modelu hlavy v aplikaci vytvoˇren´e za pouˇzit´ı niˇzˇs´ı knihovny HDAPI a detekce koliz´ı pomoc´ı poˇc´ıt´an´ı tˇeˇziˇst’.
4 Uˇzivatelsk´e testy
36
Obr´azek 4.3: Uk´azka aplikace urˇcen´e pro uˇzivatelsk´e testy, kde jsou zobrazeny modely hlav muˇze a ˇzeny
4.1
V´ ysledky
Uˇzivatelsk´ ych test˚ u se z´ uˇcastnilo celkem 21 uˇzivatel˚ u. Kaˇzd´ yu ´ˇcastn´ık vyplnil pˇripraven´ y dotazn´ık. Vyhodnocen´ım vˇsech dotazn´ık˚ u jsem dospˇela k n´asleduj´ıc´ım z´avˇer˚ um. V prvn´ı aplikaci, kdy uˇzivatel´e nevidˇeli ohmat´avan´ y model, byl virtu´aln´ım objektem deformovan´ y elipsoid. Poznalo to pˇribliˇznˇe 57% vˇsech dot´azan´ ych viz Obr.4.4. Takto mal´ y poˇcet spr´avn´ ych odpovˇed´ı m˚ uˇze b´ yt zp˚ usoben t´ım, ˇze nˇekteˇr´ı uˇzivatel´e si pod modelem lidsk´e hlavy mohli pˇredstavovat pouze jej´ı tvar bez pˇr´ıtomnosti obliˇceje. Druhou ot´azku k t´eto aplikaci, kde mˇeli uˇzivatel´e urˇcit, do jak´e m´ıry je poznat, co ohmat´avaj´ı, jsem vyhodnotila zvl´aˇst’ pro uˇzivatele se spr´avnou a se ˇspatnou odpovˇed´ı, aby bylo zˇrejm´e, kter´a skupinka si svou odpovˇed´ı byla v´ıce jist´a. Z Obr.4.5 a Obr.4.6 je patrn´e, ˇze vˇetˇsina uˇzivatel˚ u se ˇspatnou odpovˇed´ı ohodnotila m´ıru sv´e jistoty ˇc´ıslem 2. Naproti tomu uˇzivatel´e se spr´avnou odpovˇed´ı vˇetˇsinou zakrouˇzkovali ˇc´ıslo 3 nebo 4, z ˇcehoˇz je moˇzn´e usoudit, ˇze si svou odpovˇed´ı byli o nˇeco jistˇejˇs´ı.
4 Uˇzivatelsk´e testy
100
37
Otázka č.1 - Identifikace modelu hlavy
80 57,14
60 [%]
42,86 40 20 0 špatně
správně Odpověď
Obr´azek 4.4: Pˇri ohmat´av´an´ı deformovan´eho elipsoidu dosahovala u ´spˇeˇsnost pˇribliˇznˇe 57%
100 80
Otázka č.1 - Jistota respondentů se špatnou odpovědí 55,56
60 [%] 40
22,22 20
11,11
11,11 0,00
0 1
2
3
4
5
Hodnocení
Obr´azek 4.5: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri ˇspatn´e odpovˇedi na prvn´ı ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi
4 Uˇzivatelsk´e testy
100 80
38
Otázka č.1 - Jistota respondentů se správnou odpovědí
60 [%] 40 20
33,33
33,33
16,67 8,33
8,33
0 1
2
3
4
5
Hodnocení
Obr´azek 4.6: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri spr´avn´e odpovˇedi na prvn´ı ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi
Z v´ ysledk˚ u ot´azky t´ ykaj´ıc´ı se druh´e aplikace, kter´a byla u ´plnˇe stejn´a jako ta prvn´ı s jedin´ ym rozd´ılem, ˇze uˇzivatel´e tentokr´at ohmat´avali model lidsk´e hlavy, je patrn´e, ˇze model poznalo jiˇz v´ıce uˇzivatel˚ u, a to t´emˇeˇr 81% - viz Obr.4.7. Velk´ y rozd´ıl v´ ysledk˚ u prvn´ı a druh´e aplikace dokazuje, ˇze vˇetˇsina uˇzivatel˚ u si jiˇz u druh´eho modelu uvˇedomila, ˇze souˇca´st´ı modelu lidsk´e hlavy by mˇel b´ yt i obliˇcej. Stejnˇe jako u v´ ysledk˚ u prvn´ı aplikace jsem i zde rozdˇelila vyhodnocen´ı ot´azky, kde mˇeli uˇzivatel´e ohodnotit, do jak´e m´ıry je to poznat, mezi uˇzivatele se ˇspatnou a se spr´avnou odpovˇed´ı. I zde m˚ uˇzeme usoudit na z´akladˇe Obr.4.8 a Obr.4.9, ˇze uˇzivatel´e, kteˇr´ı odpovˇedˇeli spr´avnˇe, si svou odpovˇed´ı byli v´ıce jisti, neˇz ti, kteˇr´ı nepoznali, ˇze jde o model lidsk´e hlavy.
4 Uˇzivatelsk´e testy
100
39
Otázka č.2 - Identifikace modelu hlavy 80,95
80 60 [%] 40 19,05 20 0 správně
špatně Odpověď
Obr´azek 4.7: Pˇri ohmat´av´an´ı modelu hlavy dosahovala u ´spˇeˇsnost t´emˇeˇr 81%
100 80
Otázka č.2 - Jistota respondentů se špatnou odpovědí
60
50,00
50,00
[%] 40 20 0,00
0,00
0,00
4
5
0 1
2
3 Hodnocení
Obr´azek 4.8: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri ˇspatn´e odpovˇedi na druhou ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi
4 Uˇzivatelsk´e testy
100 80
40
Otázka č.2 - Jistota respondentů se správnou odpovědí
60 [%] 35,29
40
29,41 17,65
20
17,65
0,00 0 1
2
3
4
5
Hodnocení
Obr´azek 4.9: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri spr´avn´e odpovˇedi na druhou ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi
U tˇret´ı aˇz p´at´e aplikace mˇeli uˇzivatel´e za u ´kol poznat, zda m´a ohmat´avan´ y model vlasy a vousy. V´ ysledky jsem shrnula tak, ˇze jsem uˇzivatele rozdˇelila podle toho, zda u vˇsech tˇr´ı aplikac´ı spr´avnˇe rozeznali pˇr´ıtomnost vlas˚ u ˇci vous˚ u nebo ne. V´ ysledky jak pro vlasy tak pro vousy jsou pˇrekvapivˇe podobn´e. U vˇsech tˇr´ı aplikac´ı poznalo spr´avnˇe pˇr´ıtomnost vlas˚ u t´emˇeˇr 83% a vous˚ u takt´eˇz t´emˇeˇr 83% respondent˚ u - viz Obr.4.10 a Obr.4.11.
4 Uˇzivatelsk´e testy
100 80
41
Otázka č.3-5 - Rozpoznání přítomnosti 82,54 vlasů
60 [%] 40 17,46
20 0 správně
špatně Odpověď
Obr´azek 4.10: Pˇr´ıtomnost vlas˚ u na modelu hlavy poznalo t´emˇeˇr 83% respondent˚ u
100 80
Otázka č.3-5 - Rozpoznání přítomnosti 82,54 vousů
60 [%] 40 17,46
20 0 správně
špatně Odpověď
Obr´azek 4.11: Pˇr´ıtomnost vous˚ u na modelu hlavy poznalo t´emˇeˇr 83% respondent˚ u
4 Uˇzivatelsk´e testy
42
V ˇsest´e aplikaci mˇeli uˇzivatel´e ohodnotit vˇerohodnost jednotliv´ ych materi´al˚ u. Nejl´epe byla hodnocena k˚ uˇze - viz Obr.4.14. V´ ysledky hodnocen´ı vlas˚ u se podezˇrele podobaj´ı norm´aln´ımu rozdˇelen´ı - viz Obr.4.12. Nejh˚ uˇre vˇsak dopadlo ohodnocen´ı vous˚ u - viz Obr.4.13. Mysl´ım, ˇze se zde nen´ı ˇcemu divit, jelikoˇz materi´aly bylo moˇzn´e nastavit pouze mˇenˇen´ım ˇctyˇr r˚ uzn´ ych vlastnost´ı.
100 80
Otázka č.6 - Ohodnocení věrohodnosti vlasů
60 [%] 40
33,33 23,81
20
23,81
9,52
9,52
0 1
2
3
4
5
Hodnocení
Obr´azek 4.12: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle hodnocen´ı vˇerohodnosti vlas˚ u, pˇriˇcemˇz 1 - nejm´enˇe vˇerohodn´e, 5 - nejv´ıce vˇerohodn´e
4 Uˇzivatelsk´e testy
100 80
43
Otázka č.6 - Ohodnocení věrohodnosti vousů
60 [%]
42,86 40 20
14,29
9,52
19,05
14,29
0 1
2
3
4
5
Hodnocení
Obr´azek 4.13: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle hodnocen´ı vˇerohodnosti vous˚ u, pˇriˇcemˇz 1 - nejm´enˇe vˇerohodn´e, 5 - nejv´ıce vˇerohodn´e
100 80
Otázka č.6 - Ohodnocení věrohodnosti kůže
60 [%]
42,86 40
28,57 19,05
20
9,52 0,00
0 1
2
3
4
5
Hodnocení
Obr´azek 4.14: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle hodnocen´ı vˇerohodnosti k˚ uˇze, pˇriˇcemˇz 1 - nejm´enˇe vˇerohodn´e, 5 - nejv´ıce vˇerohodn´e
4 Uˇzivatelsk´e testy
44
U sedm´e aplikace uˇzivatel´e urˇcovali na z´akladˇe obrazov´eho podkladu, zda ohmat´avaj´ı hlavu muˇze nebo ˇzeny. Spr´avnou odpovˇed´ı bylo, ˇze virtu´aln´ım modelem je model ˇzeny. Poznalo to t´emˇeˇr 67% respondent˚ u. Z Obr.4.16 a Obr.4.17 vˇsak vypl´ yv´a, ˇze at’ odpovˇedˇeli uˇzivatel´e spr´avnˇe ˇci ˇspatnˇe, ani v jednom pˇr´ıpadˇe si t´ım nebyli vˇetˇsinou pˇr´ıliˇs jisti.
100 80
Otázka č.7 - Identifikace hlavy muže/ženy 66,67
60 [%] 40
33,33
20 0 MUŽ - špatně
ŽENA - správně Odpověď
Obr´azek 4.15: Pˇri ohmat´av´an´ı modelu ˇzensk´e hlavy dosahovala u ´spˇeˇsnost t´emˇeˇr 67%
4 Uˇzivatelsk´e testy
100 80
45
Otázka č.7 - Jistota respondentů se špatnou odpovědí
60 [%]
42,86 40
28,57
20
14,29
14,29
4
5
0,00 0 1
2
3 Hodnocení
Obr´azek 4.16: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri ˇspatn´e odpovˇedi na sedmou ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi
100 80
Otázka č.7 - Jistota respondentů se správnou odpovědí
60 [%] 35,71
40 21,43 20
21,43
14,29 7,14
0 1
2
3
4
5
Hodnocení
Obr´azek 4.17: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri spr´avn´e odpovˇedi na sedmou ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi
4 Uˇzivatelsk´e testy
46
U osm´e aplikace uˇzivatel´e hodnotili vˇerohodnost aplikace pouˇz´ıvaj´ıc´ı niˇzˇs´ı knihovnu HDAPI. Z v´ ysledk˚ u nen´ı patrn´e, ˇze by se uˇzivatel´e na ohodnocen´ı shodovali - viz Obr.4.18.
100 80
Otázka č.8 - Ohodnocení aplikace používající nižší knihovnu HDAPI
60 [%] 40
28,57
28,57 19,05
20
14,29
9,52
0 1
2
3
4
5
Hodnocení
Obr´azek 4.18: Percentu´aln´ı rozdˇelen´ı respondent˚ u podle hodnocen´ı vˇerohodnosti aplikace pouˇz´ıvaj´ıc´ı knihovnu HDAPI, pˇriˇcemˇz 1 - nejm´enˇe vˇerohodn´e, 5 - nejv´ıce vˇerohodn´e
5 Z´avˇer
5
47
Z´ avˇ er
V´ ysledkem m´e pr´ace jsou tˇri r˚ uzn´e aplikace pro ohmat´av´an´ı 3D model˚ u hlav. Jedna za pouˇzit´ı knihovny HLAPI a druh´e dvˇe za pouˇzit´ı niˇzˇs´ı knihovny HDAPI pouze s rozd´ılnou detekc´ı koliz´ı a v´ ypoˇctem silov´e zpˇetn´e vazby. Po srovn´an´ı tˇechto aplikac´ı jsem doˇsla k z´avˇeru, ˇze nejvˇerohodnˇejˇs´ıho ohmat´av´an´ı dosahuje prvn´ı aplikace. Je to d´ano t´ım, ˇze jsou v HLAPI jiˇz vestavˇen´e efektivn´ı algoritmy pro detekci koliz´ı a v´ ypoˇcet s´ıly. Proto jsem se mohla vˇenovat i nastaven´ı vlastnost´ı materi´al˚ u. Niˇzˇs´ı knihovna m´a podle m´eho n´azoru vˇsak vysok´ y potenci´al v tom, ˇze je zde moˇzn´e nastaven´ı vlastn´ı s´ıly, a tedy snad i vˇerohodnˇejˇs´ı hmatov´e odezvy materi´al˚ u. Aplikace vytvoˇren´e v niˇzˇs´ı knihovnˇe se tak´e velmi liˇs´ı. V programu obsahuj´ıc´ım v´ ypoˇcet tˇeˇziˇst’ je haptick´a smyˇcka mnohem rychlejˇs´ı, prob´ıh´a proto ˇcastˇeji a v´ ysledn´ y dojem silov´e zpˇetn´e vazby je mnohem spojitˇejˇs´ı neˇz u druh´e aplikace. V´ yslednou aplikaci v niˇzˇs´ı knihovnˇe by bylo moˇzn´e pro dokonalejˇs´ı hmatovou odezvu vylepˇsit n´asledovnˇe. Bylo by tˇreba zde vytvoˇrit syst´em, kter´ y nedovol´ı uˇzivateli proniknout haptick´ ym perem dovnitˇr modelu. Vhodn´ ym ˇreˇsen´ım by byla implementace syst´emu pruˇziny a tlumiˇce, jako je tomu u vyˇsˇs´ı knihovny HLAPI, viz kapitola 3.1.3.
Seznam obr´azk˚ u
48
Seznam obr´ azk˚ u 2.1 2.2 3.1 3.2 3.3 3.4 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14
Haptick´e zaˇr´ızen´ı PHANTOM Omni [Zdroj: www.sensable.com] . 2 Uspoˇr´ad´an´ı jednotliv´ ych knihoven v OpenHaptics . . . . . . . . . 4 Zn´azornˇen´ı proxy bodu [Zdroj: http://geomagic.com/files/4013/ 4851/4367/OpenHaptics_ProgGuide.pdf] . . . . . . . . . . . . . 9 Typick´a struktura HL programu [Zdroj: http://geomagic.com/ files/4013/4851/4367/OpenHaptics_ProgGuide.pdf] . . . . . . 10 Zn´azornˇen´ı v´ ypoˇctu pr˚ useˇc´ıku . . . . . . . . . . . . . . . . . . . . 28 Uk´azka rozdˇelen´ı troj´ uheln´ıku pro v´ ypoˇcet barycentrick´ ych souˇradnic 33 Uk´azka aplikace urˇcen´e pro uˇzivatelsk´e testy bez grafick´e vizualizace, pouze s vykreslen´ ym 3D kurzorem . . . . . . . . . . . . . . 34 Uk´azka aplikace urˇcen´e pro uˇzivatelsk´e testy, kde je zobrazen a ohmat´av´an model lidsk´e hlavy . . . . . . . . . . . . . . . . . . . . 35 Uk´azka aplikace urˇcen´e pro uˇzivatelsk´e testy, kde jsou zobrazeny modely hlav muˇze a ˇzeny . . . . . . . . . . . . . . . . . . . . . . . 36 Pˇri ohmat´av´an´ı deformovan´eho elipsoidu dosahovala u ´spˇeˇsnost pˇribliˇznˇe 57% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri ˇspatn´e odpovˇedi na prvn´ı ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi . . 37 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri spr´avn´e odpovˇedi na prvn´ı ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi . . 38 Pˇri ohmat´av´an´ı modelu hlavy dosahovala u ´spˇeˇsnost t´emˇeˇr 81% . . 39 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri ˇspatn´e odpovˇedi na druhou ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi . 39 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri spr´avn´e odpovˇedi na druhou ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi . 40 Pˇr´ıtomnost vlas˚ u na modelu hlavy poznalo t´emˇeˇr 83% respondent˚ u 41 Pˇr´ıtomnost vous˚ u na modelu hlavy poznalo t´emˇeˇr 83% respondent˚ u 41 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle hodnocen´ı vˇerohodnosti vlas˚ u, pˇriˇcemˇz 1 - nejm´enˇe vˇerohodn´e, 5 - nejv´ıce vˇerohodn´e . . . 42 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle hodnocen´ı vˇerohodnosti vous˚ u, pˇriˇcemˇz 1 - nejm´enˇe vˇerohodn´e, 5 - nejv´ıce vˇerohodn´e . . . 43 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle hodnocen´ı vˇerohodnosti k˚ uˇze, pˇriˇcemˇz 1 - nejm´enˇe vˇerohodn´e, 5 - nejv´ıce vˇerohodn´e . . . . 43
Seznam obr´azk˚ u
4.15 Pˇri ohmat´av´an´ı modelu ˇzensk´e hlavy dosahovala u ´spˇeˇsnost t´emˇeˇr 67% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.16 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri ˇspatn´e odpovˇedi na sedmou ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi . 4.17 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle m´ıry jejich jistoty pˇri spr´avn´e odpovˇedi na sedmou ot´azku, pˇriˇcemˇz 1 - m´alo, 5 - velmi . 4.18 Percentu´aln´ı rozdˇelen´ı respondent˚ u podle hodnocen´ı vˇerohodnosti aplikace pouˇz´ıvaj´ıc´ı knihovnu HDAPI, pˇriˇcemˇz 1 - nejm´enˇe vˇerohodn´e, 5 - nejv´ıce vˇerohodn´e . . . . . . . . . . . . . . . . . . . . . . . . .
49
44 45 45
46
Reference
50
Reference [1] CHAI 3D. [online]. 2012. [cit. 2013-05-10]. Dostupn´e na: http://www.chai3d.org/ [2] Force Dimension. Chai3D overview [online]. 2012. [cit. 2013-01-03]. Dostupn´e na: http://www.forcedimension.com/chai3d-overview [3] Senasable Technologies. PHANTOM Omni haptic device [online]. 2012. [cit. 2013-01-03]. Dostupn´e na: http://www.sensable.com/haptic-phantom-omni.htm [4] Senasable Technologies. OpenHaptics Toolkit [online]. 2013. [cit. 2013-05-10]. Dostupn´e na: http://geomagic.com/en/products/open-haptics/overview [5] MART´INEK Petr. Programov´e vybaven´ı pro sestavov´an´ı identikit˚ u, diplomov´a pr´ace, Z´apadoˇcesk´a univerzita v Plzni, 2012 [6] WEISSTEIN, Eric W. Quicksort. [online]. 2013 [cit. 2013-05-10]. Dostupn´e na: http://mathworld.wolfram.com/Quicksort.html [7] SUNDAY Dan. Intersections of Rays and Triangles(3D). [online]. 2013 [cit. 2013-05-10]. Dostupn´e na: http://geomalgorithms.com/a06- intersect-2.html [8] SensAble Technologies. Openhaptics toolkit - Programmer’s guide [online]. 2013 [cit. 2013-05-10]. Dostupn´e na: http://www.geomagic.com/files/4013/4851/4367/OpenHaptics ProgGuide.pdf [9] CASILLAS Miguel. Half-Space Test [online]. 2010-06-15 [cit. 2013-05-10]. Dostupn´e na: http://www.miguelcasillas.com/?p=43 ´ ´ Martina. Multimorphing - Barycentrick´e souˇradnice v n-´ [10] MALKOV A uheln´ıku [online]. 2013 [cit. 2013-05-10]. Dostupn´e na: http://home.zcu.cz/ mmalkov/index.php?stranka=multimorphing
A
Pˇ r´ıloha - dotazn´ık Věk: ….
Je váš obor informatika?
Vyšší knihovna HL
1) Je ohmatávaný model modelem lidské hlavy? Do jaké míry je to poznat? : (1 – málo, 5 – velmi)
1 2
1 2
ANO
NE
ANO
NE
Student: ANO
3 4 5
2) Je ohmatávaný model modelem lidské hlavy? Do jaké míry je to poznat? : (1 – málo, 5 – velmi)
Pohlaví: M – Ž
3 4 5
3) Má ohmatávaný model hlavy vousy?
ANO
NE
Má ohmatávaný model hlavy vlasy?
ANO
NE
4) Má ohmatávaný model hlavy vousy?
ANO
NE
Má ohmatávaný model hlavy vlasy?
ANO
NE
5) Má ohmatávaný model hlavy vousy?
ANO
NE
Má ohmatávaný model hlavy vlasy?
ANO
NE
6) Ohodnoťte věrohodnost materiálů (1 – nejméně věrohodné, 5 – nejvíce věrohodné): Vlasy: 1 2 3 4 5 Vousy:
1 2 3 4 5
Kůže:
1 2 3 4 5
7) Který ze zobrazených modelů myslíte, že ohmatáváte, mužskou nebo ženskou hlavu? MUŽE
ŽENU
Do jaké míry je to poznat? : (1 – málo, 5 – velmi)
1 2
3 4 5
Nižší knihovna HD 8) Ohodnoťte ohmatávání modelu hlavy (1 – nejméně věrohodné, 5 – nejvíce věrohodné): 1
2
3 4 5
NE