Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 3D Objekte steuern (https://www.delphipraxis.net/13235-3d-objekte-steuern.html)

Wolverine 14. Dez 2003 14:14


3D Objekte steuern
 
Hi all,
kann sein das das Thema schon mal angesprochen wurde, ich hab aber per Suchfunktion nix gefunden, was mein Problem lösen würde.
Ich habe ein 3D Objekt mit 3D Studio Max erstellt und als 3ds Datei exportiert und in meinen Quellcde eingebunden.
Zu sehen ist das ganz was mich schon mal freut ( vor allem in 3D ^^).
Jetzt wollte ich dieses 3D Objekt über die Pfeiltasten (oder überhaupt per Tastatur) steuern.
Ein Bsp.: Wenn ich VK_UP drücke soll sich das 3D Objekt nach oben bewegen und wenn ich VK_LEFT drücke soll es sich nach links bewegen etc.
Nun würde ich gerne von euch wissen ob mir jemand weiterhelfen kann.
Das das ganze in eine if-Schleife muss ist mir klar, nur schon mal vorweg, und das man mit Koordinaten arbeiten muss auch 8)
Aber wie übertrage ich das ganze nun auf das 3D Objekt??? :?:

ATwardz 14. Dez 2003 17:45

Re: 3D Objekte steuern
 
Hi,

womit arbeitest du eigentlich? opengl direct 3D?
Ich weiss zwar nit wie du das Objekt eingebunden hast, aber zum bewegen musst du einfach nur in die Onkeydown Methode die Kooridinaten x,y,z entsprechend verändern!

Bsp: OpenGL

glrotate(rotation,x,y,z); //Drehung

um die Z-Achse

glrotate(rotation,0,0,1); //Drehung mit der Geschwindigkeit 1 um Z

Hoffe das es das ist was du suchst!

@wardz

Plague 14. Dez 2003 18:46

Re: 3D Objekte steuern
 
Hallo,

ich finde das Thema, dass Du da angesprochen hast sehr interessant. Was willst Du da genau programmieren? Hast Du schon einen Screenshot, den Du mal hier im Forum zeigen könntest???

MfG
Plague1

Wolverine 14. Dez 2003 20:15

Re: 3D Objekte steuern
 
Hi,
nein ATwardz, das ist leider nicht das was ich suche.
Ich poste mal den Quellcode, damit du weisst wie ich es eingebunden habe:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, opengl,
  ExtCtrls, gl3ds;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
   myDC : HDC;
   myRC : HGLRC;
   myPalette : HPALETTE;
   procedure SetupPixelFormat;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  model: TAll3dsMesh;

implementation

{$R *.DFM}
procedure TForm1.SetupPixelFormat;
var   hHeap: THandle;
  nColors, i: Integer;                     //Anzahl der Farben
  lpPalette : PLogPalette;                 //Die Farbpalette
  byRedMask, byGreenMask, byBlueMask: Byte; //Blau, Grün und Rot
  nPixelFormat: Integer;
  pfd: TPixelFormatDescriptor;             //Dies ist der "Descriptor"..in ihm werden die Infos
                                            //zwischengespeichert
begin
  FillChar(pfd, SizeOf(pfd), 0);
  with pfd do begin                        //wir wollen das Format bearbeiten
    nSize    := sizeof(pfd);              // Länge der pfd-Struktur
    nVersion := 1;                        // Version
    dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or
                 PFD_DOUBLEBUFFER;         // Flags
    iPixelType:= PFD_TYPE_RGBA;            // RGBA Pixel Type
    cColorBits:= 24;                       // 24-bit color
    cDepthBits:= 32;                       // 32-bit depth buffer
    iLayerType:= PFD_MAIN_PLANE;           // Layer Type
  end;
  nPixelFormat:= ChoosePixelFormat(myDC, @pfd);
  SetPixelFormat(myDC, nPixelFormat, @pfd);
                                            // Farbpalettenoptimierung wenn erforderlich
  DescribePixelFormat(myDC, nPixelFormat,
                      sizeof(TPixelFormatDescriptor),pfd);
  if ((pfd.dwFlags and PFD_NEED_PALETTE) <> 0) then begin
    nColors := 1 shl pfd.cColorBits;
    hHeap   := GetProcessHeap;
    lpPalette:= HeapAlloc
       (hHeap,0,sizeof(TLogPalette)+(nColors*sizeof(TPaletteEntry)));
    lpPalette^.palVersion := $300;
    lpPalette^.palNumEntries := nColors;
    byRedMask := (1 shl pfd.cRedBits) - 1;
    byGreenMask:= (1 shl pfd.cGreenBits) - 1;
    byBlueMask := (1 shl pfd.cBlueBits) - 1;
    for i := 0 to nColors - 1 do begin
      lpPalette^.palPalEntry[i].peRed :=
        (((i shr pfd.cRedShift) and byRedMask) *255)DIV byRedMask;
      lpPalette^.palPalEntry[i].peGreen:=
        (((i shr pfd.cGreenShift)and byGreenMask)*255)DIV byGreenMask;
      lpPalette^.palPalEntry[i].peBlue :=
        (((i shr pfd.cBlueShift) and byBlueMask) *255)DIV byBlueMask;
      lpPalette^.palPalEntry[i].peFlags:= 0;
    end;
    myPalette:= CreatePalette(lpPalette^);
    HeapFree(hHeap, 0, lpPalette);
    if (myPalette <> 0) then begin
      SelectPalette(myDC, myPalette, False);
      RealizePalette(myDC);
    end;
  end;
end;

procedure render;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
glLoadIdentity;                                     // World Matrix zurücksetzen

gltranslatef(0,0,-12);
glrotatef(45,0.5,1,0);
glscalef(0.1,0.1,0.1);
model.Render;

SwapBuffers(form1.myDC);                            //scene ausgeben
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
form1.myDC:= GetDC(Handle);
SetupPixelFormat;
myRC:= wglCreateContext(myDC);
wglMakeCurrent(myDC, myRC);
glEnable(GL_DEPTH_TEST);
glLoadIdentity;

model:=TAll3DSMesh.Create(nil);
model.TexturePath:='textur\Tex.bmp';
model.LoadFromFile('teekanne.3ds');

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

model.Free;

wglmakecurrent(0,0);
wgldeletecontext(mydc);
releasedc(handle,mydc);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
glViewport(0, 0, Width, Height);   // Setzt den Viewport für das OpenGL Fenster
glMatrixMode(GL_PROJECTION);       // Matrix Mode auf Projection setzen
glLoadIdentity();                  // Reset View
gluPerspective(45.0, Width/Height, 1, 100.0); // Perspektive den neuen Maßen anpassen.
glMatrixMode(GL_MODELVIEW);        // Zurück zur Modelview Matrix
glLoadIdentity();
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
render;
end;

end.
Hoffe das hilft soweit. Nen Screenie hab ich nicht, sorry.

Wolverine 14. Dez 2003 20:17

Re: 3D Objekte steuern
 
Ich hatte vor eine kleine 3D Welt zu programmieren in der man sich bewegen kann. Und auf diese Kenntnisse aufbauent, dann evtl. ein kleines 3D Game.

ATwardz 15. Dez 2003 18:43

3D Objekte steuern
 
Hi,

im Grunde ist es schon die Lösung denke ich! Das Problem ist, das ich die Unit gl3ds nicht habe und desswegen nicht ausprobieren kann wie es geht!

Auf dieser Website findest du Hilfe denke ich jedoch ist es eine andere Methode!

3D Studio Max Dateien in Delphi einbinden

OBJEKT.Z:=Sin(Rot/60)*180/pi;

sollte dir weiterhelfen!


@wardz!

Wolverine 16. Dez 2003 13:27

Re: 3D Objekte steuern
 
Hi,
das hat mir zwar nicht direkt weitergeholfen, aber vielleicht kann ich daraus ja was entwickeln.
Trotzdem Danke für den Link.

Wolverine 16. Dez 2003 13:58

Re: 3D Objekte steuern
 
Danke das war DER Tipp. :thuimb:
Ich habs jetzt hinbekommen das ich mein 3D Objekt bewegen kann. :wink:

ATwardz 17. Dez 2003 14:21

Re: 3D Objekte steuern
 
Ha ich mir nämlich gedacht , da dein Prog. ja auf open GL basiert und da ist die Ansteuerung immer gleich! :-D

Na dann noch viel Erfolg!

@wardz

Wolverine 17. Dez 2003 14:40

Re: 3D Objekte steuern
 
Hi,
stimmt schon, die Steuerung ist meistens ähnlich.
Wenn einer Interesse hat, poste ich mal gerne meine Lösung für "Nach-OpenGL-Programmierer" :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz