die z achse dreht sich richtig aber die anderen 2 nicht
hier ist der code:
Code: Alles auswählen
InitSprite()
OpenWindow(0, 200, 200, 410, 410, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0), 5, 105, 400, 300, 0, 0, 0)
If CreateGadgetList(WindowID(0))
CheckBoxGadget(1, 5, 5, 100, 20, "-x")
CheckBoxGadget(2, 5, 25, 100, 20, "-y")
CheckBoxGadget(3, 5, 45, 100, 20, "-z")
CheckBoxGadget(4, 105, 5, 100, 20, "x")
CheckBoxGadget(5, 105, 25, 100, 20, "y")
CheckBoxGadget(6, 105, 45, 100, 20, "z")
ButtonGadget(7, 5, 65, 200, 20, "zurücksetzen")
EndIf
Structure Kor
x.w
y.w
z.w
rgb.l
EndStructure
Global NewList Kor.Kor()
Global NewList Kor1.Kor()
Procedure AddKor(x, y, z, rgb)
AddElement(Kor())
Kor()\x = x
Kor()\y = y
Kor()\z = z
Kor()\rgb = rgb
EndProcedure
Structure Cb
x.w
y.w
rgb.l
EndStructure
Global NewList Cb.Cb()
Procedure AddCb(x, y, rgb)
AddElement(Cb())
Cb()\x = x
Cb()\y = y
Cb()\rgb = rgb
EndProcedure
AddKor(50, 50, 100, RGB(96, 96, 96))
AddKor(150, 50, 100, RGB(96, 0, 0))
AddKor(50, 150, 100, RGB(0, 96, 0))
AddKor(150, 150, 100, RGB(0, 0, 96))
AddKor(50, 50, 50, RGB(192, 192, 192))
AddKor(150, 50, 50, RGB(192, 0, 0))
AddKor(50, 150, 50, RGB(0, 192, 0))
AddKor(150, 150, 50, RGB(0, 0, 192))
Global Dim a.f(4,4)
Procedure.f InitM()
a(1, 1) = 1.0
a(2, 1) = 0.0
a(3, 1) = 0.0
a(4, 1) = 0.0
a(1, 2) = 0.0
a(2, 2) = 1.0
a(3, 2) = 0.0
a(4, 2) = 0.0
a(1, 3) = 0.0
a(2, 3) = 0.0
a(3, 3) = 1.0
a(4, 3) = 0.0
a(1, 4) = 0.0
a(2, 4) = 0.0
a(3, 4) = 0.0
a(4, 4) = 1.0
EndProcedure
Procedure.f GetMX(xx, yy, zz, ww)
x_neu.f = xx*a(1, 1) + yy*a(1, 2) + zz*a(1, 3) + ww*a(1, 4)
ProcedureReturn x_neu
EndProcedure
Procedure.f GetMY(xx, yy, zz, ww)
y_neu.f = xx*a(2, 1) + yy*a(2, 2) + zz*a(2, 3) + ww*a(2, 4)
ProcedureReturn y_neu
EndProcedure
Procedure.f GetMZ(xx, yy, zz, ww)
z_neu.f = xx*a(3, 1) + yy*a(3, 2) + zz*a(3, 3) + ww*a(3, 4)
ProcedureReturn z_neu
EndProcedure
Procedure.f GetMW(xx, yy, zz, ww)
w_neu.f = xx*a(4, 1) + yy*a(4, 2) + zz*a(4, 3) + ww*a(4, 4)
ProcedureReturn w_neu
EndProcedure
Procedure.f SetMX(wx.f)
a(2, 2) = Cos(wx)
a(2, 3) = -Sin(wx)
a(3, 2) = Sin(wx)
a(3, 3) = Cos(wx)
EndProcedure
Procedure.f SetMY(wy.f)
a(1, 1) = Cos(wy)
a(1, 3) = Sin(wy)
a(3, 1) = -Sin(wy)
a(3, 3) = Cos(wy)
EndProcedure
Procedure.f SetMZ(wz.f)
a(1, 1) = Cos(wz)
a(1, 2) = Sin(wz)
a(2, 1) = -Sin(wz)
a(2, 2) = Cos(wz)
EndProcedure
aa.f = 0.0
ab.f = 0.0
ac.f = 0.0
speed.f = 0.5
zoom = 2
InitM()
Repeat
FlipBuffers()
ClearScreen(0)
Delay(5)
If GetGadgetState(1) : aa + speed : EndIf
If GetGadgetState(2) : ab + speed : EndIf
If GetGadgetState(3) : ac + speed : EndIf
If GetGadgetState(4) : aa-speed : EndIf
If GetGadgetState(5) : ab-speed : EndIf
If GetGadgetState(6) : ac-speed : EndIf
If aa>360 : aa-360 : EndIf
If ab>360 : ab-360 : EndIf
If ac>360 : ac-360 : EndIf
If aa<-360 : aa+360 : EndIf
If ab<-360 : ab+360 : EndIf
If ac<-360 : ac+360 : EndIf
;180*#PI 0.017453
aaa.f = aa*0.017453
aab.f = ab*0.017453
aac.f = ac*0.017453
InitM()
SetMX(aaa)
ResetList(Kor())
ClearList(Kor1())
While NextElement(Kor())
eX = Kor()\x
eY = Kor()\y
eZ = Kor()\z
AddElement(Kor1())
Kor1()\x = GetMX(eX, eY, eZ, 1)
Kor1()\y = GetMY(eX, eY, eZ, 1)
Kor1()\z = GetMZ(eX, eY, eZ, 1)
Kor1()\rgb = Kor()\rgb
Wend
InitM()
SetMY(aab)
ResetList(Kor1())
While NextElement(Kor1())
eX = Kor1()\x
eY = Kor1()\y
eZ = Kor1()\z
Kor1()\x = GetMX(eX, eY, eZ, 1)
Kor1()\y = GetMY(eX, eY, eZ, 1)
Kor1()\z = GetMZ(eX, eY, eZ, 1)
Wend
InitM()
SetMZ(aac)
ResetList(Kor1())
While NextElement(Kor1())
eX = Kor1()\x
eY = Kor1()\y
eZ = Kor1()\z
Kor1()\x = GetMX(eX, eY, eZ, 1)
Kor1()\y = GetMY(eX, eY, eZ, 1)
Kor1()\z = GetMZ(eX, eY, eZ, 1)
Wend
ResetList(Kor1())
While NextElement(Kor1())
x = Kor1()\x/zoom
y = Kor1()\y/zoom
AddCb(x, y, Kor1()\rgb)
Wend
If StartDrawing(ScreenOutput())
ResetList(Cb())
While NextElement(Cb())
Circle(200 + Cb()\x, 150 + Cb()\y, 2, Cb()\rgb)
Wend
ClearList(Cb())
StopDrawing()
EndIf
Select WindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadget()
Case 7
aa = 0 : ab = 0 : ac = 0
EndSelect
EndSelect
ForEver