3d problem

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

3d problem

Beitrag von Kevin »

Ich wollte einen code schreiben bei dem man einen punkt um die x,y und z achse drehen kann, aber das klappt nicht so ganz.

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 
Zuletzt geändert von Kevin am 10.12.2008 23:08, insgesamt 2-mal geändert.
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

vielleich mal so probieren

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()
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)
a(1,4)=0.0; 
a(2,4)=0.0; 
a(3,4)=0.0; 
a(4,4)=1.0; 

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

;180*#PI 0.017453
aaa.f=aa*0.017453
aab.f=ab*0.017453
aac.f=ac*0.017453

SetMX(aaa)
SetMY(aab)
SetMZ(aac)

ResetList(Kor())
While NextElement(Kor())
eX=Kor()\x
eY=Kor()\y
eZ=Kor()\z

eXX.f=GetMX(eX,eY,eZ,1)
eYY.f=GetMY(eX,eY,eZ,1)
z=GetMZ(eX,eY,eZ,1)

eXn=eXX
eYn=eYY
x=eXn/zoom
y=eYn/zoom
AddCb(x,y,Kor()\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

Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

@Kevin

Code einrücken, wenn du hilfe willst...
Das hilft nicht nur uns, sondern auch dir :)
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

Ich hab mir die Mühe gemacht, das ganze einzurücken:

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()
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)
a(1, 4) = 0.0;
a(2, 4) = 0.0;
a(3, 4) = 0.0;
a(4, 4) = 1.0;

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
  
  ;180*#PI 0.017453
  aaa.f = aa*0.017453
  aab.f = ab*0.017453
  aac.f = ac*0.017453
  
  SetMX(aaa)
  SetMY(aab)
  SetMZ(aac)
  
  ResetList(Kor())
  While NextElement(Kor())
    eX = Kor()\x
    eY = Kor()\y
    eZ = Kor()\z
    
    eXX.f = GetMX(eX, eY, eZ, 1)
    eYY.f = GetMY(eX, eY, eZ, 1)
    z = GetMZ(eX, eY, eZ, 1)
    
    eXn = eXX
    eYn = eYY
    x = eXn/zoom
    y = eYn/zoom
    AddCb(x, y, Kor()\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
Gruss
PMTheQuick ;-)
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Beitrag von Kevin »

@alter Mann
das ergebnis ist aber immer noch das gleiche

@PMTheQuick
thx aber das hilft mir auch nicht weiter
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

http://www.purebasic.fr/german/viewtopi ... c&start=20

Das schon gelesen?


P.S.
Hier lohnt es sich Matrix- und Vektorklassen zu haben... hab sowas
aber leider in PB noch nicht geschrieben...
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

sorry, hatte vergessen, dass die Transformationen hintereinander gehängt werden müssen, also erst drehen um X-Achse - Koordinaten merken, dann drehen um Y mit gemerkten Koordinaten, dito um Z

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
Win11 64Bit / PB 6.0
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Beitrag von Kevin »

thx genau das habe ich gebraucht
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Beitrag von Kevin »

wie kann ich jetzt noch ermitteln welcher punkt im vordergrund ist?
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

wahrscheinlich solltest Du das Maximum von Kor1()\z suchen
Win11 64Bit / PB 6.0
Antworten