AAlpha IIMedlem sedan maj 20002 993 inlägg 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.
AAlpha IIMedlem sedan maj 20002 993 inlägg Och nu en minut senare kom jag på att jag hade gjort en liten miss i MultiplyMatrix() funktionen :OO
hypatiaMedlem sedan feb. 20016 388 inläggSå nu funkar det som det ska? :)
AAlpha IIMedlem sedan maj 20002 993 inlägg 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
AAlpha IIMedlem sedan maj 20002 993 inlägg Aha :) Hur ska en basbytesmatris se ut?
PPeWMedlem sedan juni 200010 432 inlägg 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.
AAlpha IIMedlem sedan maj 20002 993 inlägg 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 ;)
PPeWMedlem sedan juni 200010 432 inlägg 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. :)
AAlpha IIMedlem sedan maj 20002 993 inlägg 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.
PPeWMedlem sedan juni 200010 432 inlägg 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).