3D Punkt um 3D Punkt drehen
Übersicht

![]() |
UNZBetreff: 3D Punkt um 3D Punkt drehen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group