请教各位高手图形编程的问题!!!!! 在DELPHI中怎样编写3D图形的程序,例如我要做一个长方体该怎么做?是不是要用opengl呢?能给点代码吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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. XE3的帮助文件是怎么回事?不提供帮助文档? bitbtn调用imagelist中的ICON图标? 将一个表的数据复制到另一个表的问题! 如何用BDE连接MSAccess? 请教高手:del键如何判断 身份证扫描难题,请求大虾们帮忙,谢谢! 一个构造函数? 类型转换的超简单问题。。 兄弟们谁知道国外delphi代码的网站,大家来贡献地址,我送分 property中的read和write什么时候会被调用?? TPageControl的应用! 散分!三角和星到底需要多少专家分?还有强制结贴合适吗?
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.