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

Aktuelle Zeit: Fr Jul 18, 2025 00:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Okt 10, 2005 07:26 
Offline
DGL Member
Benutzeravatar

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

ich möchte die Position, die Blickrichtung und den Upvector aus der aktuellen Matrix errechnen.
Soweit ich weiß ist die Position in den ersten drei Elementen der vierten Matrixspalte enthalten.
Wie komme ich aber jetzt an die Blickrichtung un den Upvector?

Danke!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 09:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
http://wiki.delphigl.com/index.php/Matrix

Erste Spalte(bzw. die ersten 3 Elemente davon): X- Achse
Zweite Spalte: Y-Achse
dritte Spalte: Z-Achse
vierte wie du schon richtig gesagt hattest die Position.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: erst mal danke, aber...
BeitragVerfasst: Mo Okt 10, 2005 09:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
so weit, so gut...

mein Verständnis der Sache ist die, dass die einzelnen Spalten Vektoren darstellen. Mit einem
Vektor wird aber ein Punkt im Koordinatensystem beschrieben. Wie bekomme ich also aus einem
Punkt eine Drehung errechnet??? Und wie einen Upvector???


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 15:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Sag mir erstmal wofür du das brauchst und was du unter einen UpVektor verstehst.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 15:19 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@Flo: Na der Up Vector gibt an wo oben ist. Den brauch man um eine Ansicht in 3D zu spezifizieren. Guck mal bei gluLookAt.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 15:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Also wenn ich den WIki Artikel richtig verschaden habe dann ist dies der Vektor (0,1,0) wenn die Projektions und Modelview matrix Identitätsmatrizen sind.

Die Frage nach dem Up-Vektor lautet also etwas anders formuliert, wie kann ich das einwirken der Modelview und Projektionsmatrix rückgängig machen. Du brauchst also eigentlich nur gluUnProject mit den richtigen Parametern aufrufen und du hast deinen Upvektor. Also die ersten 3 Parameter sind die Komponenten von (0,1,0), modelview, projection, viewport dürfte klar sein und das Ergebnis ist der gesuchte Upvektor für die übergebene Model und Projektionsmatrix.

Eventuel kürtzt sich durch die Nullen noch viel raus wenn du die Rechung per Hand und nicht per gluUnProject machst.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 16:04 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Zitat:
Also wenn ich den WIki Artikel richtig verschaden habe dann ist dies der Vektor (0,1,0) wenn die Projektions und Modelview matrix Identitätsmatrizen sind.

Der Up Vektor müßte dann in der zweiten Spalte der Matrix stehen. Schließlich sind die Spaltenvektoren die Einheitsvektoren im neuen Koordinantensystem.


Zuletzt geändert von LarsMiddendorf am Mo Okt 10, 2005 16:20, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 16:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Hatte ich zuerst auch gedacht das er das will, aber was will er mit so einen transformierten UpVektor der keiner mehr ist ?

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: danke, danke, danke...
BeitragVerfasst: Di Okt 11, 2005 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
zuerst einmal Dank an alle die versucht haben die Dunkelheit in meinem Programmiererhirn mit etwas Erleuchtung zu vertreiben!

Ich hatte irgendwie Tomaten auf den Augen. Es ist mir jetzt klar, dass die ersten drei Spaltzen die Ausrichtung der Ebenen (X/Y/Z) angeben. Ich brauche also immer nur zwei Informationen um die Ausrichtung meines aktuellen Koordinatensytems zu erhalten. Ist die Matrix

1,0,0,0
0,1,0,0
0,0,1,0
0,0,0,1

stimmt sie mit dem Basiskoordinatensystem überein. Ist sie

1,1,0,0
0,1,0,0
0,0,1,0
0,0,0,1

ist mein Koordinatensystem um 45° gedreht. In der Matrix stehen übrigens nicht die Einheitsvektoren sondern die "ungekürzten" Vektoren.

Das Problem was ich hatte war folgendes: Ich habe eine Kamera und kann auch schön um alle drei Achsen drehen und die kamera in jede beliebige Richtung verschieben. Auch die Blickrichtung kann ich beliebig verändern. mein Problem war, dass ich den drehpunkt nicht ändern kann. der liegt immer im 0-Punkt des Basis Koordinatensystems. Ich sitze jetzt schon bald zwei Monate an diesem Problem und werde bald verrückt.

Den UpVector brauchte ich um bei einer Positionsänderung die Lage nicht ändern zu müssen.

Ich habe mal ein paar Kameramodule angefügt. Benötigte Definitionen findet man im ersten Modul als Kommentar.

Kamera basierend auf Matrix Operationen:
Code:
  1.  
  2. unit Camera;
  3.  
  4. interface
  5.  
  6.   Uses DglOpenGL, OpenGLUtil, Windows, Classes;
  7.  
  8.   //type
  9.   //TArrMatrix = array [0..15] of TGLFloat;
  10.   //TGLVector = packed record
  11.   //  X,Y,Z: GLfloat;
  12.   //end;
  13.  
  14.   type TCameraMatrix=Class
  15.     Matrix: TArrMatrix;
  16.     InverseMatrix: TArrMatrix;
  17.     procedure Identity;
  18.     procedure Load(M: TArrMatrix);
  19.     constructor Create;
  20.   end;
  21.  
  22.   TCamera=Class
  23.     CameraMatrix: TCameraMatrix;
  24.     Enabled  : boolean;
  25.     Initiated: boolean;
  26.     constructor Create;
  27.     destructor Destroy;
  28.     function Position: TGLvector;
  29.     function UpVector: TGLvector;
  30.     function ViewDirection: TGLvector;
  31.     procedure RestorePosition(pos: integer);
  32.     procedure SavePosition(pos: integer);
  33.     procedure RotateCamera(ix, iy, iz: TGLdouble);
  34.     procedure TranslateCamera(ix, iy, iz: TGLdouble);
  35.     procedure CameraHome;
  36.     procedure PositionCamera(PositionVec: TGLvector;
  37.                                    ViewVec: TGLvector;
  38.                                    upVec: TGLvector);
  39.     procedure Apply;
  40.   private
  41.     HomeMatrix: TCameraMatrix;
  42.     PosArray: array [0..9] of TCameraMatrix;
  43.     FCameraDistance: TGLvector;
  44.     FPointOfRotation: TGLvector;
  45.     procedure LogMatrix(Header: string; M: TArrMatrix);
  46.     procedure Identity;
  47.     procedure RotateMatrix(ix, iy, iz: TGLdouble);
  48.     procedure Offset(x, y, z: TGLfloat);
  49.     procedure RotateRoundAxis(r: TGLfloat; axis: integer);
  50.   published
  51.     property CameraDistance: TGLvector read FCameraDistance;
  52.     property PointOfRotation: TGLvector read FPointOfRotation;
  53.   end;
  54.   TPCamera=^TCamera;
  55.  
  56. const
  57.   AXIS_X: integer = 0;
  58.   AXIS_Y: integer = 1;
  59.   AXIS_Z: integer = 2;
  60.  
  61. var
  62.   LogFile: TextFile;
  63.  
  64. implementation
  65.  
  66. (*
  67. function GetArrIdentity:TArrMatrix;
  68. begin
  69.   result[0]:=1.0;result[1]:=0.0;result[2]:=0.0;result[3]:=0.0;
  70.   result[4]:=0.0;result[5]:=1.0;result[6]:=0.0;result[7]:=0.0;
  71.   result[8]:=0.0;result[9]:=0.0;result[10]:=1.0;result[11]:=0.0;
  72.   result[12]:=0.0;result[13]:=0.0;result[14]:=0.0;result[15]:=1.0;
  73. end;
  74.  
  75. function InvertMatrix (src: TArrMatrix; var inverse: TArrMatrix): boolean;
  76. var
  77.   t: TGLdouble;
  78.   i, j, k, swap: integer;
  79.   tmp: TMatrix;
  80. begin
  81.   result := false;
  82.   inverse := GetArrIdentity;
  83.  
  84.   for i := 0 to 3 do
  85.   begin
  86.     for j := 0 to 3 do
  87.     begin
  88.       tmp[i][j] := src[i*4+j];
  89.     end;
  90.   end;
  91.  
  92.   for i := 0 to 3 do
  93.   begin
  94.     // look for largest element in column.
  95.     swap := i;
  96.     for j := i+1 to 3 do
  97.     begin
  98.       if abs(tmp[j][i]) > abs(tmp[i][i]) then
  99.       begin
  100.         swap := j;
  101.       end;
  102.     end;
  103.  
  104.     if not (swap = i) then
  105.     begin
  106.       // swap rows.
  107.       for k := 0 to 3 do
  108.       begin
  109.         t := tmp[i][k];
  110.         tmp[i][k] := tmp[swap][k];
  111.         tmp[swap][k] := t;
  112.  
  113.         t := inverse[i*4+k];
  114.         inverse[i*4+k] := inverse[swap*4+k];
  115.         inverse[swap*4+k] := t;
  116.       end;
  117.     end;
  118.  
  119.     if tmp[i][i] = 0 then
  120.     begin
  121.     { no non-zero pivot.  the matrix is singular, which
  122.       shouldn't happen.  This means the user gave us a bad
  123.       matrix. }
  124.       exit;
  125.     end;
  126.  
  127.     t := tmp[i][i];
  128.     for k := 0 to 3 do
  129.     begin
  130.       tmp[i][k] := tmp[i][k]/t;
  131.       inverse[i*4+k] := inverse[i*4+k]/t;
  132.     end;
  133.  
  134.     for j := 0 to 3 do
  135.     begin
  136.       if not (j = i) then
  137.       begin
  138.         t := tmp[j][i];
  139.         for k := 0 to 3 do
  140.         begin
  141.           tmp[j][k] := tmp[j][k]-tmp[i][k]*t;
  142.           inverse[j*4+k] := inverse[j*4+k]-inverse[i*4+k]*t;
  143.         end;
  144.       end;
  145.     end;
  146.   end;
  147.   result := true;
  148. end;
  149. *)
  150. constructor TCameraMatrix.Create;
  151. begin
  152.   Identity;
  153. end;
  154.  
  155. procedure TCameraMatrix.Identity;
  156. var
  157.   i: integer;
  158. begin
  159.   Matrix := GetArrIdentity;
  160.   InverseMatrix := GetArrIdentity;
  161. end;
  162.  
  163. procedure TCameraMatrix.Load(M: TArrMatrix);
  164. var
  165.   i: integer;
  166. begin
  167.   for i:=0 to 15 do
  168.     Matrix[i]:=M[i];
  169.   InvertMatrix (M, InverseMatrix);
  170. end;
  171.  
  172.  
  173. procedure TCamera.RotateRoundAxis(r: TGLfloat; axis: integer);
  174. var
  175.   newMatrix: TArrMatrix;
  176. begin
  177.   glMatrixMode (GL_MODELVIEW);
  178.  
  179.   glPushMatrix();
  180.  
  181.   glLoadMatrixf(@CameraMatrix.Matrix);
  182.  
  183.   if(axis=AXIS_X) then
  184.     glRotatef(r,1,0,0);
  185.  
  186.   if(axis=AXIS_Y) then
  187.     glRotatef(r,0,1,0);
  188.  
  189.   if(axis=AXIS_Z) then
  190.     glRotatef(r,0,0,1);
  191.  
  192.   glGetFloatv(GL_MODELVIEW_MATRIX, @newMatrix);
  193.  
  194.   CameraMatrix.Load(newMatrix);
  195.  
  196.   glPopMatrix();
  197. end;
  198.  
  199. constructor TCamera.Create;
  200. var
  201.   i: integer;
  202. begin
  203.   AssignFile (LogFile, '.\CAMERALOG.TXT');
  204.   Rewrite (LogFile);
  205.  
  206.   Initiated := false;
  207.   CameraMatrix := TCameraMatrix.Create;
  208.   HomeMatrix := TCameraMatrix.Create;
  209.   for i := 0 to 9 do
  210.     PosArray[i] := TCameraMatrix.Create;
  211. end;
  212.  
  213. procedure TCamera.Identity;
  214. begin
  215.   CameraMatrix.Identity;
  216.   HomeMatrix.Identity;
  217.  
  218.   Enabled := true;
  219. end;
  220.  
  221. destructor TCamera.Destroy;
  222. var
  223.   i: integer;
  224. begin
  225.   HomeMatrix.Free;
  226.   CameraMatrix.Free;
  227.   for i := 0 to 9 do
  228.     PosArray[i].Free;
  229. end;
  230.  
  231. procedure TCamera.Offset(x, y, z: TGLfloat);
  232. var
  233.   newMatrix: TArrMatrix;
  234. begin
  235.   glMatrixMode (GL_MODELVIEW);
  236.   glPushMatrix();
  237.   glLoadIdentity();
  238.   glTranslatef(x,y,z);
  239.   glGetFloatv(GL_MODELVIEW_MATRIX, @newMatrix);
  240.   LogMatrix ('Offset', newMatrix);
  241.  
  242.   MatrixMultiply(newMatrix,CameraMatrix.Matrix,newMatrix);
  243.   CameraMatrix.Load(newMatrix);
  244.   glPopMatrix();
  245.  
  246.   FCameraDistance.X := FCameraDistance.X + x;
  247.   FCameraDistance.Y := FCameraDistance.Y + y;
  248.   FCameraDistance.Z := FCameraDistance.Z + z;
  249.   writeln (LogFile, 'Distance: ', FCameraDistance.X,
  250.                                   FCameraDistance.Y,
  251.                                   FCameraDistance.Z);
  252. end;
  253.  
  254.  
  255. procedure TCamera.PositionCamera(PositionVec: TGLvector;
  256.                                        ViewVec: TGLvector;
  257.                                        upVec: TGLvector);
  258. var
  259.   newMatrix: TArrMatrix;
  260. begin
  261.   writeln (LogFile, 'Position: ', PositionVec.X, Positionvec.Y, PositionVec.Z);
  262.   writeln (LogFile, 'View    : ', ViewVec.X, ViewVec.Y, ViewVec.Z);
  263.   writeln (LogFile, 'Up      : ', upVec.X, upVec.Y, upVec.Z);
  264.  
  265.   FPointOfRotation := ViewVec;
  266.  
  267.   Identity;
  268.  
  269.   glMatrixMode (GL_MODELVIEW);
  270.   glPushMatrix;
  271.   glLoadIdentity;
  272.   gluLookAt (PositionVec.X, PositionVec.Y, PositionVec.Z,
  273.              ViewVec.X, ViewVec.Y, ViewVec.Z,
  274.              upVec.X, upVec.Y, upVec.Z);
  275.   glGetFloatv(GL_MODELVIEW_MATRIX, @newMatrix);
  276.   CameraMatrix.Load(newMatrix);
  277.   HomeMatrix.Load(newMatrix);
  278.   LogMatrix ('PositionCamera', newMatrix);
  279.   if not Initiated then
  280.   begin
  281.     SavePosition (1);
  282.     Initiated := true;
  283.   end;
  284.  
  285.   glPopMatrix;
  286.  
  287.   FCameraDistance.X := PositionVec.X + ViewVec.X;
  288.   FCameraDistance.Y := PositionVec.Y + ViewVec.Y;
  289.   FCameraDistance.Z := PositionVec.Z + ViewVec.Z;
  290.   writeln (LogFile, 'Distance: ', FCameraDistance.X,
  291.                                   FCameraDistance.Y,
  292.                                   FCameraDistance.Z);
  293. end;
  294.  
  295. // Move the camera to the home position
  296. procedure TCamera.CameraHome;
  297. begin
  298.   CameraMatrix.Load(HomeMatrix.Matrix);
  299. end;
  300.  
  301. procedure TCamera.SavePosition (pos: integer);
  302. var
  303.   saveMatrix: TArrMatrix;
  304. begin
  305.   if (pos < 0) or (pos > 9) then
  306.     exit;
  307.  
  308.   glMatrixMode (GL_MODELVIEW);
  309.   glGetFloatv(GL_MODELVIEW_MATRIX, @saveMatrix);
  310.   PosArray[pos].Load(saveMatrix);
  311. end;
  312.  
  313. procedure TCamera.RestorePosition (pos: integer);
  314. begin
  315.   if (pos < 0) or (pos > 9) then
  316.     exit;
  317.  
  318.   CameraMatrix.Load(PosArray[pos].Matrix);
  319. end;
  320.  
  321. procedure TCamera.TranslateCamera(ix, iy, iz: TGLdouble);
  322. begin
  323.   Offset (ix, iy, iz);
  324. end;
  325.  
  326. procedure TCamera.RotateCamera(ix, iy, iz: TGLdouble);
  327. begin
  328.   RotateMatrix (ix, iy, iz);
  329. end;
  330.  
  331. procedure TCamera.Apply;
  332. begin
  333.   if not Enabled then
  334.     exit;
  335.  
  336.   glMatrixMode (GL_MODELVIEW);
  337.   //glLoadIdentity;
  338.   //gluLookAt (CameraMatrix.Matrix[12], CameraMatrix.Matrix[13], CameraMatrix.Matrix[14],
  339.   //           CameraMatrix.Matrix[04], CameraMatrix.Matrix[05], CameraMatrix.Matrix[06],
  340.   //           CameraMatrix.Matrix[08], CameraMatrix.Matrix[09], CameraMatrix.Matrix[10]);
  341.   //glTranslatef (FPointOfRotation.X,
  342.   //              FPointOfRotation.Y,
  343.   //              FPointOfRotation.Z);
  344.   glLoadMatrixf(@CameraMatrix.Matrix);
  345. end;
  346.  
  347. procedure TCamera.RotateMatrix (ix, iy, iz: TGLdouble);
  348. begin
  349.   // um den austausch von verschiedenen kameramodulen so einfach
  350.   // wie möglich zu gestalten, wird hier ein bisschen zwischen
  351.   // X/Y/Z hin- und hergetauscht...
  352.   if ix <> 0.0 then
  353.     RotateRoundAxis (-ix, AXIS_Y);
  354.   if iy <> 0.0 then
  355.     RotateRoundAxis (iy, AXIS_X);
  356.   if iz <> 0.0 then
  357.     RotateRoundAxis (iz*50, AXIS_Z);
  358. end;
  359.  
  360. function TCamera.Position: TGLvector;
  361. var
  362.   return: TGLvector;
  363. begin
  364.   // position: letzte Spalte der Matrix
  365.   InitVector (return,
  366.               CameraMatrix.Matrix[12],
  367.               CameraMatrix.Matrix[13],
  368.               CameraMatrix.Matrix[14]);
  369.   result := return;
  370. end;
  371.  
  372. function TCamera.ViewDirection: TGLvector;
  373. var
  374.   return: TGLvector;
  375. begin
  376.   // view direction: dritte Spalte der Matrix (Z-Achse)
  377.   InitVector (return,
  378.               CameraMatrix.Matrix[08],
  379.               CameraMatrix.Matrix[09],
  380.               CameraMatrix.Matrix[10]);
  381.   result := return;
  382. end;
  383.  
  384. function TCamera.UpVector: TGLvector;
  385. var
  386.   return: TGLvector;
  387. begin
  388.   // view direction: zweite Spalte der Matrix (Y-Achse)
  389.   InitVector (return,
  390.               CameraMatrix.Matrix[04],
  391.               CameraMatrix.Matrix[05],
  392.               CameraMatrix.Matrix[06]);
  393.  result := return;
  394. end;
  395.  
  396. procedure TCamera.LogMatrix (Header: string; M: TArrMatrix);
  397. begin
  398.   writeln (LogFile, Header);
  399.   writeln (LogFile, 'Matrix 1: ', M[00],
  400.                                   M[01],
  401.                                   M[02],
  402.                                   M[03]);
  403.   writeln (LogFile, 'Matrix 2: ', M[04],
  404.                                   M[05],
  405.                                   M[06],
  406.                                   M[07]);
  407.   writeln (LogFile, 'Matrix 3: ', M[08],
  408.                                   M[09],
  409.                                   M[10],
  410.                                   M[11]);
  411.   writeln (LogFile, 'Matrix 4: ', M[12],
  412.                                   M[13],
  413.                                   M[14],
  414.                                   M[15]);
  415. end;
  416.  
  417. end.
  418.  



Kamera basierend auf GluLookAt:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 11, 2005 17:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Wenn ich den Code da sehe muss ich erlich sagen du machst es dir viel zu schwer.

Wieso veränderst du die Kamara Matrix nicht einfach so:
* aktuelle Modellviewmatrix speichern
* Kamara Matrix laden
* glTranslate,glScalef oder auch glRoatef ausführen
* Kamara Matrix in der Variable abspeichern
* Modelviewmatrix von vorher wieder herstellen

die Position der Kamara erhälst du dann wie gesagt durch die vierte Spalte der Matrix. Die Koordiantenachsen !! nicht ebenen sind die Spalten der Martrix.

Daher ist dies keine Roationsmatrix:

1,1,0,0
0,1,0,0
0,0,1,0
0,0,0,1

sondern eine die das Bild nun ja komisch verzerrt

Schau einfach nacher mal bei den Mathematischen Tutorials vorbei:
http://www.delphigl.com/launcher.php?em=tutorials

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 08:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
ich dachte, dass ich genau das mache. wenn man sich die prozeduren RotateRoundAxis und Offset ansieht, dann wird doch genau das durchgeführt. wenn ich dann ein Apply mache und die so errechnete Matrix einsetze, dann ändert sich leider mein Rotationspunkt nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 15:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Nicht ganz, du machst laut obrigen code folgendes(achte auf die eingefügten Kommentare):
Code:
  1.  
  2. procedure TCamera.Offset(x, y, z: TGLfloat);
  3. var
  4.   newMatrix: TArrMatrix;
  5. begin
  6.   // Eine
  7. Verschiebungs Matrix erzeugen
  8.   glMatrixMode (GL_MODELVIEW);
  9.   glPushMatrix();
  10.   glLoadIdentity();
  11.   glTranslatef(x,y,z);
  12.   glGetFloatv(GL_MODELVIEW_MATRIX, @newMatrix);
  13.  
  14.   // Du multiplizierst sie von Hand anstat das OpenGL für dich machen zu lassen.
  15.   // Da ich MatrixMultiply nicht kenne weis ich nicht ob du die Martrizen in der richtigen Reinfolge übergibst.
  16.   MatrixMultiply(newMatrix,CameraMatrix.Matrix,newMatrix);
  17. {...}
  18.  


Wieso machst du das hier nicht so wie in RotateRoundAxis? Dann schleichen sich auch keine Fehler ein. Denn es macht sehrwohl einen unterschied ob man erst rotiert und dann verschiebt oder erst verschiebt und dann rotiert.

Lese dir dazu am besten mal das Tutorial von Flash zum Thema OpenGL Matrizen durch. Außerdem kann ich mich nur wiederholen in dem ich dir rate zumindest passende Mathematik Tutorials durchzulesen.
z.B.
Objekt gedreht und dennoch nach vorne bewegt
Objekt immer um eigene Achse drehen

Ich habe die zwar noch nicht gelesen aber rein vom Titel her müssten die für dich interessant sein. ;)

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: einen versuch ist es wert
BeitragVerfasst: Do Okt 13, 2005 09:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
ich denke schon, dass ich das mit der reihenfolge usw. richtig verstanden habe. In einem hast Du aber recht: ich werde mal versuchen die Matritzenmultiplikation von OpenGL durchführen zu lassen.

Danke.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 16 Queries | GZIP : On ]