3D Punkt um 3D Punkt drehen

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

UNZ

Betreff: 3D Punkt um 3D Punkt drehen

BeitragMi, Sep 22, 2010 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ich habe ewig nach so etwas gesucht und bin nun endlich auf einem Delphi-Forum fündig geworden!
(http://www.swissdelphicenter.ch/de/showcode.php)

Es handelt sich um eine Funktion, die im Prinzip das gleiche macht wie EntityParent.
Aber ich brauchte das für theoretische Abfragen, d.h. mit Pivots wäre es viel zu langsam.

Ich hab das jetzt in B3D 'übersetzt' und ein Beispiel dazu geschrieben:

Code: [AUSKLAPPEN]

Global gfx_x= 800
Global gfx_y= 600

Const gfx_xNorm= 800, gfx_yNorm= 600

Global kamera,licht
Global zentrum,obj

Global fps, frames, renderZeit;FPS
Global timer

Global rex#,rey#,rez#

;----------------------------------------------------------TYPES------------------------------------------


;----------------------------------------------------------VORBEREITUNG------------------------------------------
SeedRnd MilliSecs()

Graphics3D gfx_x,gfx_y,32,2

SetBuffer BackBuffer()

kamera= CreateCamera()
PositionEntity kamera,0,0,-25

licht= CreateLight()

zentrum= CreateSphere()
ScaleEntity zentrum,0.1,0.1,0.1
EntityColor zentrum,255,0,0

obj= CreateCube()
PositionEntity obj,Rand(-5,5),Rand(-5,5),Rand(-5,5)

obj2= CreateSphere()
PositionEntity obj2,Rand(-5,5),Rand(-5,5),Rand(-5,5)
EntityColor obj2,0,255,0

timer= CreateTimer(60)

MoveMouse gfx_x/2,gfx_y/2

;--------------------------------------------------------SCHLEIFE--------------------------------
Repeat

   If MouseDown(1)
      PunktUmPunkt(EntityX(obj),EntityY(obj),EntityZ(obj), EntityX(obj2),EntityY(obj2),EntityZ(obj2), 1,1,1)
      PositionEntity obj,rex,rey,rez
   EndIf

   Steuerung()

   Rendern()
   
Until KeyHit(1)

End

;-----------------------------------------------------RENDERN---------------------------------------------
Function Rendern()
   
   ;FPS
   frames=frames+1
   If renderZeit+1000 < MilliSecs() fps= frames: frames= 0: renderZeit= MilliSecs()   
   Text gfx_x/2,0,fps

   WaitTimer(timer)

   Flip
   UpdateWorld
   RenderWorld

End Function

;-----------------------------------------------------STEUERUNG---------------------------------------------
Function Steuerung()

   ;drehen
   entity= kamera

   drehWeite= 2
   xdrehung=MouseXSpeed()
   ydrehung=MouseYSpeed()
   MoveMouse gfx_x/2,gfx_y/2
   If ydrehung > drehWeite ydrehung= drehWeite
   If ydrehung < -drehWeite ydrehung= -drehWeite
   If xdrehung > drehWeite xdrehung= drehWeite
   If xdrehung < -drehWeite xdrehung= -drehWeite
   TurnEntity entity,ydrehung,-xdrehung,0

   If KeyDown(203) TurnEntity entity,0,1,0
   If KeyDown(205) TurnEntity entity,0,-1,0
   If KeyDown(200) TurnEntity entity,1,0,0
   If KeyDown(208) TurnEntity entity,-1,0,0

   ;bewegen
   weite#= 1
   If KeyDown(17) MoveEntity entity,0,0,weite
   If KeyDown(31) MoveEntity entity,0,0,-weite
   If KeyDown(30) MoveEntity entity,-weite,0,0
   If KeyDown(32) MoveEntity entity,weite,0,0

End Function

;--------------------------------------------------------PUNKT UM PUNKT--------------------------------
Function PunktUmPunkt(x#,y#,z#, ox#,oy#,oz#, pitch#,yaw#,roll#)

   ;(Die Drehung wird um den Ursprung berechnet, dafür werden die Punkte vorher verschoben)

   x= x-ox;Abstand zum Ursprung abziehen
   y= y-oy
   z= z-oz


   ;Drehung durchführen
   SinX# = Sin(yaw)
   SinY# = Sin(pitch)
   SinZ# = Sin(roll)

   CosX# = Cos(yaw)
   CosY# = Cos(pitch)
   CosZ# = Cos(roll)
      
   Tempy# = y * CosY - z * SinY
   Tempz# = y * SinY + z * CosY
   Tempx# = x * CosX - Tempz * SinX
      
   reZ = x * SinX + Tempz * CosX
   reX = Tempx * CosZ - TempY * SinZ
   reY = Tempx * SinZ + TempY * CosZ
   
   
   reX# = reX + ox;Abstand zum Ursprung addieren
   reY# = reY + oy
   reZ# = reZ + oz

End Function


Kann man, finde ich, immer mal brauchen.
Hoffe es ist hilfreich!
Das muss besser als perfekt!

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group