Tillämpning och Visualisering av Kvaternioner Application and Visualization of Quaternions Examensarbete för kandidatexamen i matematik vid Göteborgs universitet Kandidatarbete inom civilingenjörsutbildningen vid Chalmers Emil Hietanen Hampus Ahlebrand Henrik Petterson Philip Karlsson Institutionen för Matematiska vetenskaper CHALMERS TEKNISKA HÖGSKOLA GÖTEBORGS UNIVERSITET Göteborg, Sverige 2020 Tillämpning och Visualisering av Kvaternioner Examensarbete för kandidatexamen i matematik vid Göteborgs universitet Emil Hietanen Kandidatarbete i matematik inom civilingenjörsprogrammet Teknisk fysik vid Chal- mers Hampus Ahlebrand Kandidatarbete i matematik inom civilingenjörsprogrammet Teknisk matematik vid Chalmers Henrik Petterson Kandidatarbete i matematik inom civilingenjörsprogrammet Kemiteknik och fysik vid Chalmers Philip Karlsson Handledare: Alexei Heintz Exminatorer: Ulla Dinger & Maria Roginskaya Institutionen för Matematiska vetenskaper CHALMERS TEKNISKA HÖGSKOLA GÖTEBORGS UNIVERSITET Göteborg, Sverige 2020 Förord Vi vill tacka vår handledare Alexei Heintz och även våra eximatorer: Ulla Dinger och Maria Roginskaya. En loggbok (dagbok) har uppdaterats varje vecka inom gruppen. Individuella tidsloggar har förts där information om de enskilda medverkandets prestationer återfinns. Gemensamma bidrag Vi har alla hjälpt varandra genom att noggrant läsa igenom varandras bidrag och givit feedback. Individuella bidrag Avsnitt Emil Hampus Henrik Philip Poulärvetenskaplig presentation x Sammanfattning x Inledning x Förkunskap x Syfte x Historia x Grundläggande Teori och Notation -Notation x -Räkneregler och Defentioner x -Rotation x -Visualisering x Tillämpningar av Grundteori -Bält-tricket x -Boll-tricket x x Avancerad teori -3D-ytor x -Visualisering av 3D-ytor x Tillämpning av Avancerad Teori -Kollisionssdetekion x -Kollision med friktion x -Visualisering av en kollision x x Diskussion x Billagor -A Kollsion bevis x -B Superquadratics x -C Kollisionsdetektion och restriktione x x -D Visualiseringar -D.1 Blender x x -D.2 MatLab x x x Tabellutforming x x Figur 1: En representation av ansvarig/ansvariga för respektive avsnitt. Populärvetenskaplig presentation Tillämpningar av Kvaternioner Sir William Rowan Hamilton var enligt egen utsago ute på en promenad år 1854 när han fick idén om hur de komplexa talen kan generaliseras upp till fyra dimensioner, denna upptäckt blev senare känd som den hyperkomplexa talmängden kvaternioner. Hamilton föreslog att man bör använda sig av kvaternioner som standard notation för vektoroperationer men förslaget mötte motstånd från forskningsvärlden och istället valdes Gibbs notation. Möjligheten att använda sig av kvaternioner diskuterades även i samband med tillkomsten av kvantfysiken men återigen valdes en annan metod. En kan undra varför kvaternioner dömdes ut till förmån för alternativa metoder, det främsta argumentet var att notationen ansågs vara otymplig. I början av 80-talet i samband med datorgrafikens framfart så ökade också användandet av kvaternioner eftersom det inom datorgrafiken var (och är) viktigt med tillförlitlig orientering vid 3D-rotationer. Användandet av kvaternioner har därför varit att föredra framför den alternativa metoden, Eulervinklar. Anledningen till att kvaternioner ofta valts framför Eulervinklar är på grund av Gimbal-lock. Gimbal-lock är ett fenomen parat med dessa vinklar som innebär att en rotationsaxel förloras vid en specifik orientering, ett system i denna situation mister därför kontakten med en mängd orienteringar. En annan fördel med att nyttja kvaternioner är möjligheten att förklara och förstå fenomen som annars inte avslöjar sina hemligheter. För att demonstrera detta har vi i rapporten visualiserat två sådana fenomen, Bält- och Boll-tricket. Problematiken och begränsningarna med Eulervinklar har inneburit att man inom flera områden valt att använda sig av kvaternioner som standardmetod för rotation och orientering. Inom stelkroppsdynamiken är det viktigt att beskriva hur stelkroppar påverkas av en kollision, där en stelkropp är en kropp som inte kan deformeras. För närvarande finns inget känt material med denna egenskap, men en stelkropp är en bra approximation om deformationen är försumbar. I samband med en kollision av två stelkroppar så kommer deras orientering och rotation att ändras, en kollisionsmodell behöver därmed ett verktyg för att beskriva dessa ting vilket fördelaktigt görs med kvaternioner. För att visa hur det kan göras har vi i denna rapport simulerat och visualiserat två kollisioner med friktion. Ytterligare ett användningsområde för kvaternioner är inom differentialgeometrin där kvaternioner bland annat kan användas för att beskriva 3D-ytor, dess egenskaper och avbildning. -Vi behöver använda kvaternioner varje gång vi i vill interpolera koordinater, animation av en kameras rörelse, simuleringar, beskriva hastigheten för vätskor, och det är enkelt att göra fel inom allt detta, säger John C. Hart, professor i datorvetenskap 1. Kvaternioner har flera tillämpningsområden och vi behöver använda oss av kvaternioner, inom alla moderna vetenskaper, för att beskriva den verkliga världen vi lever i. 1Andrew J. Hanson. Visualizing Quaternions, 2006. Sid. xxiii Sammanfattning Den här rapporten undersöker hur kvaternioner kan visualiseras och användas i diverse tillämpningar. Generaliseringen av komplexa tal upp till fyra dimensioner, senare känt som den hyperkompelxa talmängden kvaternioner presenterades för världen av Sir William Rowan Hamilton, 1854, och har sedan dess applicerats inom flera områden. I denna rapporten utreds hur kvaternioner kan användas och visualiseras inom tre tillämpningsområden men först beskrivs nödvändig teori och bakgrund. I rapporten har en jämförelse mellan kvaternioner och den alternativa metoden, Eulervinklar, studerats för att belysa skillnader i metoderna. Den grundläggande teorin för kvaternioner används därefter för att få en förståelse för teorin och hur kvaternioner fungerar genom två visualiserade fenomen vars förklaring endast är möjlig med kvaternioner, boll- och bält-tricket. Därefter behandlas mer avancerad teori inom tre tillämpningsområden; datorgrafik, stelkroppsdynamik och differentialgeometri. Inom differentialgeometri så behandlar denna rapporten hur man kan beskriva 3D ytor med hjälp av så kallade kvaternionramar och kvaternion-Gaussavbildning, vilket möjliggör ett sätt att beskriva en yta och dess egenskaper. Dessutom undersöks möjligheterna att använda kvaternioner inom stelkroppsdynamik genom en simulerad kollision mellan två konvexa stelkroppar med en friktionskoefficient och varför det kan vara fördelaktigt att använda sig av kvaternioner. Visualiserngarna av kvaternioner i rapporten är genomförda med olika metoder, men alla visualiseringar har genomförts i antigen Blender eller MatLab. Resultatet i rapporten ger en kännedom om diverse tillämpningar och visualiseringar om kvaternioner. Dessutom belyses också begränsningar med den alternativa metoden, Eulervinklar, som kvaternioner inte besitter. De begränsningar som Eulervinklar besitter innebär att kvaternioner är en fördelaktig metod i de tillämpningar vi studerat. Nyckelord; Kvaternion; Kvatternionram; Gaussavbildning; Rotation; Orientering; Stelkroppsdynamik; Visualisering, Bält-tricket; Bolltricket. Abstract This report examines how quaternions can be used and visualized in various applications. The generalization of complex numbers up to four dimensions, later known as the hypercomplex number of quaternions was presented to the world by Sir William Rowan Hamilton, 1854, and has since been applied in several fields. This report investigates how quaternions can be used and visualized in three areas of application, but first the necessary theory and background are described. In the report, a comparison between quaternions and the alternative method, Euler angles, has been studied to elucidate differences in the methods. The basic theory of quaternions is then used to gain an understanding of the theory and how quaternions work through two visualized phenomena that we explain using quaternions, the ball and belt trick. Thereafter, more advanced theory is dealt with in three areas of application; computer graphics, body dynamics and differential geometry In differential geometry, this report deals with how to describe 3D surfaces using so-called quaternion frames and quaternion Gaussian map, which allows a way to describe a surface and its properties. In addition, the possibilities of using quaternions in rigid body dynamics are investigated through a simulated collision between two convex rigid bodies with a coefficient of friction and why it can be advantageous to use quaternions. The visualizations of quaternions in the report are carried out by different methods, but all visualizations have been performed in either Blender or MatLab. The results in the report provide knowledge of various applications and visualizations of quaternions. In addition, limitations are also highlighted by the alternative method, Euler angles, which quaternions do not possess. The limitations that Euler angles possess mean that quaternions are an advantageous method in the applications we studied. Keywords; Quaternion; Quaternion frame; Gauss map; Rotation; Orientation; Rigid-body dynamics; Visualization, Belt trick; Ball trick. Innehåll 1 Inledning 1 2 Förkunskap 1 3 Syfte 2 4 Historia 2 5 Grundläggande Teori och Notation 2 5.1 Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 5.2 Räkneregler och Definitioner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5.3 Rotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5.3.1 Rotation med kvaternioner i matrisform . . . . . . . . . . . . . . . . . . . . 4 5.3.2 Rotation av en ren kvaternion . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.3.3 Rotation med Eulervinklar . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5.3.4 Matris- eller kvaternionform? . . . . . . . . . . . . . . . . . . . . . . . . . . 8 5.4 Visualisering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 5.4.1 Stereografisk projektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 5.4.2 Kvadratrotsmetoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 6 Tillämpningar av Grundteorin 10 6.1 Bält-Tricket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 6.2 Boll-Tricket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 7 Avancerad Teori 12 7.1 3D-ytor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 7.2 Visualisering av 3D-ytor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 8 Tillämpning av Avancerad Teori 16 8.1 Kollisiondetektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 8.2 Kollision med friktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 8.2.1 Dynamiskt tillstånd och kvaternionform . . . . . . . . . . . . . . . . . . . . 17 8.2.2 Impulsbaserad kollisisonsmodell . . . . . . . . . . . . . . . . . . . . . . . . . 17 8.3 Visualisering av en kollision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 9 Slutsatser och Diskussion 20 Bilagor A Bevis för sats 6 23 B Superquadratics 24 C Kollsionsdetektion och restriktioner 25 D Visualiseringar 26 D.1 Blender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 D.1.1 Visualisering av figur: 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 D.1.2 Visualisering av figur: 7-9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 D.1.3 Visualisering av figur: 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 D.1.4 Visulaisering av figur: 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 D.1.5 Visualisering av figur: 15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 D.1.6 Visualisering av figur: 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 D.2 MatLab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 D.2.1 Visualisering av figur: 4 och 5 . . . . . . . . . . . . . . . . . . . . . . . . . . 32 D.2.2 Visualisering av figur: 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 D.2.3 Visualisering av figur: 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 D.2.4 Visualisering av figur: 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 1 Inledning Detta arbete utreder hur kvaternioner kan visualiseras och tillämpas. Kvaternionen är dock okänd för de flesta trots dess runt 170 år långa historia och att den idag tillämpas inom vida områden som datorgrafik, stelkroppsdynamik, signalbehandling, differentialgeometri, reglerteknik med mera. Kvaternionen har också gjort sig påmind inom kvantfysiken och noterbart är att James Clerk Maxwell först formulerade den klassiska elektromagnetismen med kvaternioner [1] [2]. Inget av de nämnda fälten är obskyrt eller saknar intressenter, snarare gäller det motsatta. Detta leder till åtminstone två frågor; Varför är kvaternionen så okänd? och Varför så användbar? Den förra besvaras kortfattat i kapitlet 4 om kvaternionens historia och den senare frågan har många svar eftersom kvaternionen har en mängd användbara och intressanta egenskaper. Denna rapport ämnar utreda några av dessa. En egenskap som tidigt upptäcktes var att kvaternionen kunde användas för att representera och visualisera orientering. Det är en nyttig egenskap som delvis förklarar dess användning i ovannämnda områden. Vi redogör för teorin som visar att kvaternionen har dessa egenskaper och även hur de kan användas för att förklara två företeelser som i rapporten benämns Boll- och Bält-Tricket. Inom tillämpningar används ofta alternativa metoder för att beskriva orientering och två sådana teoretiska verktyg är axel-vinkel framställningen och Eulers vinklar α, β och γ. Den förra beskriver kring vilken axel och vinkel ett referenssystem behöver roteras för avsedd orientering. Vardera Eulervinkel motsvarar rotationsvinkeln kring en basaxel i ett ortogonalt system. Kvaternionframställningen har två viktiga fördelar relativt båda metoderna (för än mer nyanserad jämförelse se kapitel 5.3). Kvaternionen kan tolkas som en funktion vars definitionsmängd utgörs av ramar (för definition se kapitel 5.2) och dess värdemängd av fyrdimensionella punkter vilket för det första tillåter entydig beskrivning av distansen/likheten mellan ramar och för det andra möjliggörs visualisering av rotationssekvenser [2]. En anledningen till att Boll- och Bält-Tricket studeras är för att visa på nyttan av dessa fördelar. Ytterligare en aspekt som utreds är kvaternionens förmåga att beskriva 3D-ytor. Detta är viktigt inom bl.a differentialgeometri och datorgrafik. Speciellt undersöks hur kvaternionramar och kvaternion-Gaussavbildning relaterar till egenskaper hos 3D-ytor. För att visa på ytterligare tillämpning av den presenterade teorin så avslutas rapporten med två kollisionssimuleringar. En del av den mer avancerade teorin appliceras i en algoritm för kollisionsdetektion och kropparnas orientering beräknas och visualiseras med hjälp av den grundläggande teorin, och programmet Blender som animerar kollisionen tillämpar dessutom kvaternionteori. Notera att kollisionssimuleringen i sig är inte är huvudintresset men för ett någorlunda praktiskt resultat har vi valt att inkludera friktion i kollisionsmodellen vilket ger verklighetstrogna resultat [3]. Avslutningsvis påpekas att detta arbete är en litteraturstudie mestadels influerad av boken Visualizing Quaternions av Andrew J. Hanson. Från denna text kommer stora delar av den presenterade teorin och ofta används samma notation. Texten rekommenderas för den som vill fördjupa sig i ämnet. 2 Förkunskap I rapportens första hälft behandlas grundläggande kvaternionteori och för att förstå denna är det en fördel att ha grundkunskaper inom linjär algebra, komplexa tal och flervariabelanalys. I rapportens andra hälft utreds mer avancerad teori och där är det nyttigt med grundläggande kunskaper inom differentialgeometri. För den som inte är bekant med differentialgeometri så rekommenderas läsaren att först läsa kapitel 19 och 20 i Visualizing Quaternions av Andrew J. Hanson. 1 3 Syfte Syftet är att visa hur kvaternioner och dess visualisering kan tillämpas. De tillämpningar som granskas är rotationsberäkning, Bält-tricket, Boll-tricket, beskrivning av 3D-ytor och kollisionssimulering. 4 Historia Vi kommer i detta avsnitt ge lite historik kring kvaternioner för att läsaren skall få en bakgrund till arbetet. Sir William Rowan Hamilton undersökte under början av 1800-talet möjligheterna att utvidga de komplexa talen. De komplexa talen består av en reell och en komplex del, vilket beskrivs i formen a+ bi där a, b tillhör de reella talen och där talet i är den imaginära delen. Hamilton hade arbetat med att generalisera de komplexa talen under några år och under en promenad med sin fru året 1854 fick han plötsligt idén att man kan genom att använda sig av regeln i2 = j2 = k2 = ijk = −1 utvidga de komplexa talen till fyra dimensioner, denna utvidgning är det vi kallar för kvanternioner. I samband med Hamiltons upptäckt så ställdes frågan om kvaternioner generaliserar komplexa tal, kan kvaternioner generaliseras ytterligare. Det visade sig vara möjligt att generalisera kvaternioner till åtta dimensioner, därav namnet octanioner eller dual-kvaternioner som de också benämns. Dual-kvaternioner kan beskrivas precis som kvaternioner men man använder sig av ett ordnat par aˆ = (a, b) istället som koefficienter. Det har sedan dess skett fler generaliseringar av kvaternioner men dual-kvaternioner är de mest användbara [2]. Hamilton förespråkade användandet av kvaternioner som standard notation för att beskriva tredimensionella vektoroperationer men kvaternioner ansågs vara en obekväm notation. Istället valdes Gibbs notation x = (x, y, z) som standardnotation för att beskriva en tredimensionell vektor. När kvantteorin för elektroner utvecklades under tjugohundratalet så blev det uppenbart att kvaternioner hade ett samband med spinorer (se kapitel 6.1) men istället valdes den alternativa notationen i form av en 2x2 matris, känd som Pauli matriser. Tidigt användes kvaternioner inom Aeronautik och astronautik men det blev framförallt populärt i samband med utvecklingen av tredimensionell datorgrafiken. Inom datorgrafiken behövde man vara precis med orienteringen för tredimensionella objekt och kameror, då insåg man problematiken med att använda sig av Eulervinklar (se kapitel 5.3.3). Problematiken med Eulervinklar innebar att man istället använde sig av kvaternioner som standardmetod för att beskriva orientering och rotation. Det ökade användandet av kvaternioner inom datorgrafiken innebar också att nyttjandet av kvaternioner ökade inom diverse tillämpningsområden [2]. 5 Grundläggande Teori och Notation I detta kapitel redogörs teori och notation som används genom hela rapporten. Läsaren rekommenderas att bekanta sig med notationen, detta för att undvika frågor som; Är det en vektor eller en skalär? Därefter följer ett avsnitt med några nyttiga definitioner och operationer relaterade till kvaternioner. I avsnitt 5.3 brukas dessa verktyg för att visa hur kvaternioner kan beskriva rotation och orientering. Det avslutande avsnitten ägnas åt metoder för att visualisera kvaternioner. 5.1 Notation Här ges den generella notationen som används. På ställen där specifik eller annan notation krävs så kommer det först att klargöras, detta gäller framförallt för kapitel 7 och 8. Men allmänt gäller nedanstående tabell. 2 Allmän Notation Skalär Skrivs kursivt, t.ex. a men det finns undantag. De imaginära enheterna be- nämns i, j och k och kvaternioner tecknas också kursivt, se nedan. Kvaternion Skrivs kursivt, speciellt är q reserverad men andra tecken kan användas som t.ex. p. Från kontext bör det vara enkelt att urskilja då en kvaternion eller skalär åsyftas. Vektor Fetstilad minuskel, t.ex. v Enhetsvektor Identifieras med en hatt t.ex. nˆ Matris Kursiv versal, t.ex. R 5.2 Räkneregler och Definitioner En kvaternion q består av en reell och tre imaginära komponenter. Explicit gäller alltså q = q0 + iq1 + jq2 + kq3 (1) där qi ∈ R, i ∈ 0, 1, 2, 3 där i2 = j2 = k2 = −1 ij = k, jk = i, ki = j ji = −k, kj = −i, ik = −j (2) [4]. Notera förhållandet mellan de imaginära enheterna i, j och k, de beter sig likt tre ortogonala enhetsvektorer. Detta är en nyttig egenskap eftersom en viss formalism tillåter implicit behandling av reglerna (2). Låt kvaternionen tecknas som en 4-vektor q = [q0, q1, q2, q3], eller q = [q0,q], där q är en 3-vektor (innehåller de imaginära komponenterna). Då kan operationerna kvaternionmultiplikation, -skalärprodukt och -konjungering i respektive ordning skrivas som nedan i ekvationerna (3), (4) och (5). Dessa bevisas enkelt med ekvation (1) och sambanden i (2) [2] [4] [5]. Multiplikation: p ? q = [p0, p1, p2, p3] ? [q0, q1, q2, q3] = [p0q0 − p · q, p0q + q0p + p× q] (3) Skalärprodukt: p · q = [p0, p1, p2, p3] · [q0, q1, q2, q3] = p0q0 + p · q (4) Konjungering: q¯ = [q0,−q1,−q2,−q3] = [q0,−q] (5) Vid kvaternionmultiplikation utelämnas hädanefter ? operatorn. För våra ändamål kommer det visa sig att endast normaliserade kvaternioner behöver betänkas (se avsnitt 5.3.1). I fortsättningen antas därmed att q20 + q 2 1 + q 2 2 + q 2 3 = 1. (6) Notera att talen q0, q1, q2 och q3 under begränsningen (6) beskriver ytan till en hypersfär vilket kommer utnyttjas för visualisering, se kapitel 5.4. Restriktionen leder även till att kvaternioninversen ges av dess konjungat [4]. Sats 1. qq¯ = [1, 0] = q¯q Bevis. qq¯ = [q0q0 + q · q,−q0q + q0q− q× q] = [q20 + q 2 1 + q 2 2 + q 2 3 , 0] = [1, 0] Nu följer några nyttiga definitioner och Eulers fundamentala sats om rotationer Definition 1. En enhetskvaternion är en normaliserad kvaternion. 3 Definition 2. Mängden Sd där d ∈ N innehåller ytpunkterna till en d+ 1-dimensionell sfär. Definition 3. En rotation definieras av rotationsaxel givet av normalvektor nˆ och en rotationsvinkel θ sådana att en vektor roterar kring nˆ med den givna vinkeln θ. Definition 4. En ram (eller orientering) definieras av tre inbördes ortogonala normalvektorer, säg xˆ, yˆ och zˆ. Om en rotation appliceras så fås en annan ram. Definition 5. En kvaternionram är en punkt q ∈ S3. Sats 2. Givet två ramar R1 och R2 så existerar en rotation sådan att R1 transformeras till R2. Ofta definieras orientering av en normalvektor men i denna rapport särskiljs inte ram och orientering [5]. Redan nu noteras att kvaternionramar (detta namn eftersom en kvaternion kan motsvara en ram) används för att visualisera rotationssekvenser som kurvor i S3, se kapitel 6 och 8.3. Till sist, innan vi går vidare definieras rena kvaternioner. Definition 6. Kvaternionen vars reella komponent är noll är en ren kvaternion [1]. 5.3 Rotation I inledningen och senare har det nämnts att kvaternioner har en förmåga att beskriva rotation och orientering och i detta avsnitt visas att så är fallet. Initialt granskas axel-vinkel-framställningen och hur den kan beskrivas av en kvaternion, samt en tolkning av kvaternionmultiplikation. Därefter härleds en kvaternionoperator som roterar rena kvaternioner följd av en redogörelse för Eulers vinklar och hur fenomenet Gimbal-lock uppträder. Avsnittet avslutas med en icke-rigorös jämförelse mellan de tre metoderna. 5.3.1 Rotation med kvaternioner i matrisform Om en kvaternion kan beskriva rotation bör den kunna relateras till en rotationsmatris därför reder vi först ut hur en vektor v = [v1, v2, v3] kan roteras kring en godtycklig axel nˆ = [n1, n2, n3]. Ett svar ges av axel-vinkel-modellen där rotationsaxeln och -vinkeln explicit anges, dess matrisform ges i nedanstående sats och bevis. Sats 3. Låt R(θ, nˆ) ∈ 3× 3 vara en rotationsmatris med rotationsaxeln nˆ och rotationsvinkeln θ. R(θ, nˆ) har då formen angiven av ekvation (7). R(θ, nˆ) =   c+ n21(1− c) n1n2(1− c)− sn3 n1n3(1− c) + sn2 n2n1(1− c) + sn3 c+ n22(1− c) n2n3(1− c)− sn1 n3n1(1− c)− sn2 n3n2(1− c) + sn1 c+ n23(1− c)   (7) där c = cos θ och s = sin θ [2]. Bevis. Vi antar att de elementära rotationsmatriserna (8) är kända: R(θ, xˆ) =   1 0 0 0 cos θ − sin θ 0 sin θ cos θ   , R(θ, yˆ) =   cos θ 0 sin θ 0 1 0 − sin θ 0 cos θ   , R(θ, zˆ) =   cos θ − sin θ 0 sin θ cos θ 0 0 0 0   . (8) En sekvens av ovanstående matriser söks, sådan att den önskade rotationen åstadkoms. För att finna en lämplig sekvens parametriseras nˆ med sfäriska koordinater: nˆ = [cosα sinβ, sinα sinβ, cosβ]. Låt nˆ′ beteckna en rotation av nˆ. Strategin är att genomföra ett basbyte sådant att ett av det nya systemets basaxlar är nˆ och därefter applicera en lämplig elementär rotationsmatris och sedan invertera basbytet. Detta är ekvivalent med att först rotera nˆ så nˆ′ = zˆ och därefter applicera R(θ, zˆ) och sedan invertera initiala rotationen så nˆ′ = nˆ. Låt nu v′ beteckna rotationen av v kring nˆ med vinkeln θ, från argumentet ovan och parametriseringen inses då att v′ = R(α, zˆ)R(β, yˆ)R(θ, zˆ)R(−β, yˆ)R(−α, zˆ)v. Och således 4 R(θ, nˆ) = R(α, zˆ)R(β, yˆ)R(θ, zˆ)R(−β, yˆ)R(−α, zˆ) =   c+ n21(1− c) n1n2(1− c)− sn3 n1n3(1− c) + sn2 n2n1(1− c) + sn3 c+ n22(1− c) n2n3(1− c)− sn1 n3n1(1− c)− sn2 n3n2(1− c) + sn1 c+ n23(1− c)   . För att visa att matrisen (7) beskriver en kvaternion används två variabelbyten. Dessa byten kan tyckas vara obefogade men i nästa avsnitt 5.3.2 ges en motivering och för än mer bakgrund hänvisas läsaren till texterna [2] [4]. Först, låt a = cos θ2 och b = sin θ 2 och notera c = a 2 − b2, s = 2ab samt 1− c = a2 + b2 − (a2 − b2) = 2b2 och resultatet blir R(θ, nˆ) =   a2 + b2(n21 − n 2 2 − n 2 3) 2b 2n1n2 − 2abn3 2b2n3n1 + 2abn2 2b2n1n2 + 2abn3 a2 + b2(n22 − n 2 3 − n 2 1) 2b 2n2n3 − 2abn1 2b2n3n1 − 2abn2 2b2n2n3 + 2abn1 a2 + b2(n23 − n 2 1 − n 2 2)   . Matrisen ovan kan i sin tur parametriseras med fyra variabler, q0, q1, q2 och q3: q0 = a = cos θ 2 , q1 = n1b = n1 sin θ 2 , q2 = n2b = n2 sin θ 2 , q3 = n3b = n3 sin θ 2 . Parametriseringen ovan definierar en enhetskvaternion, ty q20 + q 2 1 + q 2 2 + q 2 3 = cos 2 θ 2 + (n 2 1 + n 2 2 + n 2 3)sin 2(θ/2) = 1 [2]. Påståendet om enhetskvaternioner i avsnitt 5.2 är därmed motiverat. Enhetskvaternionen q = [cos θ 2 , sin θ 2 nˆ] (9) representerar därmed rotationsmatrisen R(θ, nˆ) och beskriver därför en ram vilken alstras genom rotation av referensramen kring nˆ med en vinkel 0 ≤ θ ≤ 4pi, upp till 4pi för att kunna representera alla rotationer. Givet en enhetskvaternion kan alltså motsvarande rotationsmatris R(q) skrivas som R(q) =   q20 + q 2 1 − q 2 2 − q 2 3 2q1q2 − 2q0q3 2q1q3 + 2q0q2 2q1q2 + 2q0q3 q20 − q 2 1 + q 2 2 − q 2 3 2q2q3 − 2q0q1 2q1q3 − 2q0q2 2q2q3 + 2q0q1 q20 − q 2 1 − q 2 2 + q 2 3   . (10) Notera att q och −q motsvarar samma matris vilket innebär att avbildningen är bilinjär, detta är en nackdel hos matrisrepresentationen, den tillåter skenbar likhet mellan två olika ramar (se kapitel 6.1). Nu undersöks närmare vad som sker för två fall av kvaternionmultiplikation, först produkten av två godtyckliga enhetskvaternioner sen produkten av (9) och en ren kvaternion qv = [0,v]. Låt nu t parametrisera en rotationssekvens längs x-axeln vilket innebär att sekvensen beskrivs av matrisen R(θt, xˆ) och kvaternionen q = [cos θt2 , sin θt 2 xˆ]. Notera nu att sekvensen kan skrivas som matrismultiplikation: R(θt, xˆ) = R(θtn, xˆ)R(θtn−1, xˆ)...R(θt1, xˆ) (där ∑n i=1 ti = t). Det visar sig att q(t) på samma vis kan beskrivas av kvaternionmultiplikation: q(t) = q(tn)...q(t1). Slutsatsen är att multiplikationen av två kvaternioner q1(θ1, nˆ1), q2(θ2, nˆ2) motsvarar matrisprodukten av R1(θ1, nˆ1) och R2(θ2, nˆ2) [2]. Operationen har en geometrisk tolkning som utreds i kapitel 6.2. Önskvärt vore att qv′ = qqv = [0, R(θ, nˆ)v], vilket skulle förenkla rotationsberäkningar men räkneexemplet nedan visar att detta inte är fallet [4]. Exempel: Låt θ = pi2 , nˆ = 1√ 2 [1, 1, 0] och qv = [0, 2, 0, 0]. qv′ = qqv = [−1, √ 2, 0,−1] Operationen resulterar inte i en ren kvaternion, vektordelen har inte roterats 45 grader kring nˆ och inte heller är normen bevarad (hos imaginärdelen). En slutsats från ovanstående är att 5 enhetskvaternionen q avbildar en ram given av en rotationsmatris till en punkt (q0, q1, q2, q3). I kvaternionrummet svarar då multiplikation mot ramrotation men inte mot vektorrotation. Härnäst utreds hur kvaternionmultiplikation kan användas för rotationsberäkningar av vektorer. 5.3.2 Rotation av en ren kvaternion I detta avsnitt söks en rotationsoperator som agerar på rena kvaternioner. Först preciseras två egenskaper en rotation kring en viss axel uppfyller. Låt v′ = fp(v) där fp är en rotationsoperator vilken roterar v kring en axel pˆ. För en rotation gäller då |v| = |v′| (11) (v − v′) · pˆ = 0 (12) Rotationsoperatorn är normbevarande och rotationsvektorn (v − v′) ligger i rotationsplanet. En insikt vi kommer använda är att reflektioner är rotationer vilket nedan bevisas [1]. Sats 4. Låt nˆ vara normalen till ett plan som innehåller origo. Låt v vara en godtycklig vektor så dim(v) = dim(nˆ). Vidare, låt α vara vinkeln mellan planet och vektorn v. För reflektionen v′ gäller v′ = v − 2nˆ(nˆ · v) (13) vilket är en rotation med rotationsvinklen 2α. v O v′ nˆ α α Figur 2: Ett plan med normal nˆ som innehåller origo. Vi ser också vinkeln α mellan planet och vektorn v. Vektorn v′ är reflektionen av v m.a.p planet. Bevis. Från figur 2 inses direkt att att rotationsvinkeln är 2α och v′ = v − 2nˆ(nˆ · v). Vidare gäller v′ · v′ = |v′|2 = |v|2 − 4 cosα+ 4 cosα = |v|2 ⇒ |v| = |v′| (v − v′) · pˆ = (v − v′) · (nˆ× nˆ) = 2nˆ(nˆ · v) · (nˆ× vˆ) = 0. Den sökta rotationsoperatorn kan möjligen härledas från en reflektion men för en given rotation måste ett lämpligt plan väljas (implicit i slutändan) vilket gör härledning relativt komplicerad. Om istället reflektionssekvenser studeras undgås komplikationen. Sats 5. Låt nˆ1 och nˆ2 definiera två plan genom origo och låt pˆ ge skärningen mellan planen: nˆ1 × nˆ2 = sin θ2 pˆ där θ 2 är vinkeln mellan planen: nˆ1 · nˆ2 = cos θ 2 . Om q1 = [0, nˆ1], q2 = [0, nˆ2] och q = q2q1 samt qv = [0,v] så gäller att operatorn f : f(qv) = qqvq −1 är en rotationsoperator med axeln pˆ och rotationsvinkeln θ [1]. 6 vnˆ1nˆ2 α θ 2 Figur 3: Vinkeln α representerar vinkeln mellan plan 1 (med normal nˆ1) och vektorn v som ska roteras genom att först reflekteras i plan 1 och sedan i plan 2 (med normal nˆ2). Vinkeln mellan planen är θ2 . Bevis. Direkt ur figur 3 och sats 4 inses att reflektionssekvensen ger en rotationsvinkeln 2α+ 2( θ2 − α) = θ. Härnäst studeras produkten q1qvq1. q1qvq1 = [0, nˆ1][−v · nˆ1,v× nˆ1] = [−nˆ1 · (v× nˆ1), (−n · nˆ1)nˆ1 + nˆ1×v× nˆ1] = [0,v−2nˆ1(nˆ1 ·v)] Här användes vektoridentiteten (a× b)× c = b(a · c)− a(b · c). Enligt sats 4 är produkten ovan en reflektion genom ett plan (innehållandes origo) med normalvektorn nˆ1. Den önskade rotationen fås nu genom att reflektera qv′ = q1qvq1 i plan 2 (ty, rotationsvinkeln är då θ), för den roterade kvaternionen qr gäller därmed qr = q2qv′q2 = q2q1qvq1q2 Det återstår att beräkna q = q2q1. q = q2q1 = [0, nˆ2][0, nˆ1] = [−nˆ2 · nˆ1, nˆ2 × nˆ1] = [− cos θ 2 ,− sin θ 2 pˆ] = [cos θ 2 , sin θ 2 pˆ] Notera att enligt sats 1 gäller q−1 = (q2q1)−1 = q −1 1 q −1 2 = q¯1q¯2 = q1q2. Med sats 5 är det möjligt att arbeta med rotationer i kvaternionrummet och vi ser nu också fog för de variabelbyten som användes i föregående avsnitt 5.3.1. 5.3.3 Rotation med Eulervinklar Eulers vinklar α, β och γ motsvarar rotationsvinklarna kring tre inbördes ortogonala axlar och därmed fås den resulterande matrisrepresentationen genom multiplikation av de elementära rotationsmatriserna (8). Men matrismultiplikation (och därmed rotation) är inte kommutativ vilket innebär att orienteringen givet (α, β, γ) ej är entydigt bestämd. Problemet löses genom att förelägga en rotationshierarki som bestämmer rotationsordningen, men tre möjliga axlar resulterar i 27 möjliga rotationshierarkier (XYZ, ZZY etc). Endast tolv av dessa kan representera en godtycklig rotation, ty frihetsgrader förloras då successiva rotationer sker kring samma axel [6]. Nedan betraktas hierarkin XYZ. Rxyz = R(α, xˆ)R(β, yˆ)R(γ, zˆ)⇒ Rxyz =   cosβ cos γ − cosβ sin γ sinβ sinα sinβ cos γ cosα cos γ − sinα sinβ sin γ − sinα cosβ − cosα sinβ cos γ + sinα sin γ sinα cos γ + cosα sinβ sin γ cosα cosβ   Låt nu β = ±pi2 vilket leder till Rxyz =   0 0 ±1 1 2 (sin (α± γ)± sin (α∓ γ)) cos (α± γ) 0 ∓ cos (α± γ) sin (α± γ) 0   = Rxyz(α± γ) Ändring av α eller γ leder till rotation kring samma axel och därmed är en frihetsgrad förlorad. Ett system som hamnar i sådan position förlorar därmed tillgång till en mängd orienteringar och det är detta fenomen som kallas Gimbal-lock. Fenomenet är en inneboende singularitet i Eulerframställningen vilket innebär att alla rotationshierarkier har detta problem [6]. Eulers vinklar är ändå vanliga inom tillämpningar och möjliga anledningar till detta utreds kortfattat i nästa avsnitt. 7 5.3.4 Matris- eller kvaternionform? Vi har nu redogjort för att orientering och rotation kan hanteras med matris- eller kvaternionoperationer. Det har också anmärkts att matrisrepresentationer med axel-vinkel och Eulervinklar ofta används inom tillämpningar vilket kan tyckas vara märkligt eftersom kvaternionrepresentationen kräver fyra tal och matrisrepresentationen nio. Eulerframställningen har dessutom en singularitet och en rotationshierarki att ta hänsyn till. Här följer en kort jämförelse mellan dessa metoder. I texten Visualizing Quaternions analyseras beräkningskomplexiteten för fem operationer, matris till kvaternion, kvaternion till matris, rotera en 3-vektor, rotera flera 3-vektorer och sammansatta rotationer. Författaren visar att kvaternionoperationer endast är fördelaktigt vid det sistnämnda fallet men att kvaternioner är nödvändiga vid beräkning av optimal interpolering mellan ramar (p.g.a entydigt distansmått, kvaternionkurvor). Av numerisk osäkerhet och stabilitet kan det också vara en fördel att använda sig av kvaternionoperationer eftersom matrisrepresentationen innehåller överflödig information och fler villkor beaktas då en rotationsmatris måste ortogonaliseras och normaliseras medan en kvaternionoperator enbart behöver normaliseras [2] [3] [5]. Ovanstående gäller allmänt för matris- kontra kvaternionoperationer så låt oss närmare granska Eulerframställningen. Till dess fördel är en lång historia av utbrett användande och därmed finns utvecklade och testade lösningar vilket förenklar implementering. I allmänhet lämpar sig också matrisrepresentationer bättre för andra transformationer som t.ex. skjuvning [5]. För vissa system, som t.ex. gyroskop är det dessutom naturligt att använda Eulervinklar. Nackdelen är att ytterligare två villkor måste beaktas, Gimbal-lock och rotationshierarkin. Det är även svårt, givet tre vinklar och en hierarki, att förutsäga den resulterande rotationen (se kapitel 6.2). Detta visar sig matematiskt genom att det är relativt komplicerat att beräkna rotationsaxeln och -vinkeln. Detsamma kan sägas om att beräkna Eulervinklarna givet en rotationsmatris [5]. Kvatenionframställningen har länge varit känd men ej använts lika utbrett och därför kan lösningar och implementeringar saknas till många problem eller så används de inte på grund av bristande kunskap vad gäller färdighet eller existens. Utöver redan nämnda fördelar är att kvaternionen ger en kompakt framställning vilket förenklar konstruktion och avläsning av rotation [2] [5]. 5.4 Visualisering Kvaternioner är fyrdimensionella objekt vilket försvårar visualisering men under restriktion (6) kan problemet lösas med projektion till tre dimensioner. Här betraktas och jämförs egenskaperna för två olika projektionsmetoder, stereografisk projektion och kvadratrotsmetoden. 5.4.1 Stereografisk projektion För att visualisera kvaternioner i 3D så behöver metoden ta bort en dimension vilket kan göras med stereografisk projektion. Innan metoden appliceras på enhetskvaternioner som ligger på hypersfären S3 så studeras projektionen av cirkeln S1 och sfären S2 på linjen respektive planet. Den generella strategin för stereografisk projektion av ett objekt O går till på följande vis: • Välj en projektionspunkt p0 ∈ O. I figur 4a och 4b valdes cirkelns och sfärens nordpoler. • Välj ett projektionsplan pi. I figur 4a och 4b valdes linjen y = 0 respektive planet z = 0. • Skärningspunkten mellan planet pi och linjen l = p0 + t(p− p0) ger den stereografiska projektionen av p ∈ O på pi. I figur 4a och 4b är några av dessa linjer blå- respektive rödmarkerade. • Projektionen av p0 definieras som punkten i oändligheten eftersom den annars saknar projektion. 8 Genom att studera figurerna 4a och 4b inses att det finns tre områden av intresse. Vid projektion av enhetscirkeln ser vi att norra halvcirkeln (y > 0) avbildas på |x| > 1 och södra halvcirkeln (y < 0) på |x| < 1. Till sist så har vi punkterna på ekvatorn (y = 0) som avbildas på sig själva, |x| = 1. Studium av projektionen av enhetssfären visar på samma vis att norra halvklotet (z > 0), det södra halvklotet (z < 0) och ekvatorn (z = 0) avbildas på områdena x2 + y2 > 1, x2 + y2 < 1 respektive enhetscirkeln x2 + y2 = 1. (a) (b) Figur 4: (a) Stereografisk projektion av enhetscirkeln på x-axeln. Figur: (b) Stereografisk projektion av enhetssfären på xy-planet. Nu kommer vi till att projicera enhetskvaternionerna q · q = 1 på det tredimensionella rummet av rena kvaternioner. Till skillnad från tidigare fall går det inte att direkt visualisera det projicerade objektet, men begränsningen (6) tillåter utläsning av alla komponenter. Likt de föregående fallen fås tre områden av intresse. Den norra halvan av (q0 > 0) hypersfären avbildas i klotet (q21 + q 2 2 + q 2 3 < 1), den södra halvan (q0 < 0) utanför klotet (q 2 1 + q 2 2 + q 2 3 < 1), och ekvatorn (q0 = 0) avbildas på enhetssfären (q21 + q 2 2 + q 2 3 = 1). Fördelen med metoden är förståelse för objektets struktur och hur kurvor på hypersfären rör sig från ena halvan till den andra. Nackdelen är förvrängda proportioner och former [2] [7]. 5.4.2 Kvadratrotsmetoden Kvadratrotsmetoden utnyttjar att ytan f(x1, x2, . . . , xn) = 0 kan skrivas om enligt xn = gi(x1, . . . , xn − 1) där de olika gi beskriver delytor. Givet en n-dimensionell yta behöver vi därmed specificera n-1 parametrar samt vilken av funktionerna gi som används för att bestämma den n:te parametern. Vilken delyta som visualiseras kan i en grafisk representation till exempel färgkodas. Hypersfären given q20 + q 2 1 + q 2 2 + q 2 3 = 1 skrivs nu som q0 = ± √ 1− (q21 + q 2 2 + q 2 3). Låt g1, g2 och g3 svara mot områden där q0 > 0, q0 < 0 respektive q0 = 0. Detta resulterar i två enhetsklot vars ytor (q0 = 0) överlappar. Vid denna omskrivning resulterar projektion av hypersfären i att enhetskvaternionens vektordel visualiseras som en punkt i enhetsklotet, men för att kunna utläsa fullständig information krävs även en indikation på tecknet för q0. I figur 5 nedan visas resultatet av denna metod applicerad på enhetscirkeln och enhetsfären. Kapitlet avslutas nu med jämförelse mellan de två projektionsmetoderna samt hur de kan komplementera varandra. Fördelen med kvadratrotsmetoden är att den i stora drag bevarar formen och proportionerna av en kurva på ytan men det är något svårare att visualisera vad som händer om kurvan ett flertal gånger går mellan sfärens två halvor. Att visualisera sådana kurvor i närheten av ekvatorn gör den stereografiska projektionen bra, men man bör ha i åtanke att den förvränger utseendet av kurvor beroende på var på sfären de befinner sig, särskilt kurvor som kommer nära p0 blir mycket utsträckta och därmed svåra att rita ut på liten yta [2]. 9 (a) (b) Figur 5: a) Projektion av enhetscirkeln på x-axeln med kvadratrotsmetoden: för x 6= ±1 g1 =√ 1− x2, g2 = − √ 1− x2 annars g3(±1) = 0. Avbildningarna visas med rött, blått och grönt i respektive ordning. b) Projektion av enhetssfären på xy-planet med kvadratrotsmetoden: för z 6= 0, g1 = √ 1− (x2 + y2), g2 = − √ 1− (x2 + y2) annars g3 = x2 + y2. Avbildningarna visas med rött, blått och grönt i respektive ordning. 6 Tillämpningar av Grundteorin Än så länge har vi granskat några av kvaternionens grundegenskaper och i detta kapitel ska dessa appliceras för att förklara två fenomen, Bält- och Boll-Tricket. Dessa företeelser kan inte förklaras genom användning av varken axel-vinkel-framställningen eller Eulers vinklar eftersom de saknar kvaternionens förmåga att beskriva rotationssekvenser. 6.1 Bält-Tricket Bält-tricket är ett vanligt exempel på hur rotationssekvenser kan beskrivas. Metoden för tricket lyder som följer: • Ett bälte läggs ut på en yta eller i rummet där båda ändar av bältet hålls fast. • Sedan roteras bältet ett helt varv (2pi) i en riktning, där ena sidan på bältet hålls fast. Därefter får bältet manipuleras för att invertera rotationen utan att orienteringen på ändarna får skilja sig från deras ursprungliga position. • Procedur ovan utförs därefter igen fast med en rotation på 4pi, i samma riktning. Det visar sig att med en 2pi-rotation kan problemet inte lösas men för 4pi är det möjligt att återgå till bältets startläge. Detta tar fram en viktig egenskap hos kvaternioner: spinorer [8]. Spinorer beter sig som vanliga vektorer i det komplexa rummet men när de roterar ett helt varv (2pi) runt en kropp, kommer vektorn direkt att snurra runt tillbaka till sitt ursprungsläge, en viktig förmåga för att kunna beskriva t.ex. spin hos elektroner. Figur 6 illustrerar detta exempel. Bält-tricket kan förklaras både matematiskt och med visualisering. Låt bältet representeras som en mängd av anslutna punkter i kvaternionrummet S3. Låt också t parametrisera kurvan i S3 längs en av sidorna på bältet, där t = 0 och t = 1 blir ändpunkterna på bältet [2] sådan att q(t) = q(w(t), x(t), y(t), z(t)) Vi kan rotera objektet i vardera riktning i 3D-rummet. Om vi låter y-axeln vara fixerad och roterar runt den med vinkeln θ längs axeln, fås att q(t) = (cos θt 2 , 0, sin θt 2 , 0) (14) Matematiskt : Sätt in θ = 2pi in i (14), vilket representerar ett helt varv av bältet runt y-axeln: 10 Figur 6: En representation av spinorer på ett Möbius-Band i Blender. Normalen till varje segmentyta visas av den blåa linjen. q(t) = (cospit, 0, sinpit, 0)⇒ { q(0) = (1, 0, 0, 0) q(1) = (−1, 0, 0, 0) (15) Vi ser från ekvationen ovan att ett fullt varv av bältet inte har samma slutposition som den började med, vilket medför att vi ej kan återgå till begynnelsetillståndet. Notera att kvaternionramarna q(0) och q(1) motsvarar samma rotationsmatris vilket betyder att information förloras i matrisrepresentationen. Låt istället θ = 4pi och sätt in i (14) q(t) = (cos 2pit, 0, sin 2pit, 0)⇒ { q(0) = (1, 0, 0, 0) q(1) = (1, 0, 0, 0) Därmed har vi en sluten kurva, där både start- och sluttillståndet befinner sig med samma orientation. Visualisering : För visualiseringen av tricket kommer spinorer, som togs upp tidigare i kapitlet, till bra hjälp. Spinorer och deras rotationer representeras oftast på formen av diskar samt riktningslinjer. I detta fall sätts radien till pi, vilket beskriver att varje rotation av multipeln pi blir längden mellan centrum och omkretsen av disken. En simpel demonstration av detta är att lägga bältet på ett bord. Vi kan dela upp disken i två segment, ett som beskriver rotationen parallellt till bordet och ett annat parallellt till bältet. Eftersom vi enbart ska undersöka en av rotationerna i spelet, tas vridningen parallellt med bältet som referens. Spinorernas axlar sätts fast längs den roterande änden hos bältet eftersom orienteringen skall vara densamma här efter att en rotation har genomförts. Figur 7 nedan visar spinorens funktion. (a) (b) Figur 7: Visualisering av rotationer med spinorer. Figur a) visar bältet i startposition utan någon vridning. I figur b) har bältet roteras med pi åt ett håll, där spinoren visar en pil i vågrätt led med längden pi. Den röda cirkeln markerar axeln som inte roteras i varje figur. Notera att en rotation i −pi-riktning hade gett en pil mot vänster istället för höger från referenspunkten. Således ger en 2pi-rotation två pilar som pekar i samma riktning, se figur 8 nedan. Givet en θ = 2pi-rotation kring y-axeln, ges följande tillstånd: Figur 8: En 2pi-rotation längs bältets längd med spinorens orientering. 11 I figur 8 avläses att spinoren inte befinner sig i mittcirkeln, vilket indikerar att bältet har fel orientering i rummet. Detta stämmer också överens med ekvation (15) i den matematiska delen som tyder på att vi inte har en sluten kurva. Däremot, som det nämndes innan, kommer spinorerna efter 2pi att flippa runt, det vill säga att de kommer byta riktning från höger till vänster. Då θ = 4pi, har vi den följande representationen: Figur 9: En 4pi-rotation längs bältets längd med spinorens orientering. Därmed fås samma orientering hos bältet efter en 4pi-rotation som i figur 7 a), eftersom enligt spinorerna tar riktningar ut varandra och man kommer fram till startpositionen. Detta kan ses som att en rotation av 4pi inte är en rotation alls och istället betraktas som en sluten kurva i kvaternionrummet S3. 6.2 Boll-Tricket Ännu ett exempel då ordningen av en sekvens rotationer har betydelse är det så kallade boll-tricket. Det går till på följande vis: • Placera en boll på ett bord och lägg handen på bollen parallellt med bordsytan. Låt bordsytan ligga i x,y-planet med z-axeln riktad uppåt, ut ur bordet. • Rör nu handen i små cirklar medurs och notera vad som händer med bollen. Bollen roterar långsamt moturs runt z-axeln som är ortogonal mot bordsytan trots att vi aldrig direkt roterar bollen runt den axeln. I figur 11 visualiseras projektionen av bollens orientering där dess begynneslseram svarar mot kvaternionen q[1,0]. I avsnitt 5.3.1 konstaterades att kvaternionmultipliktation motsvarade ramrotation, kurvan i figuren visualiserar därmed en sekvens av kvaternionmultiplikationer. Rotation medurs i xy-planet resulterar i sekvensen q[cos θ(t−dt)2 , sin θ(t−dt) 2 θˆ(t− dt)]...q[cos θdt 2 , sin θdt 2 θˆ(dt)]q[1,0] där θˆ(t) = sin θtxˆ− cos θtyˆ och θ en konstant liten rotationsvinkel. Detta märks ännu tydligare ifall bollen först roteras pi2 runt negativa y-axeln, följt av pi2 runt x-axeln och slutligen pi 2 runt y-axeln. Resultatet av den sekvens kan ses i figur 10. (a) (b) (c) (d) Figur 10: Visualisering av sekvensen av rotationer som refereras i exempel 2, färg och skiva indikerar orientering av bollen. Detta sker eftersom rotationer ej är kommutativa, annars hade den resulterande rotationen av det andra exemplet varit pi/2 runt x-axeln och kurvan i figur 11 hade varit sluten i q1q2-planet. Rotationer kring x- och y-axlarna kan ge upphov till rotation kring z-axeln vilket också kan inses med tillämpning av Eulers vinklar med rotationshierarkin YXY, se avsnitt 5.3.3 [2]. 7 Avancerad Teori I detta kapitel undersöks mer avancerade egenskaper hos kvaternionen och hur dessa kan visualiseras. Speciellt utforskas kvaternionens relation till 3D-ytor. 12 Figur 11: Kvaternionkurvan för långsam cirkulär rörelse med projektionen av kvaternionramens imaginärdel. Lägg märke till att kurvan ej är sluten och sträcker sig i q3-led vilket betyder att bollens orientering roterats i z-led. 7.1 3D-ytor I detta avsnitt utreds hur 3D-ytor kan beskrivas med kvaternioner. Vi kommer använda oss av kvaternionramar (se avsnitt 5.2) för att beskriva 3D-ytorna. Kvaternionramar ger oss möjligheten att beskriva alla typer av ytor och samtidigt karaktärisera ytans textur, vilket generar diverse användningsområden. Mer precist kommer vi i denna rapport endast behandla släta differentierbara 3D-ytor. Teorin som presenteras nedan kan även justeras för att utvidgas till fyra dimensioner [2]. Vi använder oss av rotationsmatrisen Rq (10) och rena kvaternioner för att få de exakta komponenterna av Rq, vilket är qvq¯ = q(0,v)q¯ = (0, Rqv). Vi använder sambandet mellan 3× 3 matrisen Rij och en godtycklig kvaternion q enligt: Rq(V)i = ∑ j RijV j = q(0, V i)q−1. Varje ortonormal ramkomponent kan beskrivas som en kolumn av Rij och en godtycklig ram fås då genom att applicera sats 5 på de tre kartesiska axlarna (representerade med rena kvaternioner): Tˆ1 = q(0, xˆ)q−1, Tˆ2 = q(0, yˆ)q−1, Nˆ = q(0, zˆ)q−1. (16) Vi skriver det som en matris av kvaternioner i kvadratisk form där ramvektorerna är kolumner. [ [Tˆ1] [Tˆ2] [Nˆ] ] = Rq. (17) Genom att ta differentialen och använda oss av hastighets normaliseringen v(t) = ‖x′(t)‖ så kan kvaterniondifferentialen skrivas som:     q′0 q′1 q′2 q′3     = v(t) 1 2     0 −kx −ky −kz kx 0 kz −ky ky −kz 0 kx kz ky −kx 0     ·     q0 q1 q2 q3     . (18) Om k = 2(q0dq− qdq0 − q× dq) får vi: dTˆ1 = q(0,k× xˆ)q−1, dTˆ2 = q(0,k× yˆ)q−1, dNˆ = q(0,k× zˆ)q−1. (19) 13 Nu har vi formulerat ramekvationer med kvaternioner och dessa kan användas för att beskriva egenskaper hos 3D-ytor. Först skall vi studera en parameterrepresentation av ytor på klassiskt vis: [ ∂Nˆ(u, v) ∂u ∂Nˆ(u, v) ∂v ] = [ Tˆ1(u, v) Tˆ2(u, v) ] [κ] , (20) Egenvärdena till matrisen [κ] är ytans huvudkrökningar k1 och k2, det vill säga den maximala och minimala krökningen i en given punkt. Då är K = det [κ] = k1k2 vår Gauss-krökning och H = 12 tr [κ] = k1+k2 2 är den genomsnittliga krökningen [2]. För att beskriva samma ytegenskaper som ovan men med kvaternioner så används uttrycket för differentialen (18) och ramparametriseringen (a,b): qu ≡ ∂q ∂u = 1 2q(0,a), qv ≡ ∂q ∂v = 1 2q(0,b). Vi kan nu skriva om ekvation (20) med kvaternioner för att beskriva krökningen, vi använder standardnotation från differentialgeometrin där K och H är lokala krökningar. Därmed kan de lokala krökningarna skrivas i termer av ett godtyckligt oberoende linjärt par av vektorfälten (U,V) som DUNˆ×DVNˆ = K(U×V), (21) DUNˆ×V + U×DVNˆ = 2H(U×V), (22) där U = xu · 5 och V = xv · 5. Genom att använda ekvationerna (21), (22), kvaternionidentiteten Iˆ = (1,0) = q(1,0)q−1 och (16) får vi: quq −1 v = − 1 4 q(0,a)(0,b)q−1 = − 1 4 q(−a · b,a× b)q−1 = − 1 4 [−a · bIˆ + (a× b)xTˆ1 + (a× b)yTˆ2 + (a× b)zNˆ1. (23) koefficienten framför Nˆ är vår Gauss-krökning (a× b)z = K. Den genomsnittliga krökningen ges på likande vis av: q(0, xˆ)q−1u + q(0, yˆ)q −1 v = − 1 2 q(−xˆ · a− yˆ · b, xˆ× a + yˆ × b) = − 1 2 [ −(ax + by )ˆI + bzTˆ1 − azTˆ2 + (ay − bx)Nˆ ] . (24) där (ay − bx) = tr[κ] = 2H är uttrycket för vår genomsnittliga krökning. Projektionen mot normalens Nˆ riktning av våra ekvationer (23) och (24) ger oss vår Gauss- och genomsnittliga krökning: K = det [ ay(u, v) −ax(u, v) by(u, v) −bx(u, v) ] = axby − aybx, H = 1 2 tr [ ay(u, v) −ax(u, v) by(u, v) −bx(u, v) ] = 1 2 (ay − bx). Vi kan även utöka liknande ekvationer till 4D genom vår differens (18) [2]. 7.2 Visualisering av 3D-ytor Vi vill nu visualisera teorin från avsnitt 7.1. Vi kommer använda oss av Gaussavbildning för att avbilda kvaternionramar. Gaussavbildning är i stora drag en nätmaskindelning av en enhetssfär där varje knutpunkt är normalens riktning av motsvarande nod på en indelad yta. Ramar behöver inte användas för att genomföra en Gaussavbildning utan det skulle vara tillräckligt att använda enbart ytans noder och normaler, men då försvinner en del egenskaper. En central 14 egenskap är möjligheten att applicera egenskaper på ytan, exempelvis en textur. Dessutom kan man alltid vid givet koordinatsystem konvertera systemet till kvaternionramar och därmed erhålla egenskaperna hos kvaternioner. Eftersom den klassiska beskrivningen av ramar och projektionen av koordinaten befinner sig i samma rum som kvaternionramarna, båda planen är nämligen vinkelrätta med zˆ−axeln [2]. Innan kvaternioner tillämpas för Gaussavbildning ges först den klassiska definitionen av Gaussavbildning: Definition 7. Låt S ⊂ R3 vara en yta med en orientering N. Avbildningen N : S → R3 tar sina värden i enhet 2-sfären S2. Avbildningen N : S → S2 kallas Gaussavbildning av ytan S [9]. Vi kan använda oss av att Gaussavbildningen är differentierbar i punkten p ∈ S och att dNp : TpS → TN(p)S2 är en linjär avbildning för att få informationen om krökningen. Vi vet att vi då befinner oss i ett delrum av R3 och att Tp = tN(p)S2. Därmed kan vi skriva dNp : TpS → TpS. Informationen om krökningen av en yta ges då av diffrentieringen av normalen som i (20) [9]. Vi ska nu beskriva hur man kan använda Gaussavbildning med kvaternioner. Det är dock en komplicerad process att differentiera Rq som vi gjorde med den klassiskt beskrivna ramen eftersom Rq är kvadratisk och samtidigt består av alla kvaternionkomponenter. Istället används en projektion till ett delrum av kvaternionrummet baserat på bilinjäriteten av kvaternioner på rena vektorer genom att använda oss av exempelvis Hopf avbildning, vilket är ett sätt att beskriva S3 med hjälp av cirklar och en vanlig sfär. Vi kan alltså använda oss av delar för att konstruera hela vår avbildning. Dessa delar är så kallad lappytor och ur klassisk avbildningsteori fås att det behövs åtminstone två separata lappytor för att kunna placera en komplett mängd av koordinater. För kvaternion-Gaussavbildning så använder man kvaternionramar istället för koordinater, därmed gäller att för varje punkt x av en lappyta så har vi en avbildning som går från vår lappyta till S3. Relationen mellan två kvaternionramar q och q′ av två närliggande lappytor U och U ′ ges av kvaternionmultiplikation med en övergångsfunktion t: q′ = tq. Detta ger oss en explicit övergångsfunktion mellan två lappytor. Det är ett liknande tillvägagångssätt för att beskriva en komplett avbildning, men då måste man också ta hänsyn till den explicita relationen mellan kvaternionramar för varje lappyta som de delar i varje punkt. En sådan relation kan beskrivas enligt: t(θ) = qytlapp1(θ)q −1 ytlapp2 (θ) där varje punkt som lappytorna delar med varandra, d.v.s. U ∩ U ′ är parametriserad av θ. Det finns olika optimeringsstrategier för hur man ska välja ramar och i sin tur lappytor för att exempelvis ta bort onödiga vridningar och vändningar av formen. Intuitivt kan man tänka sig att man vill minimera antalet vridningar som ramkurvan behöver ta sig från startpunkten på ramen till slutpunkten på ramen. Denna strategi kallas för Minimal längd och area strategin och visualiseras i figur 12. 15 Figur 12: Exempel: En sfär uppdelad i två ytlappar, en sydpol och en nordpol, med Minimal längd och area strategin. 8 Tillämpning av Avancerad Teori I detta kapitel tillämpas kvaternionteorin i en kollisionssimulering. För att kunna använda teorin ovan så begränsar vi oss till kollisioner mellan konvexa former. Läsaren påminns om att vårt syfte inte är att producera en effektiv kollisionsalgoritm utan att visa hur kvaternioner och dess visualisering kan tillämpas. 8.1 Kollisiondetektion Vi använder oss av Minkowski-differensen för att se om två konvexa former är i kollision. Vi börjar med att definiera Minkowski-differensen: Definition 8. Låt A och B vara två konvexa objekt. Minkowski-summa av A och B, A,B ∈ R3 : A⊕B = {a+ b|a ∈ A, b ∈ B} Om vi sätter −B = {−b|b ∈ B} så får vi Minkowski-differensen: A B = A⊕ (−B) = {a− b|a ∈ A, b ∈ B} . Vi uppmärksammar att Minkovski-differensen B A också är en konvex form, N , vilket ger att om följande villkor är uppfyllt så har vi en kollision. NB A(n) = NB(n)−NA(−n). Vi ser då att om det sker en kollision så måste NB A(n) innehålla minst en punkt [10]. Anmärkning: Vi kan använda diverse metoder för att beskriva konvexa former, ett alternativ är Superquadratic, se appendix B. 16 Figur 13: Exempel: En visualisering av två Superquadratic objekt, vars Minkowski-differens inne- håller minst en punkt. Dessutom är normalerna visualiserade. 8.2 Kollision med friktion Det vore enklare att undersöka friktionsfri kollision till skillnad från med friktion, eftersom det då är möjligt att direkt lösa för kollisionskraften men vid makroskopiska kollisioner ger detta ej verklighetstrogna resultat [3] [11]. Å andra sidan är det svårt att beräkna kraften för kollision med friktion. En lösning som nedan redovisas ges av en metod utvecklad av Brian Mitrich som istället för kraft beräknar impulsen [11]. Det är dock de inblandade kvaternionerna som ska visualiseras, inför simulering är det därför lämpligt att beskriva en kropps dynamiska tillstånd i termer av kvaternioner. 8.2.1 Dynamiskt tillstånd och kvaternionform Betrakta ett dynamiskt tillstånd x(t): x(t) =     rcm(t) R(t) v(t) ω(t)     (25) där rcm är masscentrumposition, R orientering, v(t) hastighet och ω vinkelhastighet. Tillståndet innehåller alltså all nödvändig information för kollisionsdetektion och kollisionssimulering. För att studera tillståndets beteende i kvaternionrummet översätts alla variabler till kvaternionform. Alltså, vektorerna representeras av rena kvaternioner och orienteringen (rotationsmatrisen) av korresponderande enhetskvaternion: xq(t) =     qcm(t) q(t) qv(t) qω(t)     (26) där qcm(t) = [0, rcm(t)], qv(t) = [0,v(t)], qω(t) = [0,v(t)] och R(t) = R(q(t))→ q(t). Om tillståndets komponenter normaliseras så kan de visualiseras (se kapitel 5.4). 8.2.2 Impulsbaserad kollisisonsmodell Modellen presenteras genom en sats vars bevis läsaren finner i appendix eller i artiklarna [11] [13]. Modellen baseras på tre antaganden vilka först presenteras och därefter följer satsen. Antagande 1: Infinitesimal kollisionstid Antagandet tillåter att kropparnas rörelse behandlas som konstant under kollisionsförloppet. Rimligt eftersom kroppsrörelsen ofta är försumbar under kollisionstiden. Antagande 2: Poissons hypotes 17 Kontaktytan upplever vid kollision en kompression- och en expansionsfas, den totala impulsen p antas vara relaterad till kompressionsimplulsen pk enligt p = (1 + )pk (27) där  är restitutionkoefficienten. Modellen kommer från empiriska test [13]. Antagande 3: Coulombfriktion För en friktionskoefficent µ, en friktionskraft ff och kollisionpunktens tangethastighet ut antas det vid glidning gälla ut 6= 0⇒ ff = −µfnuˆt (28) och vid rullning ut = 0⇒ |ff | ≤ −µ|fn|. (29) Dessa relationer är härledda från experiment. Sats 6. Vid en stelkroppskollision under antaganden 1,2 och 3 fås förändringen av en kropps dynamiska tillstånd genom att integrera av ekvation (30) vid glidning och ekvation (31) vid rullning[13]. ∆u′ =   u′x(pz) u′y(pz) u′z(pz)   = M     −µ ux(pZ)√ u2x(pZ)+u 2 y(pZ) −µ uy(pZ)√ u2x(pZ)+u 2 y(pZ) 1     = Mp ′. (30)   0 0 u′z   = M   α β 1   (31) där ∆v(pz) = 1 m p(pz) (32) ∆ω(pz) = J −1(r × p(pz)). (33) Där α2 + β2 ≤ µ2 och integrationen görs m.a.p på impulsen pz, koordinatsystemet är valt så att z-riktningen är parallell med normalriktningen vid kollisionspunkten och matrisen M beror på massan och massfördelningen hos kropparna. För beräkning av matrisen M hänvisas läsaren återigen till appendix eller till artiklarna [11] [13]. Kollsisionsdetektionen beskriven i föregående kapitel används även till att finna kollisionssystemet, d.v.s kvaternionen vilka xyz-riktningar som korresponderar mot pz, ux, uy och uz. Därefter integreras ekvationerna ovan numeriskt tills uz = 0, då är kompressionsfasen över och enligt antagande gäller pzf = (1 + )pz, integrationen fortsätter alltså tills pz = pzf och vi får till slut den totala impulsen p(pzf )(från ekvation (30) och (31)) vilken används i ekvationerna (35) och (36) för finna kropparnas nya hastighet och vinkelhastighet. 8.3 Visualisering av en kollision I detta avsnitt visualiseras två kollisioner genom simulering med hjälp av teoribeskrivningen från avsnitt 8.2. En kollision mellan två sfärer med samma egenskaper men olika begynnelsetillstånd. En andra simulering gjordes för en sfär som kolliderar mot ett plan (se figur 15). Kvaternionen svarande mot sfärens orientering ses i figur 14. En kortfattad beskrivning på hur vi genomfört vardera simulering samt kod kan avläsas i Appendix C respektive D.1.5 och D.1.6. 18 Figur 14: Orienteringen hos sfären med kollision mot ett plan. Den blåa linjen representerar banan innan kollisionen (röda punkten) och den streckade är vad som sker efter kollisionen med planet. Notera att kurvans riktningsförändring innan och efter kollisionen beror på kollision med golvet. (a) (b) (c) Figur 15: Simulering av en kollision mellan ett plan och en sfär. Figur a) visar startpositionerna medan i b) sker kollisionen. Figur c) visar vad som sker efter kollisionen har genomförts. 19 (a) (b) (c) Figur 16: Simulering av en kollision mellan två sfärer. Figur a) och b) visar objekten precis innan och under kollisionsmomentet. I figur c) har kollisionen utförts. 9 Slutsatser och Diskussion Resultatet av denna litteraturstudie visar att kvaternioner kan användas för att beskriva rotation och orientering samt att de kan vara mer lämpliga att använda än Eulervinklar. En anledning till detta är Eulervinklarnas inneboende singularitet kallad Gimbal-lock, som kvaternionframställningen inte delar. Det finns dock tillämpningar för att använda Eulers vinklar då rörelsen är begränsad. Matrisoperationer är ofta mer effektiva vilket resulterar i att det kan vara fördelaktigt att växla mellan metoderna. Kvaternionen avbildar rotationsmatriser (eller ramar) till punkter vilket gör det möjligt att definiera ett entydigt likhetsmått (distansen i S3), och rotationssekvenser avbildas som kurvor. Dessa egenskaper tillåter oss att förstå fenomen Bält- och Boll-tricket men det finns mer kraftfulla tillämpningar av dessa egenskaper som vi inte utrett. Ett exempel gäller att finna en optimal eller differentierbar rotationssekvens mellan två ramar, vilket kan göras genom att studera och interpolera kvaternionkurvor. Detta är viktigt inom animation för att skapa mjuka rörelser. För att visualisera kvaternioner studerades två typer av projektion till tre dimensioner, stereografisk projektion och projektion med kvadratrotsmetoden. Kvadratrotsmetoden bevarar formen och proportionerna bättre men kan samtidigt vara mer komplicerad att visualisera i jämförelse med stereografisk projektion. Användning av kvaternioner inom differentialgeometri kan vara fördelaktigt för att beskriva komplexa ytor, då användandet av kvaternioner erhåller de fundamentala fördelarna med kvaternioner. Dessutom kan teorin utvidgas till fyra dimensioner på ett naturligt sätt, då kvaternioner i grunden är fyrdimensionella. Kvaternion-Gaussavbildning avbildar komplexa kvaternionramar genom användning av så kallade lappytor. Tillämpningen av kvaternioner inom differentialgeometrin fastställer fördelaktiga avseenden med kvaternioner, mer specifikt i sammanhang av rapportens syfte; visualisering och användning. Syftet med denna rapport var att åskådliggöra tillämpning och visualiserng av kvaternioner vilket har gjorts men ingen ny kunskap har presenterats. Kvaternionen har en lång historia och är ett pågående forskningsfält och därmed är kunskapen förmedlad i denna rapport mycket begränsad. 20 Referenser [UR] Utformning av rapporter och kandidatarbetens skriftliga presentation för Civilingenjörsprogrammen vid Chalmers tekniska högskola. 2008. Göteborg: Chalmers Tekniska Högskola. [1] Coutsias E, Romero L. The Quaternions with an application to Rigid Body Dynamics [Internet]. New Mexico: Department of Mathematics and Statistics; 1999. Hämtad från: http://www.ams.stonybrook.edu/ coutsias/papers/rrr.pdf. [2] Andrew J. Hanson. Visualizing Quaternions: Series in interactive 3D technology. San Francisco: Morgan Kaufmann Publishers; 2006. [3] Wang H. Rigid Body Dynamics [Opublicerat material]. Hämtad från: http : //web.cse.ohio− state.edu/ wang.3602/courses/cse3541− 2017− fall/rigidnote.pdf (2017). [4] Vince J. Quaternions for Computer Graphics. 1 ed. New York: Springer; 2011. [5] Dam E, Koch M, Lillholm M. Quaternions, Interpolation and Animation. Köpenhamn: Deparment of Computer Science, University of Copenhagen; 1998. [6] Sciliano B, Sciavicco L, Oriolo G. Robotics - Modelling, Planning and Control. 1 ed. London: Springer; 2010. [7] Eater B, Sanderson G. Visualizing quaternions, An explorable video series;2018 [citerad 2020-05-14]. Hämtad från: https://eater.net/quaternions [8] Mark Staley. Understanding Quaternions and the Dirac Belta Trick [Internet]. New York: Cornell University; 2010. Hämtad från: https://arxiv.org/abs/1001.1778?context=physics. [9] Kamberova, George & Kamberova, Gerda. Recovering Surfaces from the Restoring Force [Internet]. New Jersey & New York: Stevens Insitue of technology & Hofstra univerisy; 2004. Hämtad från: https : //cs.hofstra.edu/courses/2004/spring/csc120/01/reappt/paper702printoptimized.pdf . [10] Jacobs, Scott. Game Programming Gems 7. Course Technology; 2008. [11] Mirtich B, Canny J. Impulse-based Simulation of Rigid Bodies [Internet]. California: University of California at Berkeley; 1995. Hämtad från: https://graphics.stanford.edu/courses/cs468-03-winter/Papers/ibsrb.pdf. [12] Laura Downs. A Proof of the Quaternion Rotation Representation. Berkeley EECS. 2003 (2019-03-02). [13] Mirtich B, Canny J. Impulse-based Dynamic Simulation [Internet]. California: University of California at Berkeley; 1995. Hämtad från: https://graphics.stanford.edu/courses/cs468-03-winter/Papers/ibds.pdf. [14] Barr, Alan. Superquadrics and Angle-Preserving Transformations in IEEE Computer Graphics and Applications, vol. 1, no. 1, Jan. 1981, doi: 10.1109/MCG.1981.1673799. 21 Bilagor A Bevis för sats 6 23 B Superquadratics 24 C Kollsionsdetektion och restriktioner 25 D Visualiseringar 26 D.1 Blender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 D.1.1 Visualisering av figur: 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 D.1.2 Visualisering av figur: 7-9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 D.1.3 Visualisering av figur: 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 D.1.4 Visulaisering av figur: 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 D.1.5 Visualisering av figur: 15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 D.1.6 Visualisering av figur: 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 D.2 MatLab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 D.2.1 Visualisering av figur: 4 och 5 . . . . . . . . . . . . . . . . . . . . . . . . . . 32 D.2.2 Visualisering av figur: 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 D.2.3 Visualisering av figur: 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 D.2.4 Visualisering av figur: 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 22 A Bevis för sats 6 Bevis. Notation för att kunna särskilja de olika kropparna och deras tillstånd vid kollisionsögonblicket. Ett heltals index i används för att beteckna tillståndsvariabeler tillhörnandes t.ex. kropp 1. mi = Massan för kropp i. J i = Tröghetsmatris för kropp i. vi = Hastighet för masscentrum för kropp i. ui = Hastighet för kontaktpunkt för kropp i. ri = Kontaktpunktposition relativt masscentrum för kropp i. ωi = Vinkelhastighet för kropp i. p = Total impuls. På grund av antagande 1 räcker det att studera ∆ui d.v.s hur hastigheten för kontaktpunkterna på respektive kropp förändras, vilket görs med en kollisionsparameter γ. Vi låter γ = pz där pz är den totala impulsen i normalriktningen, notera att initialt gäller γ = pz = 0 och att den kontinuerligt ökar under kollisionen. Vid kollisionsögonblicket gäller att ui = vi + ωi × ri. (34) och för förändringen vid γ. ∆ui(γ) = vi(γ)− vi(0) + ωi(γ)× ri(γ)− ωi(0)× ri(0) = 1 mi (pi(γ)− pi(0)) + J −1 i (γ)(ri × pi(γ))− J −1 i (0)(ri × pi(0)) = 1 mi pi(γ) + J −1 i (ri × pi(γ)) = ( 1 mi I − r×i J −1 i r × i )pi(γ) Där r×i =   0 −riz riy riz 0 rix −riy rix 0   och notera att J i och ri enligt antagande 1 är konstanta och oberoende av γ, samt att p(0) = 0. Vidare har vi ∆u = u1 − u2 = ( 1 m1 I − r×1 J −1 1 r × 1 )p1(γ)− ( 1 m2 I − r×2 J −1 2 r × 2 )p2(γ) = M(p1 − p2) = M∆p Det gäller alltså att ∆u′ = Mp′ ∆vi(γ) = 1 m (p(γ)− p(0) = 1 m p(γ) (35) ∆ω(γ) = J−1(r × p(γ)). (36) Från antagande 3 inses att två fall behöver behandlas. Vi börjar med glidning. Låt θ(pz) = arg(ux + iuy), alltså vinkeln för glidriktningen i kollisionskoordinat. Det gäller att p′x = dpx dpz = dpx dt dt dpz = fx 1 fz 23 och p′y = dpy dpz = dpy dt dt dpz = fy 1 fz . p′z = dpz dpz = 1 Enligt antagande 3 fx = −(µ cos θ)fz ⇒ p ′ x = −µ cos θ fy = −(µ sin θ)fz ⇒ p ′ y = −µ sin θ. Alltså har vi   u′x u′y u′z   = M    −µ ux√ u2x+u 2 y −µ uy√ u2x+u 2 y 1    . (37) I fallet för rullning gäller u′x = u ′ y = 0⇒   0 0 u′z   = M   α β 1   Enligt antagande måste det gälla att |ff |2 = α2 + β2 ≤ µ2. B Superquadratics Superquadratics är en samling av geometriska 3D-former med definierade huvudaxlar. Den implicita formen för superquadratics är: |x|r + |y|s + |z|t = 1 där r, s, t ∈ R+ bestämmer den geometriska formen. Vi kan även införa skalärer för varje respektive axel och får då för A,B,C ∈ R : ∣ ∣ ∣ x A ∣ ∣ ∣ r + ∣ ∣ ∣ y B ∣ ∣ ∣ s + ∣ ∣ ∣ z C ∣ ∣ ∣ t = 1. vi parametrisera ekvationen med parametrarna u och v, där −pi2 ≤ v ≤ pi 2 och −pi ≤ u < pi, och får då: x(u, v) = Ag ( v, 2 r ) g ( u, 2 r ) , y(u, v) = Bg ( v, 2 s ) f ( u, 2 s ) , z(u, v) = Cf ( v, 2 t ) , där f och g är våra axelfunktioner definierade som: f(ω,m) = sgn(sinω)| sinω|m, g(ω,m) = sgn(cosω)| cosω|m . Genom teorin presenterad ovan så kan vi genera olika typer av formar som tillhör gruppen av Superquadratics [14]. 24 C Kollsionsdetektion och restriktioner Kollisionsdetektion Genom att använda oss av två objekt i Blender så kan vi använda oss av radien på våra sfärer, vilket i detta fall är 30 cm, samt längden på planet för att upptäcka om det sker en kollision med en kollsionsmarginal på 0 mm, eftersom vi har en exakt beskrivning av ytan på sfären via radien. Om vi valt en annan form på våra konvexa objekt hade Blender approximerat ytan runt våra objekt, vilket gör att vi inte får en lika verklighetstrogen simulering. Restriktioner I första simuleringen tilldelar vi alla sfärer en massa på 4kg och sätter objekten 3m ifrån varandra. I simuleringen så har vi antagit en friktionskoefficient på 0.25. Nästa steg är att beräkna de krafter vi vill ska påverka våra objekt och vi har använt Newtons gravitationskraft F = Gm1m2r2 . Vi kan approximera gravitationen på jorden till m · 9, 80665. Vi har dessutom använt två ytterligare krafter. En kraft F1 = 600 N som påverkar sfär 1 i riktning mot sfär 2 och en kraft F2 = 600 N som påverkar sfär 2 mot sfär 1. Krafterna avtar i enlighet med 1/rF . Genom att i simuleringen använda oss av en gravitation som flyttar objekten ner och samtidigt en kraft som flyttar objekten i respektive riktning så kommer vi naturligt få en rotation i i q1− och q2-riktningen. Den andra simuleringen följer den första simuleringens premisser. Skillnaden från den första simuleringen är att kollisionen sker med ett plan. Planet är ett passivt objekt, vilket innebär att planet är fixerat för att kunna representeras som en vägg i verkligheten. Simuleringen utfördes så att det endast sker en kollision mellan planet och sfären. Orienteringen för sfären under simuleringen kan avläsas i figur 14. 25 D Visualiseringar D.1 Blender Kommandon och filer för visualiseringar som genomförts med Blender finns nedanför. Vi har valt att skriva med alla kommandon som gjorts i Blender och dessutom har vi laddat upp filerna på GitHub för att läsaren på ett smidigt sätt skall få tillgång till filerna. Alternativt: https://github.com/dunderlime/Visualisering-med-kvaternioner D.1.1 Visualisering av figur: 6 1 bl_info = { 2 "name": "Visualisering av Mobius -strip" 3 "author" "Philip Karlsson", 4 "version": (1,0), 5 "blender": (2,80,0), 6 7 } 8 9 import bpy 10 11 bpy.ops.object.empty_add(type=’ARROWS ’, location =(0, 0, 0)) 12 bpy.context.object.rotation_mode = ’QUATERNION ’ 13 bpy.context.object.rotation_quaternion [0] = 0.707 14 bpy.context.object.rotation_quaternion [1] = 0 15 bpy.context.object.rotation_quaternion [2] = 0 16 bpy.context.object.rotation_quaternion [3] = 0.707 17 18 plane =bpy.ops.mesh.primitive_plane_add(location =(0, 0, 0)) 19 bpy.context.object.scale [0] = 1 20 bpy.context.object.scale [1] = 8 21 bpy.context.object.scale [2] = 1 22 bpy.ops.object.editmode_toggle () 23 24 def view3d_find( return_area = False ): 25 for area in bpy.context.window.screen.areas: 26 if area.type == ’VIEW_3D ’: 27 v3d = area.spaces [0] 28 rv3d = v3d.region_3d 29 for region in area.regions: 30 if region.type == ’WINDOW ’: 31 if return_area: return region , rv3d , v3d , area 32 return region , rv3d , v3d 33 return None , None 34 35 region , rv3d , v3d , area = view3d_find(True) 36 37 override = { 38 ’scene’ : bpy.context.scene , 39 ’region ’ : region , 40 ’area’ : area , 41 ’space’ : v3d 42 } 43 44 bpy.ops.mesh.loopcut_slide( 45 override , 46 MESH_OT_loopcut = { 47 "number_cuts" : 40, 48 "smoothness" : 0, 26 49 "falloff" : ’SMOOTH ’, 50 "edge_index" : 2, 51 "object_index" : 0, 52 "mesh_select_mode_init" : (True , False , False) 53 }, 54 ) 55 56 bpy.ops.object.editmode_toggle () 57 bpy.ops.object.modifier_add(type=’SIMPLE_DEFORM ’) 58 bpy.context.object.modifiers["SimpleDeform"]. deform_axis = ’Y’ 59 bpy.context.object.modifiers["SimpleDeform"].angle = 3.14159 60 bpy.ops.object.modifier_apply(apply_as=’DATA’, modifier="SimpleDeform") 61 bpy.ops.object.modifier_add(type=’SIMPLE_DEFORM ’) 62 bpy.context.object.modifiers["SimpleDeform"]. deform_method = ’BEND’ 63 bpy.context.object.modifiers["SimpleDeform"]. origin = bpy.data.objects["Empty"] 64 bpy.context.object.modifiers["SimpleDeform"]. deform_axis = ’Z’ 65 bpy.context.object.modifiers["SimpleDeform"].angle = 6.28319 66 bpy.ops.object.modifier_apply(apply_as=’DATA’, modifier="SimpleDeform") 67 68 bpy.ops.object.editmode_toggle () D.1.2 Visualisering av figur: 7-9 1 bl_info = { 2 "name": "Visualisering av Balt -tricket" 3 "author" "Philip Karlsson", 4 "version": (1,0), 5 "blender": (2,80,0), 6 7 } 8 9 import bpy 10 11 bpy.ops.object.empty_add(type=’ARROWS ’, location =(0, 8, 0)) 12 bpy.context.object.rotation_mode = ’QUATERNION ’ 13 bpy.context.object.rotation_quaternion [0] = 1 14 bpy.context.object.rotation_quaternion [1] = 0 15 bpy.context.object.rotation_quaternion [2] = 0 16 bpy.context.object.rotation_quaternion [3] = 0 17 18 plane =bpy.ops.mesh.primitive_plane_add(location =(0, 0, 0)) 19 bpy.context.object.scale [0] = 1 20 bpy.context.object.scale [1] = 8 21 bpy.context.object.scale [2] = 1 22 bpy.ops.object.editmode_toggle () 23 24 def view3d_find( return_area = False ): 25 for area in bpy.context.window.screen.areas: 26 if area.type == ’VIEW_3D ’: 27 v3d = area.spaces [0] 28 rv3d = v3d.region_3d 29 for region in area.regions: 30 if region.type == ’WINDOW ’: 31 if return_area: return region , rv3d , v3d , area 32 return region , rv3d , v3d 33 return None , None 34 35 region , rv3d , v3d , area = view3d_find(True) 36 37 override = { 38 ’scene’ : bpy.context.scene , 39 ’region ’ : region , 40 ’area’ : area , 41 ’space’ : v3d 42 } 43 44 bpy.ops.mesh.loopcut_slide( 45 override , 46 MESH_OT_loopcut = { 47 "number_cuts" : 40, 48 "smoothness" : 0, 27 49 "falloff" : ’SMOOTH ’, 50 "edge_index" : 2, 51 "object_index" : 0, 52 "mesh_select_mode_init" : (True , False , False) 53 }, 54 ) 55 56 bpy.ops.object.editmode_toggle () 57 bpy.ops.object.modifier_add(type=’SIMPLE_DEFORM ’) 58 bpy.context.object.modifiers["SimpleDeform"]. origin = bpy.data.objects["Empty"] 59 bpy.context.object.modifiers["SimpleDeform"]. deform_axis = ’Y’ 60 bpy.context.object.modifiers["SimpleDeform"].angle = 12.56637 # Change to 3.14159 , 6.28319 , or 0 for other pictures 61 bpy.ops.object.modifier_apply(apply_as=’DATA’, modifier="SimpleDeform") D.1.3 Visualisering av figur: 12 1 bl_info = { 2 "name": "Visualisering av kvaternion Gauss map", 3 "author": "Emil Hietanen", 4 "version": (1, 0), 5 "blender": (2, 80, 0), 6 7 } 8 9 10 import bpy 11 12 bpy.ops.mesh.primitive_uv_sphere_add(location =(0, 0, 0)) 13 bpy.ops.mesh.bisect(plane_co =( -0.390101 , 0.169852 , 0.854357) , plane_no =(0.407088 , 0.913326 , -0.0107618) , xstart =791, xend =793, ystart =588, yend =45) 14 15 bpy.ops.mesh.primitive_uv_sphere_add(location =(0, 0, 0)) 16 py.ops.mesh.bisect(plane_co =( -0.390101 , 0.169852 , 0.854357) , plane_no =(0.407088 , 0.913326 , -0.0107618) , xstart =791, xend =793, ystart =588, yend =45) 17 bpy.context.space_data.overlay.show_ortho_grid = True 18 bpy.context.object.rotation_mode = ’QUATERNION ’ 19 bpy.context.object.rotation_quaternion [0] = 0 20 bpy.context.object.rotation_quaternion [1] = 1 21 bpy.context.object.rotation_quaternion [2] = 0 22 bpy.context.object.rotation_quaternion [3] = 0 23 24 bpy.context.space_data.shading.type = ’SOLID’ 25 bpy.context.space_data.shading.type = ’WIREFRAME ’ 26 bpy.context.space_data.shading.type = ’WIREFRAME ’ 27 bpy.context.space_data.shading.type = ’WIREFRAME ’ 28 bpy.context.space_data.shading.type = ’SOLID’ 29 bpy.context.space_data.shading.type = ’MATERIAL ’ 30 bpy.context.space_data.shading.type = ’RENDERED ’ 31 32 33 return {’FINISHED ’} D.1.4 Visulaisering av figur: 13 1 bl_info = { 2 "name": "Fig: Kollisions detektion 1, 3 "author": "Emil Hietanen", 4 "version": (1, 0), 5 "blender": (2, 80, 0), 6 } 7 8 9 import bpy 10 from bpy.types import Operator 11 from bpy.props import FloatVectorProperty 12 from bpy_extras.object_utils import AddObjectHelper , object_data_add 13 from mathutils import Vector 14 15 bpy.context.space_data.shading.type = ’WIREFRAME ’ 28 16 bpy.context.space_data.shading.type = ’WIREFRAME ’ 17 bpy.context.space_data.shading.type = ’WIREFRAME ’ 18 bpy.context.space_data.shading.type = ’SOLID’ 19 bpy.context.space_data.shading.type = ’MATERIAL ’ 20 bpy.context.space_data.shading.type = ’RENDERED ’ 21 bpy.context.space_data.shading.type = ’SOLID’ 22 bpy.context.space_data.shading.type = ’WIREFRAME ’ 23 bpy.context.space_data.overlay.show_overlays = False 24 bpy.context.space_data.overlay.show_overlays = True 25 bpy.context.space_data.shading.type = ’WIREFRAME ’ 26 bpy.context.space_data.shading.type = ’SOLID’ 27 bpy.context.space_data.overlay.show_extra_edge_length = True 28 bpy.context.space_data.overlay.show_extra_edge_length = False 29 bpy.context.space_data.overlay.show_face_orientation = True 30 bpy.context.space_data.overlay.show_face_orientation = False 31 bpy.context.space_data.overlay.show_face_orientation = True 32 bpy.context.object.rotation_quaternion [1] = 10 33 bpy.context.object.rotation_quaternion [2] = 2 34 bpy.context.object.rotation_quaternion [3] = -4.6 35 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 36 bpy.context.object.rotation_mode = ’QUATERNION ’ 37 bpy.context.object.rotation_quaternion [2] = -26.4 38 bpy.context.object.rotation_quaternion [1] = -1 39 bpy.context.object.rotation_quaternion [2] = -13.2 40 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 41 bpy.ops.outliner.select_box(tweak=True , xmin=52, xmax =142, ymin=42, ymax =86) 42 bpy.ops.object.editmode_toggle () 43 bpy.ops.object.editmode_toggle () 44 bpy.context.space_data.shading.type = ’WIREFRAME ’ 45 bpy.context.space_data.shading.type = ’WIREFRAME ’ 46 bpy.context.space_data.shading.type = ’WIREFRAME ’ 47 bpy.context.space_data.shading.type = ’SOLID’ 48 bpy.context.space_data.shading.type = ’WIREFRAME ’ 49 bpy.context.space_data.overlay.normals_length = 0.0301 50 bpy.context.space_data.show_gizmo = True 51 bpy.context.object.location [1] = -0.95 52 bpy.context.object.location [1] = -0.97 53 bpy.context.object.rotation_quaternion [1] = 10.6 54 bpy.context.object.location [1] = -0.93 55 bpy.context.object.location [1] = -0.92 56 bpy.context.object.location [1] = -0.91 57 bpy.context.object.location [1] = -0.9 58 bpy.context.space_data.show_gizmo = False 59 bpy.ops.object.editmode_toggle () 60 bpy.context.space_data.shading.type = ’WIREFRAME ’ 61 bpy.context.space_data.shading.type = ’WIREFRAME ’ 62 bpy.context.space_data.shading.type = ’SOLID’ 63 bpy.context.space_data.shading.type = ’SOLID’ 64 bpy.context.space_data.shading.type = ’WIREFRAME ’ 65 bpy.context.space_data.shading.type = ’SOLID’ 66 bpy.context.space_data.shading.type = ’MATERIAL ’ 67 bpy.context.space_data.shading.type = ’WIREFRAME ’ 68 bpy.context.space_data.shading.type = ’SOLID’ 69 bpy.context.space_data.shading.type = ’WIREFRAME ’ 70 bpy.ops.object.editmode_toggle () 71 bpy.context.space_data.shading.type = ’SOLID’ 72 bpy.context.space_data.shading.type = ’WIREFRAME ’ 73 bpy.ops.object.editmode_toggle () 29 D.1.5 Visualisering av figur: 15 1 bl_info = { 2 "name": "Kollision mellan sfar och plan", 3 "author": "Philip Karlsson", 4 "version": (1, 0), 5 "blender": (2, 80, 0), 6 7 } 8 9 10 11 import bpy 12 import math 13 from mathutils import Quaternion 14 15 bpy.ops.mesh.primitive_plane_add(size=8, enter_editmode=False , location =(0, 0, 0)) 16 bpy.context.space_data.context = ’PHYSICS ’ 17 bpy.ops.rigidbody.object_add () 18 bpy.context.object.rigid_body.type = ’PASSIVE ’ 19 bpy.context.object.rigid_body.friction = 0.25 20 bpy.context.object.rigid_body.restitution = 1 21 bpy.context.object.rigid_body.collision_shape = ’MESH’ 22 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 23 24 bpy.ops.mesh.primitive_plane_add(size=3, enter_editmode=False , location =(0, 0, 0)) 25 bpy.context.object.rotation_mode = ’QUATERNION ’ 26 bpy.context.object.rotation_quaternion [0] = 0.707 27 bpy.context.object.rotation_quaternion [1] = 0 28 bpy.context.object.rotation_quaternion [2] = 0.707 29 bpy.context.object.rotation_quaternion [3] = 0 30 bpy.context.space_data.context = ’PHYSICS ’ 31 bpy.ops.rigidbody.object_add () 32 bpy.context.object.rigid_body.type = ’PASSIVE ’ 33 bpy.context.object.rigid_body.collision_shape = ’MESH’ 34 bpy.context.object.rigid_body.friction = 0.25 35 bpy.context.object.rigid_body.restitution = 0.3 36 bpy.context.object.rigid_body.use_margin = True 37 bpy.context.object.rigid_body.collision_margin = 0 38 bpy.context.space_data.context = ’MATERIAL ’ 39 bpy.ops.material.new() 40 bpy.context.object.active_material.use_nodes = False 41 bpy.context.object.active_material.diffuse_color = (0.0762984 , 0.026208 , 0.8, 1) 42 bpy.context.object.active_material.diffuse_color = (0.0762984 , 0.026208 , 0.8, 1) 43 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 44 45 bpy.ops.mesh.primitive_uv_sphere_add(radius =0.3, enter_editmode=False , location =(-3, 0, 1)) 46 bpy.context.space_data.context = ’PHYSICS ’ 47 bpy.ops.rigidbody.object_add () 48 bpy.context.object.rigid_body.mass = 4 49 bpy.context.object.rigid_body.collision_shape = ’SPHERE ’ 50 bpy.context.object.rigid_body.friction = 0.25 51 bpy.context.object.rigid_body.restitution = 0.3 52 bpy.context.object.rigid_body.use_margin = True 53 bpy.context.object.rigid_body.collision_margin = 0 54 bpy.context.object.rigid_body.angular_damping = 0.848 55 bpy.context.space_data.context = ’MATERIAL ’ 56 bpy.ops.material.new() 57 bpy.context.object.active_material.use_nodes = False 58 bpy.context.object.active_material.diffuse_color = (0.8, 0.00778373 , 0.0094196 , 1) 59 bpy.context.object.active_material.diffuse_color = (0.8, 0.00778373 , 0.0094196 , 1) 60 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 61 62 bpy.ops.object.effector_add(type=’WIND’, enter_editmode=False , location =(0, 0, 0)) 63 bpy.context.object.rotation_mode = ’QUATERNION ’ 64 bpy.context.object.rotation_quaternion [0] = 0.707 65 bpy.context.object.rotation_quaternion [1] = 0 66 bpy.context.object.rotation_quaternion [2] = 0.707 67 bpy.context.object.rotation_quaternion [3] = 0 30 68 bpy.context.object.field.falloff_type = ’TUBE’ 69 bpy.context.object.field.use_min_distance = True 70 bpy.context.object.field.use_max_distance = True 71 bpy.context.object.field.distance_max = 2 72 bpy.context.object.field.strength = 600 73 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 74 bpy.ops.object.editmode_toggle () 75 76 # Go to animation tab to see the simulation D.1.6 Visualisering av figur: 16 1 bl_info = { 2 "name": "Comandos for Collision", 3 "author": "Emil Hietanen", 4 "version": (1, 0), 5 "blender": (2, 80, 0), 6 7 } 8 9 10 import bpy 11 import math 12 from mathutils import Quaternion 13 14 bpy.ops.mesh.primitive_grid_add(size=2, enter_editmode=False , location =(0, 0, 0)) 15 bpy.context.object.rotation_mode = ’QUATERNION ’ 16 bpy.context.object.scale [0] = 10 17 bpy.context.object.scale [1] = 10 18 bpy.context.object.scale [2] = 1 19 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 20 21 22 23 bpy.ops.mesh.primitive_uv_sphere_add(size =0.3, enter_editmode=False , location =(-3, 0, 5)) 24 bpy.ops.mesh.primitive_uv_sphere_add(size =0.3, enter_editmode=False , location =(3, 0, 5)) 25 bpy.context.object.rotation_mode = ’QUATERNION ’ 26 bpy.context.object.location [0] = 5 27 bpy.context.object.location [2] = 5 28 bpy.context.object.location [1] = 0 29 bpy.context.space_data.context = ’MATERIAL ’ 30 bpy.context.space_data.context = ’DATA’ 31 bpy.context.space_data.context = ’PHYSICS ’ 32 bpy.ops.rigidbody.object_add () 33 bpy.context.object.rigid_body.collision_shape = ’SPHERE ’ 34 bpy.context.object.rigid_body.use_margin = True 35 bpy.context.object.rigid_body.collision_margin = 0 36 bpy.context.object.rigid_body.angular_damping = 0 37 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 38 bpy.ops.rigidbody.object_add () 39 bpy.context.object.rigid_body.type = ’PASSIVE ’ 40 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 41 bpy.context.space_data.context = ’OBJECT ’ 42 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 43 bpy.context.object.location [0] = -5 44 bpy.context.space_data.context = ’DATA’ 45 bpy.context.space_data.context = ’PARTICLES ’ 46 bpy.context.space_data.context = ’MATERIAL ’ 47 bpy.context.space_data.context = ’DATA’ 48 bpy.context.space_data.context = ’CONSTRAINT ’ 49 bpy.context.space_data.context = ’CONSTRAINT ’ 50 bpy.context.space_data.context = ’PHYSICS ’ 51 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 52 bpy.ops.object.effector_add(type=’BOID’, enter_editmode=False , location =(0, 0, 0)) 53 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 54 bpy.context.object.field.strength = 100 55 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 56 bpy.ops.outliner.collection_delete () 57 bpy.ops.outliner.item_activate(extend=False , deselect_all=True) 31 58 bpy.context.scene.frame_start = 1 59 bpy.context.scene.use_preview_range = True 60 bpy.context.scene.use_preview_range = False 61 bpy.ops.object.effector_add(type=’WIND’, enter_editmode=False , location =(5, 0, 5)) 62 bpy.context.object.field.falloff_type = ’TUBE’ 63 bpy.context.object.field.strength = 600 64 bpy.context.object.field.use_min_distance = True 65 bpy.context.object.field.use_max_distance = True 66 bpy.context.object.field.distance_max = 5 67 bpy.context.object.field.use_absorption = True 68 bpy.context.object.field.use_absorption = False 69 bpy.context.space_data.context = ’OBJECT ’ 70 71 bpy.ops.object.effector_add(type=’WIND’, enter_editmode=False , location =(5-, 0, 5)) 72 bpy.context.object.field.falloff_type = ’TUBE’ 73 bpy.context.object.field.strength = 600 74 bpy.context.object.field.use_min_distance = True 75 bpy.context.object.field.use_max_distance = True 76 bpy.context.object.field.distance_max = 5 77 bpy.context.object.field.use_absorption = True 78 bpy.context.object.field.use_absorption = False 79 bpy.context.space_data.context = ’OBJECT ’ 80 bpy.context.object.rotation_mode = ’QUATERNION ’ 81 bpy.context.object.rotation_quaternion [2] = -0.707107 82 bpy.context.object.rotation_quaternion [0] = 0.707107 83 84 85 86 87 88 bpy.context.space_data.context = ’OBJECT ’ 89 bpy.context.space_data.context = ’DATA’ 90 bpy.context.object.data.lens = 15 D.2 MatLab Nedanför finns bifogad kod för de figurer som visualiserats i MatLab. D.2.1 Visualisering av figur: 4 och 5 1 % Steriographic projection 2 3 % settup 4 dots = 100; % adjusts the resolution of the spheres 5 L = 3; % axis length 6 t = linspace (0,1,dots); 7 p0= [0 1]; %point_of_projection 8 n = 7; % number of projectionlines 9 StereoProj = @(x,y)x./(1-y); % progection function 10 11 %% Circle 2D -> 1D 12 13 %standard parametrisation of a circle 14 x = cos(2*pi*t); 15 y = sin(2*pi*t); 16 17 %projection onto x-axis 18 pX = StereoProj(x,y); 19 20 % some lines for enhanced visualization 21 theta = linspace (0,2*pi ,n+1); 22 23 24 % ploting part 25 clf 26 27 hold on 28 axis([-L L -L/sqrt (1.6) L/sqrt (1.6) ]) 29 30 plot(x,y,’g’) 32 31 plot(pX ,0.*pX,’k-’) 32 33 %plots projection lines 34 for i = 1:( length(theta) -1) 35 projline = StereoProj(cos(pi+theta(i)),sin(pi+theta(i))); 36 plot([p0(1) projline cos(pi+theta(i))],[p0(2) 0 sin(pi+theta(i))],’b’) 37 end 38 plot(p0(1),p0(2),’r*’) 39 shg 40 41 %% Sphere 3D -> 2D 42 43 % configure setup 44 dots = 20; 45 theta = linspace (0,2*pi ,dots); 46 phi = linspace(0,pi,dots); 47 [THETA ,PHI] = meshgrid(theta ,phi); 48 pXY = @(x,z)x./(1-z); 49 n = 12; 50 51 % param sphere 52 X = cos(THETA).*sin(PHI); 53 Y = sin(THETA).*sin(PHI); 54 Z = cos(PHI); 55 56 p0 = [0 0 1]; 57 Xp = pXY(X,Z); 58 Yp = pXY(Y,Z); 59 % ploting part 60 clf 61 hold on 62 % Note: to get the version 1 sphere remove the setings on facecolor and 63 %edgecolor below. 64 surf(Xp ,Yp ,0.*Xp,’facealpha ’ ,0.25,’facecolor ’,’b’) 65 66 colormap winter 67 surf(X,Y,Z,’facealpha ’ ,0.5,’edgecolor ’,’none’,’facecolor ’,’g’) 68 plot3(p0(1),p0(2),p0(3),’r*’) 69 70 % below we plots the lines between the projection and the normal object 71 for i = 1:n 72 th = random(’unif’ ,0,2*pi); 73 ph = random(’unif’,0,pi); 74 75 x = cos(th).*sin(ph); 76 y = sin(th).*sin(ph); 77 z = cos(ph); 78 79 plineX = pXY(x,z); 80 plineY = pXY(y,z); 81 plot3 ([p0(1) plineX x],[p0(2) plineY y],[p0(3) 0 z],’m’) 82 end 83 84 axis([-L L -L L -L L]) 85 view (-18,16) 86 shg 87 88 %% square root Method 89 % circle 2D -> 1D 90 91 %set up 92 th = linspace (0,2*pi); % angle for parametrisation 93 root = @(x,y) x; % this projection is so simple that tis function is redundant 94 n = 7; 95 96 % paramererize 97 x = cos(th); 98 y = sin(th); 99 100 33 101 % plot 102 clf 103 hold on 104 plot(x,y,’k’) 105 plot ([1 -1],[0 0],’g*’) %plotsthe boundrypoints 106 plot(x,0.*x,’b-’)% southernhemisphere projection 107 plot(x,0.*x+0.01 ,’r-’) %plots northern hrmisphere projection , 108 % the shift of 0.01 in y is to make it visible due to the overlap 109 110 % plots projection lines 111 for i = 1:n 112 x = random(’unif’ ,-1,1); 113 y = random(’unid’ ,2); 114 if(y==1) 115 plot([x x], [sqrt(1-x^2) 0],’r--’); 116 else 117 plot([x x], [-sqrt(1-x^2) 0],’b--’); 118 end 119 end 120 axis equal 121 shg 122 123 %% sphere 3D -> 2D 124 % set up 125 dots = 20; 126 theta = linspace (0,2*pi,dots); 127 phi = linspace(0,pi,dots); 128 [THETA ,PHI] = meshgrid(theta ,phi); 129 n = 12; 130 131 % param sphere 132 X = cos(THETA).*sin(PHI); 133 Y = sin(THETA).*sin(PHI); 134 Z = cos(PHI); 135 136 p0 = [0 0 1]; 137 Xp = pXY(X,Z); 138 Yp = pXY(Y,Z); 139 140 % ploting part 141 clf 142 hold on 143 colormap winter 144 145 surf(X,Y,Z,’facealpha ’ ,0.15,’edgecolor ’,’none’); %sphere 146 surf(X,Y,0.*Z,’facealpha ’ ,0.5,’facecolor ’,’b’) % southern hemisphere 147 surf(X,Y,0.*Z+0.01,’facealpha ’ ,0.5,’facecolor ’,’r’) % northern hemisphere 148 149 % plots projectionlines 150 for i = 1:n 151 th = random(’unif’ ,0,2*pi); 152 ph = random(’unif’,0,pi); 153 154 x = cos(th).*sin(ph); 155 y = sin(th).*sin(ph); 156 z = cos(ph); 157 158 if z>0 159 plot3 ([x x],[y y],[z 0],’r-x’) 160 else 161 plot3 ([x x],[y y],[z 0],’b-x’) 162 end 163 end 164 axis equal 165 view (3) 166 shg D.2.2 Visualisering av figur: 10 1 % rolling ball 2 34 3 % settup 4 t0 = 1; %pause time in sek 5 dots = 100; % adjusts the resolution of the spheres 6 L = 3; % axis length 7 t = linspace (0,1,dots); 8 9 n = dots; 10 % configure setup 11 theta = linspace (0,2*pi ,dots); 12 phi = linspace(0,pi,dots); 13 [THETA ,PHI] = meshgrid(theta ,phi); 14 [x,y] = meshgrid(linspace(-1,1,n),linspace(-1,1,n)); 15 %% param sphere 16 X = cos(THETA).*sin(PHI); 17 Y = sin(THETA).*sin(PHI); 18 Z = cos(PHI); 19 C = Z; % to preserve collor in the sphere between rotations 20 CD = X; 21 % Rotmatrix 22 23 % ploting part 0 24 clf 25 hold on 26 27 colormap default 28 title(’start’) 29 surf(X,Y,Z,C,’facealpha ’ ,0.4,’edgecolor ’,’none’) % sphere 30 surf(X,Y,0.*Z,CD,’edgecolor ’,’none’) % Disk 31 %plot3([-1 1],[0 0],[0 0],’r’)%x-axis 32 %plot3 ([0 0],[-1 1],[0 0],’b’)%y-axis 33 %plot3 ([0 0],[0 0],[-1 1],’g’)%z-axis 34 axis equal 35 axis off 36 %legend(’’,’’,’x-axis ’,’y’,’z’) 37 view (-90,45) 38 shg 39 pause(t0) 40 %% rot 1 -pi/2 y-axis 41 clf 42 hold on 43 44 C = X; 45 CD = -Z; 46 47 title(’Rotation kring -y-axel’) 48 surf(X,Y,Z,C,’facealpha ’ ,0.4,’edgecolor ’,’none’) % sphere 49 surf (0.*X,Y,Z,CD,’edgecolor ’,’none’) % Disk 50 %plot3([-1 1],[0 0],[0 0],’r’)%x-axis 51 %plot3 ([0 0],[-1 1],[0 0],’b’)%y-axis 52 %plot3 ([0 0],[0 0],[-1 1],’g’)%z-axis 53 axis equal 54 axis off 55 %legend(’’,’’,’x-axis ’,’y’,’z’) 56 view (-90,45) 57 shg 58 pause(t0) 59 %% rot 2 pi/2 x-axis 60 clf 61 hold on 62 63 C = X; 64 CD = Y; 65 66 title(’Rotation kring x-axel’) 67 surf(X,Y,Z,C,’facealpha ’ ,0.4,’edgecolor ’,’none’) % sphere 68 surf (0.*X,Y,Z,CD,’edgecolor ’,’none’) % Disk 69 %plot3([-1 1],[0 0],[0 0],’r’)%x-axis 70 %plot3 ([0 0],[-1 1],[0 0],’b’)%y-axis 71 %plot3 ([0 0],[0 0],[-1 1],’g’)%z-axis 72 axis equal 35 73 axis off 74 %legend(’’,’’,’x-axis ’,’y’,’z’) 75 view (-90,45) 76 shg 77 pause(t0) 78 %% rot 2 pi/2 y-axis 79 C = Z; 80 CD = Y; 81 82 clf 83 hold on 84 85 colormap default 86 title(’Rotation kring y-axel’) 87 surf(X,Y,Z,C,’facealpha ’ ,0.4,’edgecolor ’,’none’) % sphere 88 surf(X,Y,0.*Z,CD,’edgecolor ’,’none’) % Disk 89 %plot3([-1 1],[0 0],[0 0],’r’)%x-axis 90 %plot3 ([0 0],[-1 1],[0 0],’b’)%y-axis 91 %plot3 ([0 0],[0 0],[-1 1],’g’)%z-axis 92 axis equal 93 axis off 94 %legend(’’,’’,’x-axis ’,’y’,’z’) 95 view (-90,45) 96 shg D.2.3 Visualisering av figur: 11 1 %% Author: Hampus Ahlebrand 2 %Kod f r att visualisera kvaternionkurvan f r bolltricket 3 % d handen rullar bollen med s m c i r k u l r a r r e l s e r i xy -planet. 4 %Det antas h r att bollen har radien 1 vilket i n n e b r att l n d e n 5 % f r handens r r e l s e i en viss riktning motsvarar rotationsvinkeln. 6 7 8 t=0; %motsvarar tid 9 T=0.1; % r r e l s e n p g r i 0.1s 10 dt =0.0001; %Tidssteg 11 i=1; % index f r att spara komponenter i Q1,Q2 och Q2 12 theta=pi/250;%Rotationsvinkeln 13 14 dtheta=pi/50;% R i k t n i n g s f r n d r i n g 15 dtheta_0=pi/50; 16 17 q=[1 0 0 0];% Initialv rdet , denna kvaternion svarar mot bollens begynnelseorientering 18 19 Q1=zeros (1 ,999);% De i m a g i n r a komponenterna av de b e r k a n d e kvaternionerna sparas 20 Q2=zeros (1 ,999);% i Q1, Q2 och Q3. 21 Q3=zeros (1 ,999); 22 23 24 while t