在DELPHI中怎样编写3D图形的程序,例如我要做一个长方体该
怎么做?是不是要用opengl呢?能给点代码吗?

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, OpenGL, glaux;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure FormPaint(Sender: TObject);
      private
        { Private declarations }
        f_hDC: HDC;
        f_hRC: HGLRC;    function InitDC: Boolean;
        function SetupRC: Boolean;
        procedure RenderScene;
        procedure InitOpenGL;
      public
        { Public declarations }
      protected
        procedure OnWMEraseBkGnd(var Msg: TMessage); message WM_ERASEBKGND;
        procedure  CreateParams(var Params: TCreateParams); override;
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    function TForm1.InitDC: Boolean;
    var
        pfd: PIXELFORMATDESCRIPTOR;
        npfd: Integer;
    begin
        Result := True;
        
        if(f_hDC <> 0)then
        begin
            ReleaseDC(Handle, f_hDC);
        end
        else
            f_hDC := GetDC(Handle);    if(f_hDC = NULL)then
        begin
            Result := False;
            exit;
        end;    FillChar(pfd, SizeOf(PIXELFORMATDESCRIPTOR), 0);
            pfd.nSize := SizeOf(PIXELFORMATDESCRIPTOR);
            pfd.nVersion := 1;
            pfd.dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or
                PFD_DOUBLEBUFFER;
            pfd.iPixelType := PFD_TYPE_RGBA;
            pfd.iLayerType := PFD_MAIN_PLANE;
            pfd.cColorBits := 24;
            pfd.cDepthBits := 32;
        npfd := ChoosePixelFormat(f_hDC, @pfd);
        if(npfd = 0)then
        begin
            Result := False;
            Exit;
        end;    if(not SetPixelFormat(f_hDC, npfd, @pfd))then
        begin
            Result := False;
            Exit;
        end;
    end;function TForm1.SetupRC: Boolean;
    begin
        if(f_hDC = 0)then
        begin
            Result := False;
            Exit;
        end;    Result := True;
        f_hRC := wglCreateContext(f_hDC);
        if(f_hRC = NULL)then
        begin
            Result := False;
            Exit;
        end;    if(not wglMakeCurrent(f_hDC, f_hRC))then
        begin
            Result := False;
            Exit;
        end;
    end;procedure TForm1.InitOpenGL;
    begin
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LEQUAL);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glEnable(GL_LINE_SMOOTH);
        glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
        glClearColor(0.0, 0.0, 0.0, 1.0);
        glClearDepth(1.0);
    end;procedure TForm1.RenderScene;
    begin
        glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
            glTranslatef(0.0, 0.0, -150.0);
            glBegin(GL_LINES);
                glVertex3f(-30.0, -30.0, 0.0);
                glVertex3f(30.0, 30.0, 0.0);
            glEnd;        glRotatef(45.0, 0.0, 1.0, 0.0);
            glRotatef(45.0, 1.0, 0.0, 0.0);
            auxWireCube(20.0);    SwapBuffers(f_hDC);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        if(not InitDC)then
        begin
            ShowMessage('Error');
            Exit;
        end;
        if(not SetupRC)then
        begin
            ShowMessage('Error1');
            exit;
        end;
        InitOpenGL;
    end;procedure TForm1.FormResize(Sender: TObject);
    begin
        glViewport(0, 0, ClientWidth, ClientHeight);    glMatrixMode(GL_PROJECTION);
        glLoadIdentity;
        gluPerspective(45.0, 1.0*ClientWidth/ClientHeight, 0.1, 300.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity;
    end;procedure TForm1.OnWMEraseBkGnd(var Msg: TMessage);
    begin
        Msg.Result := 1;
    end;procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
        inherited;
        Params.Style := Params.Style or CS_OWNDC or CS_HREDRAW or CS_VREDRAW
            or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
    end;procedure TForm1.FormPaint(Sender: TObject);
    begin
        RenderScene;
    end;end.