AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DirectX 3D-Zylinder erstellen

Ein Thema von napsterxx · begonnen am 26. Apr 2008
Antwort Antwort
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#1

DirectX 3D-Zylinder erstellen

  Alt 26. Apr 2008, 11:02
Wieder ein Problem mit DirectX. Im Buch ist die Aufgabe, einen Cylinder zu erstellen. Ich habe alles gnau wie im Buch aber ich bekomme nur eine schwarze Fläche oO

Hier mal der Code:
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, direct3d9, d3dx9, dxhelp, ExtCtrls;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure OnIdle(Sender: TObject; var done: boolean);
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  Direct3D9: IDirect3D9;
  D3DDev9: IDirect3DDevice9;
  Vertexbuffer: IDirect3DVertexBuffer9;
  vb_cylinder: IDirect3DVertexBuffer9;
  Timegap, Timestart: Cardinal;

type
  TD3DLVertex = record
    position: TD3DXVector3;
    diffuse: TD3DColor;
  end;

const
  D3DFVF_TD3DLVertex = D3DFVF_XYZ or D3DFVF_DIFFUSE;

implementation

{$R *.dfm}

function InitCylinder: HResult;
var
  Vertices: Array[0..99] of TD3DLVertex;
  CX: Integer;
  theta: Single;
  pVertices: Pointer;
begin
  // Dieser Zylinder wird über eine Schleife erstellt
  // in der jeweils der obere und untere Vertex definiert wird
  for cx := 0 to 49 do
  begin
    theta := ( 2 * D3DX_PI * CX ) / 49;
    Vertices[ 2 * CX ].position := D3DXVector3( cos( theta ), -1.0, sin( theta ) );
    Vertices[ 2 * CX ].diffuse := $FF00FF00;

    Vertices[ 2 * CX + 1 ].position := D3DXVector3( cos( theta ), 1.0, sin( theta ) );
    Vertices[ 2 * CX + 1 ].diffuse := $FFFF0000;
  end;

  // Erstellen des vb_Zylinders
  Result := D3DDev9.CreateVertexBuffer( sizeof( TD3DLVertex ) * 100,
                                        D3DUSAGE_WRITEONLY,
                                        D3DFVF_TD3DLVERTEX,
                                        D3DPOOL_DEFAULT,
                                        vb_cylinder, nil );
  if (Result <> D3D_OK) then
    Exit;
  Result := vb_cylinder.Lock( 0, Sizeof( Vertices ), pVertices, 0 );
  if (Result <> D3D_OK) then
    Exit;
  Move( Vertices, pVertices^, sizeof( Vertices ) );
  vb_cylinder.Unlock;

  Result := D3D_OK;
end;

procedure SetupTransformation;
var
  matRotZ: TD3DXMatrix;
  Rotation: Single;
begin
  Rotation := Rotation + TimeGap * 0.005;
  D3DXMatrixRotationZ( matRotZ, Rotation );
  D3DDev9.SetTransform( D3DTS_WORLDMATRIX(0), matRotZ);
end;

procedure SetupViewAndProjection;
var
  pos, dir, up: TD3DXVector3;
  matView, matProj: TD3DXMatrix;
begin
  // Position, Richtung und Ausrichtung festlegen
  pos := D3DXVector3( 1, 2, -5 );
  dir := D3DXVector3( 0, 0, 0 );
  up := D3DXVector3( 0.0, 1.0, 0.0 );

  // Viewmatrix festlegen
  D3DXMatrixLookAtLH( matView, pos, dir, up );
  D3DDev9.SetTransform( D3DTS_VIEW, matView );

  // Projektionsmatrix festlegen
  D3DXMatrixPerspectiveFovLH( matProj,
                              D3DX_PI / 4,
                              Form2.Width / Form2.Height,
                              1.0, 100 );
  D3DDev9.SetTransform( D3DTS_PROJECTION, matProj );
end;

// Dreieck erstellen
function InitGeometry: HResult;
var
  Vertices: Array[0..2] of TD3DLVertex;
  pVertices: Pointer;
begin
  // Vertices Eigenschaften
  Vertices[ 0 ].position := D3DXVector3( 1, 0, 0 );
  Vertices[ 0 ].diffuse := $FFFF0000;
  Vertices[ 1 ].position := D3DXVector3( -1, 0, 0 );
  Vertices[ 1 ].diffuse := $FF0000FF;
  Vertices[ 2 ].position := D3DXVector3( 0, 1, 0 );
  Vertices[ 2 ].diffuse := $FFFFFFFF;

  // Buffer erstellen
  Result := D3DDev9.CreateVertexBuffer( sizeof( TD3DLVertex ) * 3,
                                        D3DUSAGE_WRITEONLY,
                                        D3DFVF_TD3DLVERTEX, D3DPOOL_DEFAULT,
                                        Vertexbuffer, nil);
  // Gelungen?
  if (Result <> D3D_OK) then
    Exit;

  // Vertexbuffer schließen
  Result := VertexBuffer.Lock( 0, Sizeof( Vertices ), pVertices, 0 );
  // Gelungen?
  if (Result <> D3D_OK) then
    Exit;

  // Dann schieben wir die Vertices an die erlaubte Stelle
  Move( Vertices, pVertices^, Sizeof( Vertices ) );

  // Wieder aufschließen
  Result := Vertexbuffer.Unlock;

  // Kein Lichteinfall
  D3DDev9.SetRenderState( D3DRS_LIGHTING, LongWord( False ) );
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  // Interface erstellen
  DHInitDGFX( Panel1.Handle, False, 1280,1024,32, True, Direct3D9, D3DDev9 );
  InitGeometry;
  InitCylinder;
  Application.OnIdle := OnIdle;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DHCloseDGFX( Direct3D9, D3DDev9);
  Vertexbuffer := nil;
end;

procedure Render;
begin
  // Zeitdifferenz ermitteln
  TimeGap := GetTickCount - Timestart;
  Timestart := gettickcount;
  D3DDev9.BeginScene;
  D3DDev9.Clear( 0, nil, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 10.0, 0);

  // Kameraeinstellung wählen
  SetupViewAndProjection;

  // Transformation einstellen
// SetupTransformation;

  // Streamsource setzen
  D3DDev9.SetStreamSource(0, vb_cylinder, 0, Sizeof( TD3DLVertex) );
  // FVF setzen
  D3DDev9.SetFVF( D3DFVF_TD3DLVertex );
  // DAS Dreieck rendern
  D3DDev9.DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

  D3DDev9.EndScene;
  D3DDev9.Present( nil, nil, 0, nil );
end;

procedure TForm2.OnIdle(Sender: TObject; var done: boolean);
begin
  done := false;
  Render;
end;

end.
Kann jemand helfen?
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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