Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Mai 15, 2024 10:48

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: mal wieder camera (mit Kameraklasse)
BeitragVerfasst: Sa Okt 01, 2005 17:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Hallo,

und schon wieder bin ich am Ende mitt meinen Nerven...

Ich habe eine Kameraklasse gebastelt, die sher gut funktioniert. Es gibt allerdings ein kleines, wenn auch sehr
nerviges Problem. Die Kamera kann um alle Achsen drehen und in allen Dimensionen bewegt werden. Die Szene
bewegt sich auch sehr schön, wie erwartet. das Problem ist, dass ich den Rotationspunkt nicht bewegen kann.
Obwohl ich pr (siehe Codebeispiel) beim bewegen (Translatecamera) immer neu berechne, bleibt dieser blöde
Punkt immer fix an der durch PositionCamera festgelegten Stelle. Es ist zum Haareraufen. Kann mir vielleicht
jemand hier aus der Patsche helfen?

Die benutzten funktionen (CrossProduct, Mormalize, ... und der verwendete Datentyp TGLvector) dürfte so oder
in anderer Form in Eueren Programmen wohl auch vorkommen. Deswegen habe ich die Deklarationen nicht
beigefügt. Die sind in meiner Unit OpenGLUtil deklariert.

Im Voraus vielen Dank,

Andy

Code:
  1.  
  2. unit Camera;
  3.  
  4. interface
  5.  
  6.   Uses DglOpenGL, OpenGLUtil, Windows, Classes;
  7.  
  8.   type TCamera = class
  9.     pr       : TGLvector;        // rotation point
  10.     vp       : TGLvector;        // Camera Position
  11.     vu       : TGLvector;        // View Up
  12.     Enabled  : boolean;
  13.     procedure RestorePosition(pos: integer);
  14.     procedure SavePosition(pos: integer);
  15.     procedure CameraHome;
  16.     procedure RotateCamera(ix, iy, iz: TGLdouble);
  17.     procedure TranslateCamera(ix, iy, iz: TGLdouble);
  18.     procedure PositionCamera(PositionVec: TGLvector;
  19.                                    ViewVec: TGLvector;
  20.                                    upVec: TGLvector);
  21.     procedure Apply;
  22.     constructor Create;
  23.   private
  24.     vd       : TGLvector;        // View Direction
  25.  
  26.     vpArr    : array [0..9] of TGLvector;   // store up to 10 positions
  27.     vdArr    : array [0..9] of TGLvector;   //            \"
  28.     vuArr    : array [0..9] of TGLvector;   //            \"
  29.     prArr    : array [0..9] of TGLvector;   //            \"
  30.  
  31.     // init werte
  32.     vpInit, vdInit, vuInit: TGLvector;
  33.   end;
  34.   TPCamera=^TCamera;
  35.  
  36. implementation
  37.  
  38. uses KanalUtil;
  39.  
  40. { TCamera }
  41.  
  42. constructor TCamera.Create;
  43. var
  44.   i: integer;
  45. begin
  46.   Enabled := false;
  47.   InitVector (vdInit, -1, -1, -1);
  48.   InitVector (vpInit, 1, 1, 1);
  49.   InitVector (vuInit, 0, 1, 0);
  50.   CameraHome;
  51.   for i := 0 to 9 do
  52.   begin
  53.     InitVector (vpArr[i], 0, 0, 0);
  54.     InitVector (vdArr[i], 0, 0, 0);
  55.     InitVector (vuArr[i], 0, 0, 0);
  56.     InitVector (prArr[i], 0, 0, 0);
  57.   end;
  58. end;
  59.  
  60. // Rotate (ix,iy) or roll (iz) the camera about the focal point
  61. procedure TCamera.RotateCamera(ix, iy, iz: TGLdouble);
  62. var
  63.   l_vp,l_vu,l_vd,right: TGLvector;
  64.   newvp,newr: TGLvector;
  65.   radius: TGLdouble;
  66.   dx,dy,dz: TGLdouble;
  67. begin
  68.   Normalize(vu, l_vu);
  69.   l_vp := vp;
  70.   Normalize(vd, l_vd);
  71.  
  72.   right := CrossProduct (l_vd, l_vu);
  73.   Normalize (right, right);
  74.  
  75.   // Handle the roll
  76.   if not (iz = 0) then
  77.   begin
  78.      vu.x := vu.x + iz * right.x;
  79.      vu.y := vu.y + iz * right.y;
  80.      vu.z := vu.z + iz * right.z;
  81.      Normalize(vu, vu);
  82.      exit;
  83.   end;
  84.  
  85.   // Distance from the rotate point
  86.   dx := vp.x - pr.x;
  87.   dy := vp.y - pr.y;
  88.   dz := vp.z - pr.z;
  89.   radius := sqrt(dx*dx + dy*dy + dz*dz);
  90.  
  91.   // Determine the new position
  92.   newvp.x := l_vp.x + ix * right.x + iy * l_vu.x - pr.x;
  93.   newvp.y := l_vp.y + ix * right.y + iy * l_vu.y - pr.y;
  94.   newvp.z := l_vp.z + ix * right.z + iy * l_vu.z - pr.z;
  95.   Normalize(newvp, newvp);
  96.   vp.x := pr.x + radius * newvp.x;
  97.   vp.y := pr.y + radius * newvp.y;
  98.   vp.z := pr.z + radius * newvp.z;
  99.  
  100.   // Get new right vector based on radius and current right
  101.   newr.x := vp.x + right.x - pr.x;
  102.   newr.y := vp.y + right.y - pr.y;
  103.   newr.z := vp.z + right.z - pr.z;
  104.   Normalize(newr, newr);
  105.   newr.x := pr.x + radius * newr.x - vp.x;
  106.   newr.y := pr.y + radius * newr.y - vp.y;
  107.   newr.z := pr.z + radius * newr.z - vp.z;
  108.  
  109.   vd.x := pr.x - vp.x;
  110.   vd.y := pr.y - vp.y;
  111.   vd.z := pr.z - vp.z;
  112.   Normalize(vd,vd);
  113.  
  114.   // Determine the new up vector
  115.   vu := CrossProduct (newr, vd);
  116.   Normalize (vu, vu);
  117. end;
  118.  
  119. // Move the camera to the home position
  120. procedure TCamera.CameraHome;
  121. var
  122.   right,newr: TGLvector;
  123.   radius: TGLdouble;
  124.   l_vu,l_vd: TGLvector;
  125.   dx,dy,dz: TGLdouble;
  126. begin
  127.   vp := vpInit;
  128.   vd := vdInit;
  129.   vu := vuInit;
  130.   pr := vdInit;
  131.  
  132.   Normalize(vu, l_vu);
  133.   Normalize(vd, l_vd);
  134.  
  135.   right := CrossProduct (l_vd, l_vu);
  136.   Normalize (right, right);
  137.   // Distance from the rotate point
  138.   dx := vp.x - pr.x;
  139.   dy := vp.y - pr.y;
  140.   dz := vp.z - pr.z;
  141.   radius := sqrt(dx*dx + dy*dy + dz*dz);
  142.  
  143.   // Get new right vector based on radius and current right
  144.   newr.x := vp.x + right.x - pr.x;
  145.   newr.y := vp.y + right.y - pr.y;
  146.   newr.z := vp.z + right.z - pr.z;
  147.   Normalize(newr, newr);
  148.   newr.x := pr.x + radius * newr.x - vp.x;
  149.   newr.y := pr.y + radius * newr.y - vp.y;
  150.   newr.z := pr.z + radius * newr.z - vp.z;
  151.  
  152.   vd.x := pr.x - vp.x;
  153.   vd.y := pr.y - vp.y;
  154.   vd.z := pr.z - vp.z;
  155.   Normalize(vd,vd);
  156.  
  157.   // Determine the new up vector
  158.   vu := CrossProduct (newr,vd);
  159.   Normalize (vu, vu);
  160. end;
  161.  
  162. // Translate (pan) the camera view point
  163. procedure TCamera.TranslateCamera(ix, iy, iz: TGLdouble);
  164. var
  165.   l_vd, l_vu, newr, right: TGLvector;
  166. begin
  167.   right := CrossProduct(vd,vu);
  168.   Normalize (right, right);
  169.  
  170.   vp.x := vp.x + (iy*vu.x + ix*right.x + iz*vd.x);
  171.   vp.y := vp.y + (iy*vu.y + ix*right.y + iz*vd.y);
  172.   vp.z := vp.z + (iy*vu.z + ix*right.z + iz*vd.z);
  173.  
  174.   pr.x := pr.x + (iy*vu.x + ix*right.x + iz*vd.x);
  175.   pr.y := pr.y + (iy*vu.y + ix*right.y + iz*vd.y);
  176.   pr.z := pr.z + (iy*vu.z + ix*right.z + iz*vd.z);
  177.  
  178.   vd.x := pr.x - vp.x;
  179.   vd.y := pr.y - vp.y;
  180.   vd.z := pr.z - vp.z;
  181.   Normalize(vd,vd);
  182. end;
  183.  
  184. procedure TCamera.Apply;
  185. var
  186.   viewX, viewY, viewZ: TGLdouble;
  187. begin
  188.   if not Enabled then
  189.     exit;
  190.  
  191.   viewX := vp.X + vd.X;
  192.   viewY := vp.Y + vd.Y;
  193.   viewZ := vp.Z + vd.Z;
  194.  
  195.   glMatrixMode(GL_MODELVIEW);
  196.   glLoadIdentity();
  197.   glDrawBuffer(GL_BACK_LEFT);
  198.  
  199.   gluLookAt(vp.X, vp.Y, vp.Z,
  200.             viewX, viewY, viewZ,
  201.             vu.X, vu.Y, vu.Z);
  202. end;
  203.  
  204. procedure TCamera.PositionCamera(PositionVec: TGLvector;
  205.                                        ViewVec: TGLvector;
  206.                                        upVec: TGLvector);
  207. begin
  208.   vpInit := PositionVec;
  209.   vdInit := ViewVec;
  210.   vuInit := UpVec;
  211.  
  212.   CameraHome;
  213. end;
  214.  
  215. procedure TCamera.SavePosition (pos: integer);
  216. begin
  217.   if not Enabled then
  218.     exit;
  219.  
  220.   if (pos < 0) or (pos > 9) then
  221.     exit;
  222.  
  223.   vpArr[pos] := vp;
  224.   vdArr[pos] := vd;
  225.   vuArr[pos] := vu;
  226.   prArr[pos] := pr;
  227. end;
  228.  
  229. procedure TCamera.RestorePosition (pos: integer);
  230. begin
  231.   if not Enabled then
  232.     exit;
  233.  
  234.   if (pos < 0) or (pos > 9) then
  235.     exit;
  236.  
  237.   vp := vpArr[pos];
  238.   vd := vdArr[pos];
  239.   vu := vuArr[pos];
  240.   pr := prArr[pos];
  241. end;
  242.  
  243. end.
  244.  


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.031s | 17 Queries | GZIP : On ]