Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2009, 07:30   #11
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
По умолчанию

Вот код
Правда тут есть лишние
И вращение не куба, а камеры)

Код:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,  Forms,
  Dialogs, Opengl, Controls, ExtCtrls, StdCtrls;

type
  TForm3 = class(TForm)
    Timer1: TTimer;
    Timer2: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
  newCount, frameCount, lastCount : LongInt;
  fpsRate : GLfloat;

    procedure SetDCPixelFormat(DC:HDC);
    procedure MyInitOpenGL(dc:HDC);
    procedure PaintGL(dc:HDC);
    procedure SetLight;



  public
    { Public declarations }
  end;

var
  Form3: TForm3;
  hgc:HGLRC;
  tX,ty,tZ:GLfloat;
  goX,goY,goZ:GLfloat;
  buf:TBitmap;
  LightPos:array [0..3] of GLfloat=(-1.5,0.0,-3.0,1.0);
  LightAmb:array [0..3] of GLfloat=(0.5,0.5,0.5,1.0);
  LightDif:array [0..3] of GLfloat=(1.0,1.0,1.0,1.0);
  glFog_Color:array [0..3] of GLfloat=(0.5,0.5,0.5,1.0);






implementation


{$R *.dfm}




procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
wglMakeCurrent(0,0);
wglDeleteContext(hgc);
end;

procedure TForm3.FormCreate(Sender: TObject);
begin

goZ:=-8;
Form3.Caption:='x='+FloatToStr(tx)+'  y='+FloatToStr(ty);
//InitOpenGL('opengl32.dll','GLU32.dll');
MyInitOpenGL(Canvas.Handle);
PaintGL(Canvas.Handle);
glViewPort (0, 0, ClientWidth, ClientHeight);
glEnable (GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_POLYGON_SMOOTH);
glMatrixMode(GL_PROJECTION);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
glDepthFunc(GL_LEQUAL);
glMatrixMode(GL_PROJECTION);

lastCount := GetTickCount;
end;

procedure TForm3.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Shift=[] then
begin
if Key=VK_UP then
tX:=tX+1;
if Key=VK_DOWN then
tX:=tX-1;
if Key=VK_LEFT then
ty:=ty-1;
if Key=VK_RIGHT then
ty:=ty+1;
if Key=VK_INSERT then
tZ:=tZ+0.3;
if key=VK_DELETE then
tZ:=tZ-0.3;
end;

if Shift=[ssShift] then
begin
if Key=VK_UP then
goZ:=goZ+0.3;
if Key=VK_DOWN then
goZ:=goZ-0.3;
if Key=VK_LEFT then
goX:=goX-0.3;
if Key=VK_RIGHT then
goX:=goX+0.3;
if Key=VK_INSERT then
goY:=goY+0.3;
if key=VK_DELETE then
goY:=goY-0.3;
end;




if tx=361 then
tx:=0;
if tx=-1 then
tx:=360;
if ty=361 then
ty:=0;
if ty=-1 then
ty:=360;


InvalidateRect(Handle, nil, False);

end;

procedure TForm3.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key=VK_F1 then

end;

procedure TForm3.FormPaint(Sender: TObject);
begin

PaintGL(Canvas.Handle);
newCount:=GetTickCount;
Inc(frameCount);
if newCount-lastCount>1000 then
begin
  fpsRate:=frameCount;
  lastCount:=newCount;
  frameCount:=0;
end;
end;

procedure TForm3.FormResize(Sender: TObject);
begin
glMatrixMode(GL_MODELVIEW);
  //glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
 glViewport(0, 0, ClientWidth, ClientHeight);
 glLoadIdentity;
 //glFrustum (-1, 1, -1, 1, 3, 10);    // задаем перспективу



     // перенос объекта по оси Z


 InvalidateRect(Handle, nil, False);


end;
AngelOfDeath вне форума Ответить с цитированием
Старый 13.02.2009, 07:31   #12
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
По умолчанию

Продолжение...
Код:
procedure TForm3.myInitOpenGL(dc:HDC);
begin
SetDCPixelFormat(dc);
hgc:=wglCreateContext(dc);
wglMakeCurrent(dc,hgc);
end;

procedure TForm3.PaintGL(dc: HDC);
begin

 glMatrixMode(GL_PROJECTION);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
glClearColor(0,0,0.7,1);

glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);
glColor3f(0,1,0);
glLoadIdentity();

  SetLight;
  glBegin(GL_QUADS);
  glVertex3f(-1,-1,-1);
  glVertex3f(-1,1,-1);
  glVertex3f(1,1,-1);
  glVertex3f(1,-1,-1);
  glEnd;

  glBegin(GL_QUADS);
  glVertex3f(-1,-1,1);
  glVertex3f(-1,1,1);
  glVertex3f(1,1,1);
  glVertex3f(1,-1,1);
  glEnd;

  glBegin(GL_QUADS);
  glVertex3f(-1,1,-1);
  glVertex3f(-1,1,1);
  glVertex3f(-1,-1,1);
  glVertex3f(-1,-1,-1);
  glEnd;
    glColor4d(0.7,0,0,0.8);



  glBegin(GL_QUADS);
  glVertex3f(1,1,-1);
  glVertex3f(1,1,1);
  glVertex3f(1,-1,1);
  glVertex3f(1,-1,-1);
  glEnd;


  glColor4f(0,1,0,1.0);

  glBegin(GL_QUADS) ;
  glVertex3f(1,1,1);
  glVertex3f(1,1,-1);
  glVertex3f(-1,1,-1);
  glVertex3f(-1,1,1);
  glEnd();

  glBegin(GL_QUADS) ;
  glVertex3f(1,-1,1);
  glVertex3f(1,-1,-1);
  glVertex3f(-1,-1,-1);
  glVertex3f(-1,-1,1);
  glEnd();
  glColor3f(0,1,1);
  glBegin(GL_QUADS);
  glVertex3f(10,-1.1,10);
  glVertex3f(10,-1.1,-10);
  glVertex3f(-10,-1.1,-10);
  glVertex3f(-10,-1.1,10);
  glend;








  glColor3f(0,1,1);
 
glMatrixMode(GL_MODELVIEW);

glLoadIdentity;
glTranslated(0,2,0);


glLoadIdentity;
   gluPerspective(45,
   ClientWidth/ClientHeight,
   0.1,
   100);


 //glFrustum (-2, 2, -2, 2, 3, 100);    // задаем перспективу
// glOrtho(-2,2,-2,2,3,10);

  glTranslatef(goX, goY, goZ);       // перенос объекта по оси Z
 glRotatef(tx,1,0,0);
  glRotatef(ty,0,1,0);
  glRotatef(tZ,0,0,1);

glEnable(GL_FOG);
glFogi(GL_FOG_MODE, GL_LINEAR);
glFogiv(GL_FOG_COLOR, @glFog_COLOR);
glFog(GL_FOG_DENSITY, 0.35);
glFog(GL_FOG_HINT, GL_DONT_CARE);
glFog(GL_FOG_START, 5.0);
glFog(GL_FOG_END, -5.0);



SwapBuffers(dc);





end;

procedure TForm3.SetDCPixelFormat(DC: HDC);
var
nPixelFormat:Integer;
pfd:PIXELFORMATDESCRIPTOR;
begin
FillChar(pfd,sizeof(pfd),0);
pfd.dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_GDI or PFD_GENERIC_ACCELERATED or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
pfd.cDepthBits:=32;
nPixelFormat:=ChoosePixelFormat(DC,@pfd);
SetPixelFormat(DC,nPixelFormat,@pfd);
end;




procedure TForm3.SetLight;
begin
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, @LightAmb);
glLightfv(GL_LIGHT0, GL_POSITION, @lightPos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, @lightDif);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
end;

procedure TForm3.Timer1Timer(Sender: TObject);
begin
Refresh;
Timer1.Free;
end;

procedure TForm3.Timer2Timer(Sender: TObject);
begin
Form3.Caption:='x='+FloatToStr(tx)+'  y='+FloatToStr(ty)+' z='+FloatToStr(tZ)+' goX='+FloatToStr(goX)+' goY='+FloatToStr(goY)+'  goZ='+FloatToStr(goZ)+' FPS='+FloatToStr(fpsRate);

 InvalidateRect(Handle, nil, False);
end;

end.
AngelOfDeath вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение задачи на нахождение площади и обьема куба(а также вписанного шара) soldm Помощь студентам 4 30.09.2008 08:32
Найти объём куба и площадь его боковой поверхности BASIC Ветренная Помощь студентам 23 02.06.2008 13:15
Создание класса Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 31.05.2008 11:54
Создание файла Хs-You Общие вопросы Delphi 4 22.08.2007 22:04