webForumDet fria alternativet

Rotera vertiser runt origo

Programmering

30 svar · 1 205 visningar · startad av Alpha II · sida 2 av 2

Frågan, av Alpha II

Hur roterar jag en punkt (3D) runt origo tex 10 grader runt x-axeln? Det jag vill veta är den nya positionen.

Läs frågan i sin helhet →
Medlem sedan maj 20002 993 inlägg
#21

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.

Medlem sedan maj 20002 993 inlägg
#22

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

Medlem sedan feb. 20016 388 inlägg
#23

Så nu funkar det som det ska? :)

Medlem sedan maj 20002 993 inlägg
#24

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

Medlem sedan juni 200010 432 inlägg
#25

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.

;)

Medlem sedan maj 20002 993 inlägg
#26

Aha :) Hur ska en basbytesmatris se ut?

Medlem sedan juni 200010 432 inlägg
#27

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.

Medlem sedan maj 20002 993 inlägg
#28

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 ;)

Medlem sedan juni 200010 432 inlägg
#29

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. :)

Medlem sedan maj 20002 993 inlägg
#30

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.

Medlem sedan juni 200010 432 inlägg
#31

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).

261 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)