![]() |
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??? :?: |
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 |
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 |
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:
Hoffe das hilft soweit. Nen Screenie hab ich nicht, sorry.
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. |
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.
|
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! ![]() OBJEKT.Z:=Sin(Rot/60)*180/pi; sollte dir weiterhelfen! @wardz! |
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. |
Re: 3D Objekte steuern
Danke das war DER Tipp. :thuimb:
Ich habs jetzt hinbekommen das ich mein 3D Objekt bewegen kann. :wink: |
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 |
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 22:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz