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

Aktuelle Zeit: Fr Jul 18, 2025 00:45

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Objectselection
BeitragVerfasst: Di Sep 19, 2006 21:22 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hi Leute, ich habe mal ne Frage. Im Zuge des Tutorials Objectselection habe ich einen kleinen Planeeditor geschrieben. Tja eigentlich funktioniert er ganz gut, aber er hat ein paar kleine Bugs, die ich einfach nicht wegbekomm....

Also der erste Cube (dem betrachter am naehsten auf der linken seite also mit den Coords (Min(X),Y=0,Max(Z))) der laesst sich nur in den seltensten Faellen so nach oben und unten ziehen, wie ich das will... Manchmal bewegen sich stattdessen auch andere Cubes aber das gabs schon einige Zeit nichtmehr. Im Normalfall laesst der Cube sich gar nicht bewegen oder er bewegt einen Cube hinter sich also den Cube, dessen Z Wert eins kleiner ist, als der abgesprochene...

Die andere Geschichte ist folgende: Bisher packt man einen Cube an, zieht, laesst los und zack ist er da. Eigentlich will ich aber, dass der Cube sich schon (virtuell) beim MouseMove bewegt (da bau ich dann noch ein Blending ein, dass er etwas transparent wirkt). Das umzusetzen ist ja an sich ganz simpel. Eben das ganze ins MouseMove rein etc. allerdings wird der Cube nur sehr wenig bewegt, wenn ich ihn per MouseMove nach oben oder unten ziehe, anstatt dass er sich die ganze Zeit mit meiner Mouse mitbewegt. Tja an sich wären Bilder besser, aber ich habe grad kein vernünftiges Grafikprogramm zur Hand und mit Paint will ich mich nicht abmuehen.

Hoffe ihr versteht das Prob.
Sourcecode (komplett mit allen Auskommentierungen, die ich vllt noch irgendwie rausnehmen würde etc...)

Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.  
  12.     Timer1: TTimer;
  13.     procedure FormCreate(Sender: TObject);
  14.     procedure FormResize(Sender: TObject);
  15.     procedure FormDestroy(Sender: TObject);
  16.     procedure Timer1Timer(Sender: TObject);
  17.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  18.       Shift: TShiftState; X, Y: Integer);
  19.     procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  20.       Y: Integer);
  21.     procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
  22.       Shift: TShiftState; X, Y: Integer);
  23.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  24.       Shift: TShiftState);
  25.   private
  26.     procedure SetupGL();
  27.     procedure Render();
  28.     function Selection(x,y:integer):integer;
  29.   public
  30.     DC                                : HDC;  //Handle auf Zeichenfläche
  31.     RC                                : HGLRC;//Rendering Context
  32.   end;
  33.  
  34. const
  35.   NearClipping=1;
  36.   FarClipping =1000;
  37.   X = 15;
  38.   Y = 15;
  39.   Diff = 0.05;
  40.   Dist = 0.4;
  41.  
  42. var
  43.   Form1: TForm1;
  44.  
  45. implementation
  46.  
  47. uses dglOpenGL;
  48.  
  49. {$R *.dfm}
  50.  
  51. type TMap = Array[1..X,1..Y] of packed record
  52.       X: Real;
  53.       Y: Real;
  54.       Z: Real;
  55.      end;
  56.  
  57. var Map:TMap;
  58.     intnames : Array[-1..X*Y] of Integer;
  59.     names : Array[-1..X*Y] of String;
  60.     MX, MY, LastSelected, Hover: integer;
  61.     NewMZ, TranslateZ, TranslateX:Real;
  62.     Clicked: Boolean =FALSE;
  63.  
  64. procedure TForm1.FormCreate(Sender: TObject);
  65. var i,j:Integer;
  66. begin
  67.   for i:=1 to X do
  68.   begin
  69.     for j:=1 to Y do
  70.     begin
  71.       if (i=1) and (j=1) then
  72.       begin
  73.         Map[i,j].X := Dist;
  74.         Map[i,j].Y := 0;
  75.         Map[i,j].Z := Dist;
  76.       end
  77.       else if (i=1) then
  78.       begin
  79.         Map[i,j].X := Map[i,j-1].X+Dist;
  80.         Map[i,j].Y := 0;
  81.         Map[i,j].Z := Map[i,j-1].Z;
  82.       end
  83.       else if (j=1) then
  84.       begin
  85.         Map[i,j].X := Map[i-1,j].X;
  86.         Map[i,j].Y := 0;
  87.         Map[i,j].Z := Map[i-1,j].Z+Dist;
  88.       end
  89.       else
  90.       begin
  91.         Map[i,j].X := Map[i,j-1].X+Dist;
  92.         Map[i,j].Y := 0;
  93.         Map[i,j].Z := Map[i,j-1].Z;
  94.       end;
  95.     end;
  96.   end;
  97.  
  98. //  names[-1]:='nichts';
  99.   names[0]:='';
  100.   for i:=0 to X*Y do
  101.   begin
  102.     intnames[i]:=i;
  103.     names[i]:='objekt '+inttostr(i DIV X)+'-'+inttostr(i MOD Y);
  104.   end;
  105.  
  106.  
  107.   DC := GetDC(Handle);
  108.   RC := CreateRenderingContext(DC,          //Device Contest
  109.                                [opDoubleBuffered], //Optionen
  110.                                32,          //ColorBits
  111.                                24,          //ZBits
  112.                                0,           //StencilBits
  113.                                0,           //AccumBits
  114.                                0,           //AuxBuffers
  115.                                0);          //Layer
  116.   ActivateRenderingContext(DC, RC);
  117.   SetupGL();
  118. end;
  119.  
  120. procedure TForm1.SetupGL();
  121. begin
  122.   glClearColor(0.0, 0.0 ,0.0, 0.5); //Hintergrundfarbe
  123.   glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  124. //  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
  125. end;
  126.  
  127. procedure TForm1.FormResize(Sender: TObject);
  128. begin
  129.   glViewport(0, 0, form1.clientWidth, form1.clientHeight);    // Setzt den Viewport für das OpenGL Fenster
  130.   glMatrixMode(GL_PROJECTION);        // Matrix Mode auf Projection setzen
  131.   glLoadIdentity();                   // Reset View
  132.   gluPerspective(45.0, form1.clientWidth/form1.clientHeight, 1, 1000);  // Perspektive den neuen Maßen anpassen.
  133.   glMatrixMode(GL_MODELVIEW);         // Zurück zur Modelview Matrix
  134.   glLoadIdentity();
  135. end;
  136.  
  137. procedure TForm1.Render();
  138. var i,j:integer;
  139. begin
  140.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  141.   glMatrixMode(GL_MODELVIEW);
  142.   glLoadIdentity();
  143.  
  144.   glPushMatrix();
  145.   glTranslatef(-2+TranslateX,-1,-7+TranslateZ);
  146.   glColor3f(1,1,1);
  147.  
  148.   glBegin(GL_LINES);
  149.     glColor3f(1,1,0);
  150.     glVertex3f(-10,0,0);
  151.     glVertex3f(10,0,0);
  152.     glColor3f(0,1,0);
  153.     glVertex3f(0,-10,0);
  154.     glVertex3f(0,10,0);
  155.     glColor3f(0,0,1);
  156.     glVertex3f(0,0,-10);
  157.     glVertex3f(0,0,10);
  158.  
  159.     glColor3f(1,1,1);
  160.    
  161.       for i:=1 to X do
  162.       begin
  163.         for j:=1 to Y do
  164.         begin
  165.           if (i<>X) then
  166.           begin
  167.             glVertex3f(Map[i,j].X,Map[i,j].Y,Map[i,j].Z);
  168.             glVertex3f(Map[i+1,j].X,Map[i+1,j].Y,Map[i+1,j].Z);
  169.           end;
  170.  
  171.           if (j<>Y) then
  172.           begin
  173.             glVertex3f(Map[i,j].X,Map[i,j].Y,Map[i,j].Z);
  174.             glVertex3f(Map[i,j+1].X,Map[i,j+1].Y,Map[i,j+1].Z);
  175.           end;
  176.         end;
  177.       end;  
  178.     glEnd();
  179.  
  180.  
  181.   glColor3f(1,0,0);
  182.  
  183.   for i:=1 to X do
  184.   begin
  185.     for j:=1 to Y do
  186.     begin
  187.       glLoadName(i*X+j);
  188.       glBegin(GL_LINE_STRIP);
  189.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y-Diff,Map[i,j].Z-Diff);
  190.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y+Diff,Map[i,j].Z-Diff);
  191.  
  192.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y+Diff,Map[i,j].Z+Diff);
  193.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y-Diff,Map[i,j].Z+Diff);
  194.  
  195.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y-Diff,Map[i,j].Z-Diff);
  196.  
  197.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y-Diff,Map[i,j].Z-Diff);
  198.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y+Diff,Map[i,j].Z-Diff);
  199.  
  200.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y+Diff,Map[i,j].Z+Diff);
  201.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y-Diff,Map[i,j].Z+Diff);
  202.  
  203.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y-Diff,Map[i,j].Z-Diff);
  204.       glEnd();
  205.  
  206.       glBegin(GL_LINES);
  207.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y+Diff,Map[i,j].Z+Diff);
  208.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y+Diff,Map[i,j].Z+Diff);
  209.  
  210.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y+Diff,Map[i,j].Z-Diff);
  211.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y+Diff,Map[i,j].Z-Diff);
  212.  
  213.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y-Diff,Map[i,j].Z+Diff);
  214.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y-Diff,Map[i,j].Z+Diff);
  215.       glEnd();
  216.  
  217.     end;
  218.   end;
  219.  
  220.   glColor3f(1,1,1);
  221.   glEnable(GL_BLEND);
  222.   glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ZERO);
  223.   for i:=1 to X do
  224.   begin
  225.     for j:=1 to Y do
  226.     begin
  227.       if (Hover=i*X+J) then glColor3f(1,0,0);
  228.  
  229.       glLoadName(i*X+j);
  230.       glBegin(GL_QUAD_STRIP);
  231.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y-Diff,Map[i,j].Z-Diff);
  232.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y+Diff,Map[i,j].Z-Diff);
  233.  
  234.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y-Diff,Map[i,j].Z+Diff);
  235.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y+Diff,Map[i,j].Z+Diff);
  236.  
  237.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y-Diff,Map[i,j].Z+Diff);
  238.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y+Diff,Map[i,j].Z+Diff);
  239.  
  240.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y-Diff,Map[i,j].Z-Diff);
  241.         glVertex3f(Map[i,j].X+Diff,Map[i,j].Y+Diff,Map[i,j].Z-Diff);
  242.  
  243.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y-Diff,Map[i,j].Z-Diff);
  244.         glVertex3f(Map[i,j].X-Diff,Map[i,j].Y+Diff,Map[i,j].Z-Diff);
  245.       glEnd();
  246.  
  247.       if (Hover=i*X+J) then glColor3f(1,1,1);
  248.     end;
  249.   end;
  250.  
  251.   glDisable(GL_BLEND);
  252.   glPopMatrix();
  253.  
  254.   SwapBuffers(DC);
  255. end;
  256.  
  257. procedure TForm1.FormDestroy(Sender: TObject);
  258. begin
  259.   DeactivateRenderingContext;
  260.   DestroyRenderingContext(RC);
  261.   ReleaseDC(Handle, DC);
  262. end;
  263.  
  264. procedure TForm1.Timer1Timer(Sender: TObject);
  265. begin
  266.   Render();
  267. end;
  268.  
  269. function TForm1.Selection(x,y:integer) : integer;
  270. var
  271.   SelectBuffer       : array[0..512] of GLUInt;
  272.   Viewport     : TGLVectori4;
  273.   Treffer,i    : Integer;
  274.   Z_Wert       : GLUInt;
  275.   Getroffen    : GLUInt;
  276. begin
  277.   glGetIntegerv(GL_VIEWPORT, @viewport);
  278.   glSelectBuffer(512, @SelectBuffer);
  279.   glRenderMode(GL_SELECT);
  280.   glInitNames;
  281.   glPushName(0);
  282.   glMatrixMode(GL_PROJECTION);
  283.   glPushMatrix;
  284.     glLoadIdentity;
  285.     gluPickMatrix(X, viewport[3]-Y, 1.0, 1.0, viewport);
  286.     gluPerspective(45.0, ClientWidth/ClientHeight, 1, 1000);
  287.  
  288.     render;                                     //Die Szene zeichnen
  289.     glmatrixmode(gl_projection);                //Wieder in den Projektionsmodus
  290.   glPopMatrix;                                //um unsere alte Matrix wiederherzustellen
  291.  
  292.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  293.  
  294.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  295.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  296.   for i := 0 to Treffer-1 do
  297.   begin
  298.     if SelectBuffer[(i*4)+1] < Z_Wert then
  299.     begin
  300.      getroffen       := SelectBuffer[(i*4)+3];
  301.      Z_Wert := SelectBuffer[(i*4)+1];
  302.     end;
  303.   end;
  304. //ShowMessage(inttostr(getroffen));
  305.   Result := getroffen;
  306. end;
  307.  
  308.  
  309.  
  310. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  311.   Shift: TShiftState; X, Y: Integer);
  312. begin
  313.   Clicked:=TRUE;
  314.  
  315.   MX := x;
  316.   MY := y;
  317.   NewMZ := 0;
  318.  
  319.   Hover:=Selection(X,Y);
  320. end;
  321.  
  322. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  323.   Y: Integer);
  324. begin {
  325.   if Clicked = TRUE then
  326.   begin
  327.     if MY<Y then NewMZ:=NewMZ - (Y-MY)/100
  328.     else NewMZ:=NewMZ + (MY-Y)/100;   {
  329.     if MY<Y then NewMZ:=NewMZ-0.01
  330.     else NewMZ:=NewMZ+0.01;
  331. //       ShowMessage('hoch');
  332.  
  333.     LastSelected:=selection;
  334.   end;  }
  335.   if (Clicked=FALSE) then Hover:=Selection(X,Y);
  336.  
  337. end;
  338.  
  339. procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  340.   Shift: TShiftState; X, Y: Integer);
  341. begin
  342.   Clicked:=FALSE;
  343.  
  344.   if MY<Y then NewMZ:=NewMZ - (Y-MY)/100
  345.   else NewMZ:=NewMZ + (MY-Y)/100;
  346.  
  347.   LastSelected:=selection(MX,MY);
  348.  
  349.   if (LastSelected<100000) then
  350.   begin
  351.     Map[LastSelected DIV X,LastSelected MOD Y].Y := Map[LastSelected DIV X,LastSelected MOD Y].Y+NewMZ;
  352. //    ShowMessage(inttostr(LastSelected)+'- Div X: '+inttostr(LastSelected DIV X)+'- Div Y: '+inttostr(LastSelected MOD X));
  353.   end;
  354. end;
  355.  
  356. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  357.   Shift: TShiftState);
  358. begin
  359.   if (Key =vk_down) then TranslateZ:=TranslateZ-0.1
  360.   else if (Key =vk_up) then TranslateZ:=TranslateZ+0.1
  361.   else if (Key =vk_right) then TranslateX:=TranslateX-0.1
  362.   else if (Key =vk_left) then TranslateX:=TranslateX+0.1;
  363. end;
  364.  
  365. end.


Da @ mom mein Webspace spinnt, muss ich euch bitten, das Prog selbst zu compilieren, sonst haet ich ne Demo mit hochgeladen..
Danke schonmal im Vorraus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 20, 2006 11:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wegen dem Dragging: Einfach die alte und neue MousePos subtrahieren und entsprechend das Objekt translaten. Oder was war dein Problem?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 20, 2006 14:20 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Das macht er ja hier schon:
Code:
  1.  
  2. if MY<Y then NewMZ:=NewMZ - (Y-MY)/100
  3. else NewMZ:=NewMZ + (MY-Y)/100;


Das /100 is nur, weil die MouseCoordinaten ja in Pixeln angegeben werden und 20 Pixeln nicht im Mindesten 20 Achseneinheiten entsprechen bei der momentanen ZPosition. Mit 100 gehts recht gut, aber er zieht beim OnMouseMove trotzdem nur minimal, nicht die ganze Zeit, wenn ich die Maus bewege.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 20, 2006 16:14 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Schnapp dir mal einen Debugger und guck dir mal die Werte an. Ich glaube nicht, dass das so wies dort steht dem entspricht was du willst. Allerdings bin ich nach 8h arbeit zu "Betriebsblind" um deinen Code zu berichtigen. Guck dir einfach mal die Werte im Debugger an und vergleich die mit dem was du willst.

(If Debugg_Problem then DGL_Debug_Tutorial.enter)

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


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


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