objMdl.Render; swapbuffers(wglGetCurrentDC); end;procedure TfrmMain.tmrRenderTimer(Sender: TObject); begin RenderScene; end;procedure TfrmMain.tmrKeyTimer(Sender: TObject); begin if GetAsyncKeyState(VK_LEFT)<>0 then begin yDeg:=yDeg+1; end; if GetAsyncKeyState(VK_RIGHT)<>0 then begin yDeg:=yDeg-1; end; if GetAsyncKeyState(VK_UP)<>0 then begin xDeg:=xDeg+1; end else if GetAsyncKeyState(VK_DOWN)<>0 then begin xDeg:=xDeg-1; end; end;procedure TfrmMain.FormResize(Sender: TObject); begin SetView; end;procedure TfrmMain.FormClick(Sender: TObject); begin if opdlg.Execute then objMdl.LoadFromFile(opdlg.FileName); end;end.
http://www.2ccc.com/article.asp?articleid=3573
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, GLInit, RapidUI, untObjModel, ExtCtrls, OpenGL;type
TfrmMain = class(TForm)
tmrRender: TTimer;
tmrKey: TTimer;
opDlg: TOpenDialog;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure tmrRenderTimer(Sender: TObject);
procedure tmrKeyTimer(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormClick(Sender: TObject);
private
procedure SetView;
procedure SetLights;
procedure RenderScene;
{ Private declarations }
public
{ Public declarations }
end;var
frmMain: TfrmMain;
glInitor : TOpenGLInit;
objMdl:TObjModel;
yDeg,xDeg:Single;
implementation{$R *.dfm}procedure TfrmMain.FormCreate(Sender: TObject);
begin
objMdl := TObjModel.Create;
GLinitor := TOpenGLInit.Create(Handle,24,stdDoubleBuffer);
SetView;
if opdlg.Execute then
objMdl.LoadFromFile(opdlg.FileName);
SetLights;
end;procedure TfrmMain.SetLights;
var AmbientLight,DiffuseLight,SpecularLight:array[1..4] of Single;
LightPos:array[1..4] of Single;
SpotDir:array[1..3] of Single;
begin
AmbientLight[1]:=0.3;AmbientLight[2]:=0.3;
AmbientLight[3]:=0.3;AmbientLight[4]:=1;
DiffuseLight[1]:=1;DiffuseLight[2]:=1;
DiffuseLight[3]:=1;DiffuseLight[4]:=1;
SpecularLight[1]:=0.4;SpecularLight[2]:=0.4;
SpecularLight[3]:=0.4;SpecularLight[4]:=1;
LightPos[1]:= 100000; LightPos[2]:=100000; LightPos[3]:=400; LightPos[4]:=1;
glEnable(GL_LIGHTING); //¿ªÆô¹âÕÕϵͳ
//ÉèÖÃ0ºÅ¹âÔ´
glLightfv(GL_LIGHT0,GL_AMBIENT,@AmbientLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,@DiffuseLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,@SpecularLight);
glLightfv(GL_LIGHT0,GL_POSITION,@LightPos); glEnable(GL_LIGHT0); //ÆôÓÃ0ºÅ¹âÔ´end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
objMdl.Free;
glInitor.Free;
end;procedure TfrmMain.SetView;
begin
glClearColor(0,0,0,0);//ÉèÖñ³¾°ÑÕɫΪºÚÉ«
glViewPort(0,0,ClientWidth,ClientHeight);//Ö¸¶¨OpenGLÔÚ´ËÇøÓòÄÚ»æͼ¡£
glMatrixMode(GL_PROJECTION);//ÉèÖÃÊÓͼͶӰ±ä»»¾ØÕó
glLoadIdentity;//¼ÓÔص¥Î»¾ØÕó¡£
gluPerspective(60,ClientWidth/ClientHeight,1,2200);//´´½¨Í¸ÊÓͶӰ
glMatrixMode(GL_MODELVIEW);//½«¾ØÕó±ä»»¶ÔÏóÇл»ÎªÄ£ÐÍÊÓͼ±ä»»¡£
end;procedure TfrmMain.RenderScene;
begin
glLoadIdentity;
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glCullFace(gl_front);
glFrontFace(GL_CW);//˳ʱÕë²øÈÆΪÕýÃæ
glEnable(GL_CULL_FACE);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);//Çå¿Õ»º³åÇø
glTranslate(0,0,-200); glRotate(yDeg,0,1,0);
glRotate(xDeg,1,0,0);
SetLights; //ÉèÖùâÔ´ glEnable(GL_TEXTURE_2D);
objMdl.Render;
swapbuffers(wglGetCurrentDC);
end;procedure TfrmMain.tmrRenderTimer(Sender: TObject);
begin
RenderScene;
end;procedure TfrmMain.tmrKeyTimer(Sender: TObject);
begin
if GetAsyncKeyState(VK_LEFT)<>0 then
begin
yDeg:=yDeg+1;
end;
if GetAsyncKeyState(VK_RIGHT)<>0 then
begin
yDeg:=yDeg-1;
end;
if GetAsyncKeyState(VK_UP)<>0 then
begin
xDeg:=xDeg+1;
end
else if GetAsyncKeyState(VK_DOWN)<>0 then
begin
xDeg:=xDeg-1;
end;
end;procedure TfrmMain.FormResize(Sender: TObject);
begin
SetView;
end;procedure TfrmMain.FormClick(Sender: TObject);
begin
if opdlg.Execute then
objMdl.LoadFromFile(opdlg.FileName);
end;end.