Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 3D Kugel mit OpenGL (https://www.delphipraxis.net/94883-3d-kugel-mit-opengl.html)

Loni 27. Jun 2007 17:00


3D Kugel mit OpenGL
 
Beim compilieren meines Quellcodes bekomme ich immer eine Fehlermeldung ich verstehe aber nicht was falsch iich ast.
Den Code fuer die 3DKugel habe ich aus dem Internet und so wirklich kommentiert war dieser nicht.

Fehlermeldung:
Delphi-Quellcode:
[DCC Fehler] KyteUnit.pas(58): E2005 'TVector3f' ist kein gültiger Typenbezeichner
[DCC Fehler] KyteUnit.pas(58): E2005 'TVector3f' ist kein gültiger Typenbezeichner
[DCC Fehler] KyteUnit.pas(65): E2005 'TVector3f' ist kein gültiger Typenbezeichner
[DCC Fehler] KyteUnit.pas(65): E2005 'TVector3f' ist kein gültiger Typenbezeichner
[DCC Fehler] KyteUnit.pas(72): E2005 'TVector2f' ist kein gültiger Typenbezeichner
[DCC Fehler] KyteUnit.pas(78): E2005 'TVector3f' ist kein gültiger Typenbezeichner
[DCC Fehler] KyteUnit.pas(85): E2005 'TVector4i' ist kein gültiger Typenbezeichner
[DCC Fehler] KyteUnit.pas(95): E2005 'TVector3f' ist kein gültiger Typenbezeichner
[DCC Fehler] KyteUnit.pas(95): E2005 'TVector2f' ist kein gültiger Typenbezeichner
[DCC Fehler] KyteUnit.pas(96): E2007 Konstante oder Typenbezeichner erwartet
[DCC Fehler] KyteUnit.pas(97): E2007 Konstante oder Typenbezeichner erwartet
[DCC Fehler] KyteUnit.pas(98): E2007 Konstante oder Typenbezeichner erwartet
[DCC Fehler] KyteUnit.pas(104): E2007 Konstante oder Typenbezeichner erwartet
[DCC Fehler] KyteUnit.pas(105): E2007 Konstante oder Typenbezeichner erwartet
[DCC Fehler] KyteUnit.pas(317): E2008 Inkompatible Typen
[DCC Fehler] Kyte.dpr(5): F2063 Verwendete Unit 'KyteUnit.pas' kann nicht compiliert werden

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls, StdCtrls, AppEvnts, ExtCtrls, OpenGL;

type
  TFKyte = class(TForm)
    MainMenu1: TMainMenu;
    StatusBar: TStatusBar;
    Datei1: TMenuItem;
    Bearbeiten1: TMenuItem;
    procedure FormResize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure IdleHandler(Sender: TObject; var Done: Boolean);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    StartTime, TimeCount, FrameCount : Cardinal; //FrameCounter
    Frames, DrawTime                 : Cardinal; //& Timebased Movement
     myDC : HDC;
     myRC : HGLRC;
     myPalette : HPALETTE;
     procedure SetupPixelFormat;
     procedure ErrorHandler;
  public
    { Public-Deklarationen }
  end;

var
  FKyte: TFKyte;
  scale : single = 1;         //Für die Skalierung
  rotation : integer = 0;     //Zahl in °, um die gedreht wird
  XMove, YMove, ZMove: Single;      //Größe der Bewegung
  Verschieben, Drehen, Tiefe : Boolean;
  XAnfangVerschiebung, YAnfangVerschiebung, ZAnfangVerschiebung,
  Klick : Integer;
  TVector2f : Array [0..1] of Single;
  TVector3f : Array [0..2] of Single;
  TVector4i : Array [0..3] of Integer;

implementation

{$R *.dfm}


Function VectorAdd(const vector: TVector3f; Value: Single): TVector3f;
Begin
  Result[0] := vector[0] + Value;
  Result[1] := vector[1] + Value;
  Result[2] := vector[2] + Value;
End;

Function VectorMult(const vector: TVector3f; Value: Single): TVector3f;
Begin
  Result[0] := vector[0] * Value;
  Result[1] := vector[1] * Value;
  Result[2] := vector[2] * Value;
End;

Function ToVector2f(x, y: Single): TVector2f;
Begin
  Result[0] := x;
  Result[1] := y;
End;

Function ToVector3f(x, y, z: Single): TVector3f;
Begin
  Result[0] := x;
  Result[1] := y;
  Result[2] := z;
End;

Function ToVector4i(x, y, z, w: Integer): TVector4i;
Begin
  Result[0] := x;
  Result[1] := y;
  Result[2] := z;
  Result[3] := w;
End;

Procedure DrawSphereObject(radius: Single; n: word;
                           typ: byte; inverted: boolean;
                           voffset: TVector3f; toffset, tscale: TVector2f);
Var alpha  : TVector2f; // i*beta around x axis
    SinAlpha: TVector2f; // sin(alpha)
    CosAlpha: TVector2f; // cos(alpha)
    beta   : Single;    // DegToRad(360° / n)
    delta  : Single;    // j*beta around z axis
    SinDelta: Single;    // sin(delta)
    CosDelta: Single;    // cos(delta)
    h, q   : word;      // half, quarter
    v      : TVector3f; // vector for normal and vertex
    border : TVector4i; // for-loop borders
    i, j   : Integer;
    k      : Byte;
Begin
  radius := abs(radius);

  If (n < 4) Or (Odd(n)) Or (radius = 0) Then Exit;

  h := n div 2;
  q := n div 4;
  If (Odd(h)) Then inc(q);

  Case typ of
    0: border := ToVector4i(  -h,   h-1, -q, q); // sphere
    1: border := ToVector4i(  -h,   h-1, -q, 0); // hemisphere x-
    2: border := ToVector4i(  -h,   h-1, 0, q); // hemisphere x+
    3: border := ToVector4i(-h-q, -h+q-1, -q, q); // hemisphere y-
    4: border := ToVector4i(  -q,   q-1, -q, q); // hemisphere y+
    5: border := ToVector4i(  -h,    -1, -q, q); // hemisphere z-
    6: border := ToVector4i(   0,   h-1, -q, q); // hemisphere z+
    else Exit;
  End;

  beta := 2*PI / n;

    For i:=border[0] to border[1] do Begin
      alpha := ToVector2f(i*beta, (i+1)*beta);

      SinAlpha := ToVector2f(sin(alpha[0]), sin(alpha[1]));
      CosAlpha := ToVector2f(cos(alpha[0]), cos(alpha[1]));

      glBegin(GL_TRIANGLE_STRIP);
      For j:=border[2] to border[3] do Begin
        delta := j*beta;

        SinDelta := sin(delta);
        CosDelta := cos(delta);

        If (inverted) Then
          For k:=1 downto 0 do Begin
            v := ToVector3f(-SinDelta, -CosAlpha[k]*CosDelta, -SinAlpha[k]*CosDelta);
            glNormal3fv(@v);
            v := VectorAdd(VectorMult(v, -radius), voffset);
            glTexCoord2f((j/n + 0.25)*tscale[0] + toffset[0], ((i+k)/n)*tscale[1] + toffset[1]);
            glvertex3fv(@v);
          End;
 
        If (not inverted) Then
          For k:=0 to 1 do Begin
            v := ToVector3f(SinDelta, CosAlpha[k]*CosDelta, SinAlpha[k]*CosDelta);
            glNormal3fv(@v);
            v := VectorAdd(VectorMult(v, radius), voffset);
            glTexCoord2f((j/n + 0.25)*tscale[0] + toffset[0], ((i+k)/n)*tscale[1] + toffset[1]);
            glvertex3fv(@v);
          End
      End;
      glEnd;
   End;
End;

Apollonius 27. Jun 2007 17:04

Re: 3D Kugel mit OpenGL
 
Zitat:

Delphi-Quellcode:
TVector2f : Array [0..1] of Single;
  TVector3f : Array [0..2] of Single;
  TVector4i : Array [0..3] of Integer;

Du deklarierst deine "Typen" unter var. Du musst sie unter type deklarieren und mit einem = statt einem :.

Loni 27. Jun 2007 17:10

Re: 3D Kugel mit OpenGL
 
geht auch nicht

fLaSh11 27. Jun 2007 18:11

Re: 3D Kugel mit OpenGL
 
hastes auch so gemacht?

Delphi-Quellcode:
type
  TVector2f = Array [0..1] of Single;
  TVector3f = Array [0..2] of Single;
  TVector4i = Array [0..3] of Integer;
das muss dann funktionieren!

Loni 27. Jun 2007 18:36

Re: 3D Kugel mit OpenGL
 
ok tut es aber jetzt kommt
Delphi-Quellcode:
[DCC Fehler] KyteUnit.pas(146): E2010 Inkompatible Typen: 'Single' und 'TVector3f'
bei diesem abschnitt
Delphi-Quellcode:
v := VectorAdd(VectorMult(v, -radius), voffset);
XD ich steige sowieso nicht hinter diesen code und dann noch diese fehler ^^

Loni 27. Jun 2007 19:18

Re: 3D Kugel mit OpenGL
 
hat keiner ne ahnung ?

turboPASCAL 27. Jun 2007 19:18

Re: 3D Kugel mit OpenGL
 
Ich finde nicht was v für eine Vatiable ist. Schaut das so aus ?
Delphi-Quellcode:
var
  v: TVector3f;
Zitat:

Zitat von Loni
XD ich steige sowieso nicht hinter diesen Code und dann noch diese fehler ^^

Dann mach es dir einfacher und nutze die vordef. Formen aus der GLU.PAS. (findet sich im Internet oder vill. schon auf deiner Festplatte).

In der Uses-Klausel:
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, ... Forms, OpenGL, GLU;
im Private Abschnitt:
Delphi-Quellcode:
  private
     myDC : HDC;
     myRC : HGLRC;
     myPalette : HPALETTE;
     //...
     MurmelObject: PGLUquadric;
     //...
     procedure SetupPixelFormat;
     procedure ErrorHandler;
  public
    { Public-Deklarationen }
  end;
Irgendwo im Init oder Create-Bereich:
Delphi-Quellcode:
procedure ...
begin
  //...

  // GLU-Objects
  MurmelObject := gluNewQuadric;
  gluQuadricNormals(MurmelObject, GL_SMOOTH); {schöhn run darstellen lassen}
  gluQuadricTexture(MurmelObject, GL_TRUE); {Texturkoordin. erzeugen}
  //...
Irgendwo in deiner Zeichenroutiene wo die Scene gezeichnet wird:
Delphi-Quellcode:
procedure ...
begin
  // ...
  gluSphere(MurmelObject, 5, 12, 12); {Radius 5, 12 Querschnitte, 12 Längsschn.}
  //...

Und nun noch das Aufräumen nicht vergessen.
Irgendwo im Destroy oder Close:
Delphi-Quellcode:
procedure...
begin
  //...

   // Freigeben des belegten Speichert des GLU-Objects
   gluDeleteQuadric(MurmelObject);

  //...

Done.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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