---
title: "Rotera vertiser runt origo"
type: "forum-thread"
url: "https://www.webforum.nu/amne/programmering/89897-rotera-vertiser-runt-origo/page2"
topic: "Programmering"
topic_url: "https://www.webforum.nu/amne/programmering"
author: "Alpha II"
published: "2003-11-07T15:30:45.000Z"
updated: "2003-11-19T23:30:27.000Z"
replies: 30
views: 1238
page: 2
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/programmering/89897-rotera-vertiser-runt-origo"
---

# Rotera vertiser runt origo

_Sida 2 av 2._

## #21 — Alpha II, 2003-11-11T15:03Z

Jag var inte riktigt nöjd med resultatet så jag försökte mig på att verkligen använda matriser och inte räkna med matriser (som jag också misslyckades med...).

Det här är min kod:

```

  s1 := sin(Xrot);
  s2 := sin(Yrot);
  s3 := sin(Zrot);

  c1 := cos(Xrot);
  c2 := cos(Yrot);
  c3 := cos(Zrot);

  XRotMat := IdentityMatrix;
  XRotMat[1,1] := c1;
  XRotMat[2,1] := -s1;
  XRotMat[1,2] := s1;
  XRotMat[2,2] := c1;

  YRotMat := IdentityMatrix;
  YRotMat[0,0] := c2;
  YRotMat[2,0] := s2;
  YRotMat[0,2] := -s2;
  YRotMat[2,2] := c2;

  ZRotMat := IdentityMatrix;
  ZRotMat[0,0] := c3;
  ZRotMat[1,0] := -s3;
  ZRotMat[0,1] := s3;
  ZRotMat[1,1] := c3;

  ModelMatrix := MultiplyMatrix(MultiplyMatrix(XRotMat,YRotMat),ZRotMat);
```

```

  for I := 0 to numVerts do begin
    vertice[i] := MultiplyMatrixVector(ModelMatrix,cubevert[i]);
  end;
```

Resultatet blir liknande det första programmet jag postade här.

Permalänk: https://www.webforum.nu/p/1203973

## #22 — Alpha II, 2003-11-11T15:09Z

Och nu en minut senare kom jag på att jag hade gjort en liten miss i MultiplyMatrix() funktionen :OO

Permalänk: https://www.webforum.nu/p/1203980

## #23 — hypatia, 2003-11-11T21:56Z

Så nu funkar det som det ska? :)

Permalänk: https://www.webforum.nu/p/1204223

## #24 — Alpha II, 2003-11-12T11:05Z

Jag är inte helt säker på hur det ska fungera men när jag roterar föremål just nu så roteras kuben runt sina egna axlar och inte kordinatsystemets. Det verkar inte helt riktigt. :l

En annan sak jag har funderat över hur jag ska fylla primitiverna. Just nu har jag en lista över ytor och vilka punkter de är sammankopplade med. Sen när jag går igenom ytorna ritar jag en polygon med WinAPI. Jag skulle behöva en kraftfullare algoritm som kunde rita åtminstone trianglar (eller polygoner) där de olika punkternas färger interpolerar (är det rätt ord?) och att det ska vara möjligt att testa varje punkts z kordinat och avgöra om den är synlig. Verkar otroligt jobbigt med tanke på att min algoritm för att göra något så enkelt som att rita linjer fungerar halvdåligt. :l

Permalänk: https://www.webforum.nu/p/1204360

## #25 — PeW, 2003-11-12T16:12Z

> **Alpha II skrev:**
>
> Jag är inte helt säker på hur det ska fungera men när jag roterar föremål just nu så roteras kuben runt sina egna axlar och inte kordinatsystemets. Det verkar inte helt riktigt.

Jo det är riktigt pga:

> **PeW ett par inlägg upp skrev:**
>
> Ditt 'problem' är att du har ett koordinatsystem som är själva kuben och ett annat koordinatsystem som är själva utritningsytan. Så för att översätta koordinaterna behövs det förutom en rotationsmatris (som gäller för kubens koordinatsystem), även en s.k 'basbytesmatris' som gör om en kubens koordinater till motsvarande i det andra koordinatsystemet. Man får då två matriser som kan slås ihop till en matris som nu blir den nya transformeringsmatrisen.

 ;)

Permalänk: https://www.webforum.nu/p/1204493

## #26 — Alpha II, 2003-11-12T17:03Z

Aha :) Hur ska en basbytesmatris se ut?

Permalänk: https://www.webforum.nu/p/1204521

## #27 — PeW, 2003-11-12T18:28Z

Beror lite på. Om vi tänker att P är en matris som består av koordinaterna av det ena koordinatsystemets basvektorer, fast i P som kolonner, så kan vi byta bas på en matris A genom att ta P^-1AP, dvs P-invers gånger A gånger P. Produkten är då A'... som tillsammans med rotationsmatrisen ger en rotation i en annan bas.
Så först måste man bestämma en bas för det koordinatsystem man avser och sen lägga dessa baser som kolonner i P. Ex:

```
en bas tagen ur luften:  {b1=(1,0,0);b2=(1,1,0);b3=(0,1,1)}

(en bas är aldrig en linjärkombination av någon annan bas, så i en gausselimination blir aldrig baserna 0 )

vilket ger P:
 b1 b2 b3 
|  1 1 0 |
|  0 1 1 |
|  0 0 1 |
```

\*I ett vanligt koordinatsystem (standard) är baserna (1,0,0);(0,1,0);(0,0,1) så det man får är enhetesmatrisen om man ställer upp dem som ovan beskrivet.

Kolla annars igenom de länkar som är upplagda.. det bör rimligtvisframgå nånstans hur man implementerar detta. (jag har bara gjort detta med papper och penna så implementationen får du stå för själv  ;))

\* I exempelvis Haskell's grafiska bibliotek använder man s.k regions. Dessa går att skala, rotera och transformera (byta koordinatssystem - e.g basbyte)... detta är dock inte trivialt, men det kanske finns ytterligare beskrivet om man söker lite på det.

Permalänk: https://www.webforum.nu/p/1204559

## #28 — Alpha II, 2003-11-12T20:35Z

Om jag har förstått det rätt så lär  P^-1AP enbart ge inversen av A om jag har ett vanligt XYZ kordinatsystem? Jag är trött och har förmodligen förstått det fel ;)

Permalänk: https://www.webforum.nu/p/1204628

## #29 — PeW, 2003-11-12T21:19Z

Nej! Inversen av A får du genom att beräkna inversen av A och P har inget med det att göra. Förresten så är alla koordinatsystem i rummet - oavsett bas - av formen X Y Z. Du kan lika gärna kalla dem a1 a2 a3 eller vad som helst...så länge det är tre olika vektorer. basen är de vektorer som spänner upp koordinatsystemet och kuben i ditt fall har egna baser jmfrt med uppritningsytans baser. De utgår alltså från olika origo. 

Nu är den matematik som jag skriver om, avseende på punkter i ett koordinatsystem. Du har en komplex form som spänns upp av 3 st vektorer...  när du använder en rotationsmatris som beskriven så roterar du dessa vektorer. För att flytta ut rotationen behöver du flytta ut origo och det är det som jag försökt beskriva. Men en direkt översättning lär inte göras trivialt och jag är inte 100% säker på att den basbytesmatris jag visade är den som behövs.. men om du kollar lite i de artiklar som är upplagda här kanske det klarnar om hur du effektivast byter koordinater.  :)

Permalänk: https://www.webforum.nu/p/1204660

## #30 — Alpha II, 2003-11-19T14:08Z

Jag är inte helt säker på detta med inverser och basbyten och det verkar inte heller fungera. Om jag har förstått rätt hur man räknar ut inversen av en matris så borde P^-1\*A\*P vara detsamma som A om kordinatsystemet ser ut som enhetsmatrisen?

Jag har förmodligen missförstått hur jag ska göra, men jag visar min kod:

```
  ModelMatrix := IdentityMatrix;
  ModelMatrix := MultiplyMatrix(ModelMatrix,XRotMat);
  ModelMatrix := MultiplyMatrix(MultiplyMatrix(InverseMatrix(CoordinateMatrix),ModelMatrix),CoordinateMatrix);
  ModelMatrix := MultiplyMatrix(ModelMatrix,YRotMat);
  ModelMatrix := MultiplyMatrix(MultiplyMatrix(InverseMatrix(CoordinateMatrix),ModelMatrix),CoordinateMatrix);
  ModelMatrix := MultiplyMatrix(ModelMatrix,ZRotMat);
  ModelMatrix := MultiplyMatrix(MultiplyMatrix(InverseMatrix(CoordinateMatrix),ModelMatrix),CoordinateMatrix)
  ModelMatrix := MultiplyMatrix(ModelMatrix,ScaleMat);
```

Det blir ingen skillnad nu från förut.

En annan sak jag funderat på är hur en projektionsmatris ska se ut. Just nu skippar jag bara helt enkelt z kordinaterna och det gör att kuben ser lite konstig ut.

Permalänk: https://www.webforum.nu/p/1210821

## #31 — PeW, 2003-11-19T23:30Z

Kanske ingen lösning, men ett svar på en del:

Om P i det här fallet är detsamma som enhetsmatrisen blir A oförändrad - ja. Enhetsmatrisen får du av en matris i standardbasen (1,0,0), (0,1,0) och (0,0,1) i R^3. Så det du söker är en annan bas. 

Projektion kan ses som skuggan av en vektor. Projektion på en matris är lite mer komplex än projektionen på en vektor men egentligen samma sak. (En matris är ju en samling vektorer).

Permalänk: https://www.webforum.nu/p/1211097

---

Tråden på webben: https://www.webforum.nu/amne/programmering/89897-rotera-vertiser-runt-origo/page2  
Föregående sida: https://www.webforum.nu/amne/programmering/89897-rotera-vertiser-runt-origo.md
