Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

Помогите, новичку в Opengl.   Найти похожие ветки 

 
MegaMoniak   (2005-07-19 14:45) [0]

Приветствую вас, мастера!раньше я работал в GlScene.Сделал там прикольную игру с хорошей анимацией но теперь я занялся Opengl.Хотел сделать такой же мир на Опенжил.Оказалось что это не так то просто.Мне удалось сделать только землю небо, и движение камеры.
мой вопрос заключается в том, как мне загрузить модель игрока в формате md2,анимацию к нему в формате aaf, и текстуры к ним.
На GlScne  я делал это так:
// модель актёра
 Actor1.LoadFromFile("media\waste.md2");
// его текстура      Actor1.Material.Texture.Image.LoadFromFile("media\waste.jpg");
// его анимация  
 Actor1.Animations.LoadFromFile("media\Quake2Animations.aaf");
// делаем его поменьше  
 Actor1.Scale.SetVector(0.04, 0.04, 0.04, 0);
// грузим  актёру пушку  
 Actor2.LoadFromFile("media\WeaponWaste.md2");
// и текстуру к ней
   Actor2.Material.Texture.Image.LoadFromFile("media\WeaponWaste.jpg");
// анимация проигрывается циклически  
 Actor1.AnimationMode:=aamLoop;
// проигрывать анимацию стоять на месте
 Actor1.SwitchToAnimation("stand");
...
 if IsKeyDown(VK_SHIFT) then begin
      Actor1.Interval:=100;
// бежим быстрей      
  speed:=50*deltaTime
// а иначе анимация замедляется
 end else begin
      Actor1.Interval:=150;
// Бежим медленнее  
speed:=10*deltaTime;
      end;

Но как сделать тоже самое на Opengl


 
NewWonder ©   (2005-07-19 15:10) [1]

Можно посмотреть исходники GL Scene.


 
MegaMoniak   (2005-07-19 19:04) [2]

>Можно посмотреть исходники GL Scene.
Всмысли?Какие исходник, которые написал я или самой ГлСцены?


 
имя   (2005-07-19 19:46) [3]

Удалено модератором


 
MegaMoniak   (2005-07-19 19:48) [4]

>Пожалуйста помогите беднму юзеру
Да хоть кто нибуть отзовитесь


 
NewWonder ©   (2005-07-19 20:31) [5]

Ну в том смысле, исходники всей GL Scene, все .pas файлы. Это же открытый движок. Я правда этим сам не занимался.


 
MegaMoniak   (2005-07-19 21:03) [6]

Может Вы знаете код который будет делать то что я сделал на GlScene.Ну то есть как мне загрузить модель игрока в формате md2,пушки в формате md2,анимацию к нему в формате aaf, и текстуры к ним.


 
NewWonder ©   (2005-07-19 21:23) [7]

Я же говорю, поковыряйте код GL Scene. Там вообще много чего интересного. Лично я этот код не знаю.


 
A22 ©   (2005-07-19 22:00) [8]

опять Новоуральск? имхо, пора запретить создание топиков с незарагеных ников, а регистрация - токмо по паспортным данным и с проверкой :)


 
grouzd[E]v ©   (2005-07-19 22:09) [9]

[8] Нее.. Тогда новичков вообще не будет. Надо только его kickнуть..
ЗЫ Предлагаю новый ник: LNG (aka Looping Name Generator)


 
NewWonder ©   (2005-07-19 23:24) [10]

В том же курсовике есть работа с md2 и анимацией.


 
MegaMoiak   (2005-07-20 13:26) [11]

В каком курсовике?


 
MegaMoniak   (2005-07-20 13:38) [12]

Ну пожалуйста хоть кто нибуть, отзовитесь.


 
MegaMoniak   (2005-07-20 14:27) [13]

Пожалуйста подскажите не опытному человеку как  мне загрузить модель игрока в формате md2,пушки в формате md2,анимацию к ним в формате aaf, и текстуры к ним.Очень прошу.Могу отплатить небольшой суммой.Но только через webmoney.


 
Kobik ©   (2005-07-20 15:04) [14]

>Могу отплатить небольшой суммой.Но только через webmoney.
Еще одно доказательсто, что это новоуральск :)

ЗЫ. Если ты "Сделал там прикольную игру с хорошей анимацией" то зачем тебе переходить "на Опенжил"?


 
NewWonder ©   (2005-07-20 15:28) [15]

В том самом курсовике.


 
NewWonder ©   (2005-07-20 15:36) [16]

ИМХО, тебе GL Scene лучше.


 
grouzd[E]v ©   (2005-07-20 16:59) [17]

Да ни хрена он не сделал!! Какой там GLScene?!!!! Ему нужно в школу - изучать основы TP7!


 
MegaMoniak   (2005-07-20 17:25) [18]

>В курсовике есть работа с md2 и анимацией.
А где там именно, анимация?


 
Kobik ©   (2005-07-20 19:51) [19]

:))

Зато как форум оживился. Помоему со времен Кена не было столько трепу.


 
NewWonder ©   (2005-07-20 22:03) [20]

DirectGame.pas


 
MegaMoniak   (2005-07-21 13:03) [21]

>В курсовике есть работа с md2 и анимацией.
Вот это что ли:
 MD2_MAX_TRIANGLES = 4096;
 MD2_MAX_VERTICES = 2048;
 MD2_MAX_TEXCOORDS = 2048;
 MD2_MAX_FRAMES = 512;
 MD2_MAX_SKINS = 32;
 MD2_MAX_FRAMESIZE = (MD2_MAX_VERTICES*4+128);
Если да то как мне с этим работать?


 
A22 ©   (2005-07-21 13:42) [22]

да никак, тебе сперва надо закончить курсы повышения квалификации для имбицилов. дорастешь до звания нормального человека, выпрямишь свои корявки - тогда и учись программировать


 
MegaMoniak   (2005-07-21 13:57) [23]

Специальная информация для А22.Да пошёл ты!


 
A22 ©   (2005-07-21 14:02) [24]

если бы на изучение теории и на практику ты тратил столько же времени, как на треп на этом форуме - уже давно сам мог бы ответить на все задаваемые тобою ныне вопросы


 
MegaMoniak   (2005-07-21 14:13) [25]

>Специальная информация для А22.Да пошёл ты!
Извиняюсь погоричился!
>если бы на изучение теории и на практику ты тратил столько же времени, как на треп на этом форуме - уже давно сам мог бы ответить на все задаваемые тобою ныне вопросы

Я занимаюсь!Но в нашем городе нет книг по Opengl.Приходиться шарить в инете но там только различные статьи типа:как сделать млнию, как сделать огонь и т.д.Но нормальных статей для изучения не могу найти


 
grouzd[E]v ©   (2005-07-21 14:19) [26]

[25] !!! А интернет для кого придумали?!! В оЗоне продается книжка Краснова - чего тебе еще надо?!!! Кстати, ты говорил, что заказал ее..


 
MegaMoniak   (2005-07-21 14:22) [27]

Да заказывал но она не пришла!


 
MegaMoniak   (2005-07-21 14:24) [28]

А пока нет денг что бы её ещё раз заказывать!


 
grouzd[E]v ©   (2005-07-21 14:27) [29]

MegaMoniak > А мне почему пришла? А у тебя всегда нет денег =)


 
NewWonder ©   (2005-07-21 14:45) [30]

Неа, в сети есть куча примеров от самых простых, до более продвинутых. И статьи для новичков бар.


 
MegaMoniak   (2005-07-21 16:54) [31]

Скажите пожалуйста как загрузить анимированную модель в формате md2 в Delphi.


 
NewWonder ©   (2005-07-21 17:16) [32]

Совет: есть Dark Basic, Blitz Basic 3D - конструкторы игр. Программирование происходит без программирования.


 
NewWonder ©   (2005-07-21 17:16) [33]

Ну почти без программирования.


 
MegaMoniak   (2005-07-21 17:45) [34]

Ну это не интересно!


 
MegaMoniak   (2005-07-21 18:15) [35]

NewWonder просмотри плиз, загрузка происходит примерно вот так.Подскажи что и куда нужно распредилить что бы модель оказалось на игровом поле

const
 TITLE = "OpenGL application by Vashchaev Ivan";
 WIDTH = 640;
 HEIGHT = 480;

 FILE_MODEL = "base\tris.md2";
 FILE_SKIN_MODEL = "base\skin.tga";
 FILE_WEAPON_MODEL = "base\weapon.md2";
 FILE_SKIN_WEAPON_MODEL = "base\weapon.tga";

var
 Handle: hWnd;
 DC: HDC;
 HRC: HGLRC;
 Keys: array [0..255] of Boolean;

 Skin, WeaponSkin: Cardinal;
 Model, WeaponModel: T3DModel;
 X, Y: Single;
 Fill: Boolean = True;

// Render an actual scene
procedure Render;
var i, WhichVertex,
   Index1, Index2: Integer;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glPushMatrix;

gluLookAt(0.0, 0.0, 90.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glRotatef(X, 0.0, 1.0, 0.0);
glRotatef(Y, 0.0, 0.0, 1.0);

if Fill
 then glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
 else glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

EnableTexture(Skin);
AnimateModel(Model);

EnableTexture(WeaponSkin);
AnimateModel(WeaponModel);

glPopMatrix;
SwapBuffers(DC);
end;

// Processing keys
procedure ProcessKeys;
begin
if Keys[VK_ESCAPE] then PostQuitMessage(0);

if Keys[VK_UP] then Y := Y + 1.0;
if Keys[VK_DOWN] then Y := Y - 1.0;
if Keys[VK_LEFT] then X := X - 1.0;
if Keys[VK_RIGHT] then X := X + 1.0;
end;

// Setup DC pixel format
procedure SetPixFormat(HDC: HDC);
var pfd: TPixelFormatDescriptor;
   nPixelFormat: Integer;
begin
with pfd do
 begin
  nSize := SizeOf(TPixelFormatDescriptor);
  nVersion := 1;                          
  dwFlags := PFD_DOUBLEBUFFER or PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL;
  iPixelType := PFD_TYPE_RGBA;
  cColorBits := 32;            
  cRedBits := 0;              
  cRedShift := 0;              
  cGreenBits := 0;            
  cGreenShift := 0;            
  cBlueBits := 0;              
  cBlueShift := 0
  cAlphaBits := 0;            
  cAlphaShift := 0;            
  cAccumBits := 0;            
  cAccumRedBits := 0;          
  cAccumGreenBits := 0;        
  cAccumBlueBits := 0;        
  cAccumAlphaBits := 0;        
  cDepthBits := 32;            
  cStencilBits := 0;          
  cAuxBuffers := 0;          
  iLayerType := PFD_MAIN_PLANE;// ??? ?????????
  bReserved := 0;              
  dwLayerMask := 0;            
  dwVisibleMask := 0;          
  dwDamageMask := 0;        
 end;

nPixelFormat := ChoosePixelFormat(HDC, @pfd); ????????? ?????? ????????
SetPixelFormat(HDC, nPixelFormat, @pfd);    
end;

// Initialize OpenGL
procedure InitializeGL;
begin
// GL
DC := GetDC(Handle);
SetPixFormat(DC);
HRC := wglCreateContext(DC);
ReleaseDC(Handle, DC);
wglMakeCurrent(DC, HRC);

// Z Buffer
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glClearDepth(1.0);

// Back color
glClearColor(0.0, 0.0, 1.0, 0.0);

// Texturing
glEnable(GL_TEXTURE_2D);
LoadTexture(FILE_SKIN_MODEL, Skin);
LoadTexture(FILE_SKIN_WEAPON_MODEL, WeaponSkin);

// Culling
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
end;

// Finalize OpenGL
procedure FinalizeGL;
begin
// GL
wglDeleteContext(HRC);
wglMakeCurrent(0, 0);
ReleaseDC(Handle, DC);
DeleteDC(DC);
end;

// Setup a perspective
procedure SetPerspective(Width, Height: Integer);
begin
glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, Width / Height, 0.1, 256.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;

// Window procedure: processing messges
function WindowProcedure(Window: hWnd; Message, wParam: Word; lParam: LongInt): LongInt; stdcall;
begin
case Message of
 // Window create
 WM_CREATE:
  begin
   LoadModel(FILE_MODEL, Model);
   LoadModel(FILE_WEAPON_MODEL, WeaponModel);
  end;
 // Window resize
 WM_SIZE:
  begin
   SetPerspective(LOWORD(lParam),HIWORD(lParam));
  end;
 // Window close
 WM_CLOSE:
  begin
   FreeModel(Model);
   FreeModel(WeaponModel);

   PostQuitMessage(0);
   Exit;
  end;
 // Key down
 WM_KEYDOWN:
  begin
   Keys[wParam] := True;
  end;
 // Key up
 WM_KEYUP:
  begin
   Keys[wParam] := False;
  end;
 // Left mouse button
 WM_LBUTTONDOWN:
  begin
   Model.CurrentAnim := (Model.CurrentAnim + 1) mod Model.NumAnimations;
   Model.CurrentFrame := Model.Animations[Model.CurrentAnim].StartFrame;

   if Model.CurrentAnim > WeaponModel.NumAnimations - 1 then
    begin
     WeaponModel.CurrentAnim := WeaponModel.NumAnimations - 1;
     WeaponModel.CurrentFrame := 0;
    end
   else
    begin
     WeaponModel.CurrentAnim := (WeaponModel.CurrentAnim + 1) mod WeaponModel.NumAnimations;
     WeaponModel.CurrentFrame := WeaponModel.Animations[WeaponModel.CurrentAnim].StartFrame;
    end;

   SetWindowText(Handle, PChar(TITLE + " - " + Model.Animations[Model.CurrentAnim].Name));
  end;
 // Left mouse button
 WM_RBUTTONDOWN:
  begin
   Fill := not Fill;
  end
else Result := DefWindowProc(Window, Message, wParam, lParam);
end;
end;

// Create the window
procedure CreateTheWindow(Width, Height: Integer);
var WindowClass: TWndClass;
   hInstance: HINST;
begin
hInstance := GetModuleHandle(nil);

ZeroMemory(@WindowClass, SizeOf(WindowClass));
with WindowClass do
 begin
  Style := CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
  lpfnWndProc := @WindowProcedure;
  cbClsExtra := 0;
  cbWndExtra := 0;
  hInstance := hInstance;
  hIcon := LoadIcon(0, IDI_APPLICATION);
  hCursor := LoadCursor(0, IDC_ARROW);
  hbrBackground := GetStockObject(WHITE_BRUSH);
  lpszMenuName := "";
  lpszClassName := TITLE;
 end;

RegisterClass(WindowClass);
Handle := CreateWindowEx(WS_EX_APPWINDOW or WS_EX_WINDOWEDGE, TITLE, TITLE, WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN or WS_CLIPSIBLINGS, 0, 0, Width, Height, 0, 0, hInstance, nil);
ShowWindow(Handle, SW_SHOW);

InitializeGL;
SetPerspective(WIDTH, HEIGHT);
end;

// Destroy the window
procedure DestroyTheWindow;
begin
FinalizeGL;
DestroyWindow(Handle);
UnRegisterClass(TITLE, hInstance);
end;

// Main message loop for the application
function WinMain(hInstance: HINST; hPrevInstance: HINST; lpCmdLine: PChar; nCmdShow: Integer): Integer; stdcall;
var Msg : TMsg;
   Finished : Boolean;
begin
Finished := False;

while not Finished do
 begin
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
   begin
    if Msg.Message = WM_QUIT then Finished := True
    else
     begin
      TranslateMessage(msg);
      DispatchMessage(msg);
     end;
   end
  else
   begin
    ProcessKeys;
    Render;
   end;
 end;

Result := Msg.wParam;
end;

begin
CreateTheWindow(WIDTH, HEIGHT);
WinMain(hInstance, hPrevInst, CmdLine, CmdShow);
DestroyTheWindow;
end.


 
DeadMeat ©   (2005-07-21 18:53) [36]

Может я не заметил, но где тут код непосредственно рисования?

---
...Death Is Only The Begining...


 
MegaMoniak   (2005-07-21 19:17) [37]

Может сдесь
procedure glDeleteTextures(N: GLsizei; Textures: PGLuint); stdcall; external opengl32;
function gluBuild2DMipmaps(Target: GLenum; Components, Width, Height: GLint; Format, atype: GLenum; Data: Pointer): GLint; stdcall; external glu32;

implementation

procedure LoadTexture(Filename: String; var ID: GLuint);
type
 TTGAHeader = packed record
  FileType, ColorMapType, ImageType: Byte;
  ColorMapSpec: array[0..4] of Byte;
  OrigX, OrigY, Width, Height: array [0..1] of Byte;
  BPP: Byte;
  ImageInfo: Byte;
 end;
var F: File;
   Header: TTGAHeader;
   Image: array of Byte;
   Temp: Byte;
   BytesRead, Width, Height, ColorDepth, ImageSize, i: Integer;
begin
if not FileExists(Filename) then Exit;
if Copy(Lowercase(Filename), Length(Filename)-3, 4) <> ".tga" then Exit;

AssignFile(F, Filename);
Reset(F, 1);
BlockRead(F, Header, SizeOf(Header));

Width := Header.Width[0] + Header.Width[1] * 256;
Height := Header.Height[0] + Header.Height[1] * 256;
ColorDepth := Header.BPP;
ImageSize := Width * Height * (ColorDepth div 8);

SetLength(Image, ImageSize);
BlockRead(F, Image[0], ImageSize, BytesRead);

if (Header.ImageType <> 2) or (Header.ColorMapType <> 0) or (BytesRead <> ImageSize) then
  begin
   CloseFile(F);
   Image := nil;
   MessageBox(0, PChar("Couldn""t load ""+ Filename +"""), PChar("TGA File Error"), MB_OK);
   Exit;
  end;

for i := 0 to Width * Height - 1 do
 begin
  if ColorDepth = 24 then
   begin
    Temp := Image[i * 3];
    Image[i * 3] := Image[i * 3 + 2];
    Image[i * 3 + 2] := Temp;
   end;

  if ColorDepth = 32 then
   begin
    Temp := Image[i * 4];
    Image[i * 4] := Image[i * 4 + 2];
    Image[i * 4 + 2] := Temp;
//     if (Image[i * 4] > $32) and (Image[i * 4 + 1] > $32) and (Image[i * 4 + 2] > $32) then Image[i * 4 + 3] := $FF;
   end;
 end;

glGenTextures(1, @ID);
glBindTexture(GL_TEXTURE_3d, ID);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

if ColorDepth = 24 then gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, Addr(Image[0]));
if ColorDepth = 32 then gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, Addr(Image[0]));

Image := nil;
end;

procedure DestroyTexture(var ID: GLuint);
begin
glDeleteTextures(1, @ID);
end;

procedure EnableTexture(var ID: GLuint);
begin
glBindTexture(GL_TEXTURE_2D, ID);
end;

end.


 
MegaMoniak   (2005-07-21 19:21) [38]

или сдесь

///////////////////////////////////////
//   Unit : MD2
//   Date : 20/04/2002
// Author : Vashchaev "viv" Ivan
// e-Mail : ivanv@softhome.net
///////////////////////////////////////

interface

uses Windows, SysUtils, OpenGL;

const
 MD2_MAX_TRIANGLES = 4096;
 MD2_MAX_VERTICES = 2048;
 MD2_MAX_TEXCOORDS = 2048;
 MD2_MAX_FRAMES = 512;
 MD2_MAX_SKINS = 32;
 MD2_MAX_FRAMESIZE = (MD2_MAX_VERTICES * 4 + 128);
 ANIMATION_SPEED = 5.0;

type
 TMD2Header = record
   Magic,
   Version,
   SkinWidth,
   SkinHeight,
   FrameSize,
   NumSkins,
   NumVertices,
   NumTexCoords,
   NumTriangles,
   NumGLCommands,
   NumFrames,
   OffsetSkins,
   OffsetTexCoords,
   OffsetTriangles,
   OffsetFrames,
   OffsetGLCommands,
   OffsetEnd: Integer;
 end;

type
 TMD2AliasTriangle = record
   Vertex: array [0..2] of Byte;
   LightNormalIndex: Byte;
 end;

type
 TMD2Triangle = record
   Vertex, Normal: array [0..2] of Single;
 end;

type
 TMD2Face = record
   VertexIndices, TextureIndices: array [0..2] of SmallInt;
 end;

type
 TMD2TexCoord = record
   U, V: SmallInt;
 end;

type
 TMD2AliasFrame = record
   Scale, Translate: array [0..2] of Single;
   Name: array [0..15] of Char;
   Vertices: array of TMD2AliasTriangle;
 end;

type
 TMD2Frame = record
   Name: array [0..15] of Char;
   Vertices: array of TMD2Triangle;
 end;

///////////////////////////////////////////////
type
 TVector3 = record
   X, Y, Z: Single;
 end;

type
 TVector2 = record
   X, Y: Single;
 end;

type
 TFace = record
   VertexIndex,
   TexCoordIndex: array [0..2] of Integer;
 end;

type
 TAnimation = record
   Name: String;
   StartFrame,
   EndFrame: Integer;
 end;

type
 T3DObject = record
   Name: String;
   NumVertex: Integer;
   Vertexes: array of TVector3;
 end;

type
 T3DModel = record
   NumFaces,
   NumTexCoords,
   NumObjects,
   NumAnimations: Integer;

   CurrentAnim, CurrentFrame: Integer;
   ElapsedTime, LastTime: Single;

   TexCoords: array of TVector2;
   Faces: array of TFace;
   Animations: array of TAnimation;
   Objects: array of T3DObject;
 end;
///////////////////////////////////////////////

procedure LoadModel(Filename: String; var Model: T3DModel);
procedure FreeModel(var Model: T3DModel);
procedure AnimateModel(var Model: T3DModel);

implementation

procedure LoadModel(Filename: String; var Model: T3DModel);
var F: File;
   i, j: Integer;

   Header: TMD2Header;
   TexCoords: array of TMD2TexCoord;
   Triangles: array of TMD2Face;
   Frames: array of TMD2Frame;
   Frame: TMD2AliasFrame;

   CurrentFrame: T3DObject;

   FrameNum: Integer;
   Animation: TAnimation;
   Name, LastName: String;
begin
// Load model form file
Assign(F, Filename);
Reset(F, 1);

// Header
BlockRead(F, Header, SizeOf(TMD2Header));
if Header.Version <> 8 then Exit;

// Texture coords
Seek(F, Header.OffsetTexCoords);
SetLength(TexCoords, Header.NumTexCoords);
BlockRead(F, TexCoords[0], SizeOf(TMD2TexCoord) * Header.NumTexCoords);

// Triangles
Seek(F, Header.OffsetTriangles);
SetLength(Triangles, Header.NumTriangles);
BlockRead(F, Triangles[0], SizeOf(TMD2Face) * Header.NumTriangles);

// Frames
Seek(F, Header.OffsetFrames);
SetLength(Frames, Header.NumFrames);
for i := 0 to Header.NumFrames - 1 do
 begin
  SetLength(Frame.Vertices, Header.NumVertices);
  BlockRead(F, Frame.Scale, SizeOf(Frame.Scale));
  BlockRead(F, Frame.Translate, SizeOf(Frame.Translate));
  BlockRead(F, Frame.Name, SizeOf(Frame.Name));
  BlockRead(F, Frame.Vertices[0], SizeOf(TMD2AliasTriangle) * Header.NumVertices);

  SetLength(Frames[i].Vertices, Header.NumVertices);
  StrCopy(Frames[i].Name, Frame.Name);
  for j := 0 to Header.NumVertices - 1 do
   begin
    Frames[i].Vertices[j].Vertex[0] := Frame.Vertices[j].Vertex[0] * Frame.Scale[0] + Frame.Translate[0];
    Frames[i].Vertices[j].Vertex[2] := -1 * (Frame.Vertices[j].Vertex[1] * Frame.Scale[1] + Frame.Translate[1]);
    Frames[i].Vertices[j].Vertex[1] := Frame.Vertices[j].Vertex[2] * Frame.Scale[2] + Frame.Translate[2];
   end;
 end;

Close(F);

// Convert Data Structures
Model.NumTexCoords := Header.NumTexCoords;
Model.NumFaces := Header.NumTriangles;
SetLength(Model.TexCoords, Model.NumTexCoords);
SetLength(Model.Faces, Model.NumFaces);

for i := 0 to Model.NumTexCoords - 1 do
 begin
  Model.TexCoords[i].X := TexCoords[i].U / Header.SkinWidth;
  Model.TexCoords[i].Y := 1 - TexCoords[i].V / Header.SkinHeight;
 end;

for i := 0 to Model.NumFaces - 1 do
 begin
  Model.Faces[i].VertexIndex[0] := Triangles[i].VertexIndices[0];
  Model.Faces[i].VertexIndex[1] := Triangles[i].VertexIndices[1];
  Model.Faces[i].VertexIndex[2] := Triangles[i].VertexIndices[2];


 
MegaMoniak   (2005-07-21 19:21) [39]

Model.Faces[i].TexCoordIndex[0] := Triangles[i].TextureIndices[0];
  Model.Faces[i].TexCoordIndex[1] := Triangles[i].TextureIndices[1];
  Model.Faces[i].TexCoordIndex[2] := Triangles[i].TextureIndices[2];
 end;

Model.NumObjects := Header.NumFrames;
SetLength(Model.Objects, Model.NumObjects);

for i := 0 to Model.NumObjects - 1 do
 begin
  CurrentFrame.Name := Frames[i].Name;
  CurrentFrame.NumVertex := Header.NumVertices;
  SetLength(CurrentFrame.Vertexes, CurrentFrame.NumVertex);

  for j := 0 to CurrentFrame.NumVertex - 1 do
   begin
    CurrentFrame.Vertexes[j].X := Frames[i].Vertices[j].Vertex[0];
    CurrentFrame.Vertexes[j].Y := Frames[i].Vertices[j].Vertex[1];
    CurrentFrame.Vertexes[j].Z := Frames[i].Vertices[j].Vertex[2];
   end;

  Model.Objects[i] := CurrentFrame;
 end;

// Parse animations
for i := 0 to Model.NumObjects - 1 do
 begin
  Name := Model.Objects[i].Name;

  if TryStrToInt(Copy(Name, Length(Name) - 1, 2), FrameNum) then
   begin
    Delete(Name, Length(Name) - 1, 2);
   end
  else
   if TryStrToInt(Copy(Name, Length(Name), 1), FrameNum) then
    begin
     Delete(Name, Length(Name), 1);
    end
   else
    begin
     FrameNum := 1;
    end;

  if (Name <> LastName) then
   begin
    if LastName <> "" then
     begin
      Animation.Name := LastName;
      Animation.EndFrame := i;
      Inc(Model.NumAnimations);
      SetLength(Model.Animations, Model.NumAnimations);
      Model.Animations[Model.NumAnimations - 1] := Animation;
      ZeroMemory(@Animation, SizeOf(Animation));
     end;
    Animation.StartFrame := FrameNum - 1 + i;
   end;

  LastName := Name;
 end;

// Free memory
TexCoords := nil;
Triangles := nil;
Frames := nil;
end;

procedure FreeModel(var Model: T3DModel);
begin
Model.Objects := nil;
Model.Animations := nil;
end;

function ReturnCurrentTime(var Model: T3DModel; NextFrame: Integer): Single;
var Time, t: Single;
begin
if Model.Objects = nil then Exit;

Time := GetTickCount;
Model.ElapsedTime := Time - Model.LastTime;
t := Model.ElapsedTime/(1000.0/ANIMATION_SPEED);

if Model.ElapsedTime >= (1000.0/ANIMATION_SPEED) then
 begin
  Model.CurrentFrame := NextFrame;
  Model.LastTime := Time;
 end;

Result := t;
end;

procedure AnimateModel(var Model: T3DModel);
var i, Next, WhichVertex,
   Index1, Index2: Integer;

   Time: Single;
   Point1, Point2: TVector3;

   Animation: ^TAnimation;
   Frame, NextFrame: ^T3DObject;
begin
if Model.Objects = nil then Exit;

Animation := @Model.Animations[Model.CurrentAnim];
Next := Model.CurrentFrame + 1;
if Next >= Animation.EndFrame then Next := Animation.StartFrame;

Frame := @Model.Objects[Model.CurrentFrame];
NextFrame := @Model.Objects[Next];

Time := ReturnCurrentTime(Model, Next);

glBegin(GL_TRIANGLES);
for i := 0 to Model.NumFaces - 1 do
 for WhichVertex := 0 to 2 do
  begin
   Index1 := Model.Faces[i].TexCoordIndex[WhichVertex];
   Index2 := Model.Faces[i].VertexIndex[WhichVertex];

   Point1 := Frame.Vertexes[Index2];
   Point2 := NextFrame.Vertexes[Index2];

   glTexCoord2f(Model.TexCoords[Index1].X, Model.TexCoords[Index1].Y);
   glVertex3f(Point1.X + Time * (Point2.X - Point1.X), Point1.Y + Time * (Point2.Y - Point1.Y), Point1.Z + Time * (Point2.Z - Point1.Z));
  end;
glEnd;
end;

end.


 
MegaMoniak   (2005-07-21 19:23) [40]

Подскажите пожалуйста что и куда нужно распределить что бы модель
была расположена на игровом поле



Страницы: 1 2 вся ветка

Форум: "Игры";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.016 c
9-1122218078
Большой Брат
2005-07-24 19:14
2005.12.18
Антилязинг


4-1129824721
Эксперт
2005-10-20 20:12
2005.12.18
Вставить и растянуть рисунок на фон ListView


2-1132662738
JTAG
2005-11-22 15:32
2005.12.18
Ув. Доны подскажите понадобилось считать параметры командной


4-1129707209
kolos_rus
2005-10-19 11:33
2005.12.18
Блокировка клавиатуры и мыши


14-1132500496
Piter
2005-11-20 18:28
2005.12.18
Помогите, пожалуйста, опознать песенку...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский