Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Помогите, новичку в 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]

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


 
DeadMeat ©   (2005-07-21 20:02) [41]

И зачем я спросил...

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


 
MegaMoniak   (2005-07-21 20:02) [42]

Если кто сможет помочь напишите на vainu@mail.ru


 
NewWonder ©   (2005-07-21 20:47) [43]

У меня Инет кончился.
А вообще, я тебе советую начинать с более простых вещей (дождись книгу Краснова и рисуй кубики для начала). А ещё лучше - возьми конструктор игр.


 
MegaMoniak   (2005-07-21 21:48) [44]

Ну не ушто это так трудно помочь.Я понимаю что я вас достал этой темой но ведь вы не хотите помочь.Я клинусь если вы подскажите мне как сделать то что я прошу то я больше ни когда не буду у вас ничего спрашивать на этом форуме.


 
NewWonder ©   (2005-07-21 22:15) [45]

http://viv.fromru.com/
Там имеется соответственный исходник. Да и вообще полно кода. Разбирайся. Но без хорошей подготовки теоретической ты не разберёшься быстро.


 
NewWonder ©   (2005-07-21 22:30) [46]

Не смотря на то, что ты, Саша, уже стал легендой на форуме, добрый тебе совет: не берись за то, что не сможешь написать сейчас. Возьми задачу: нарисовать кубик. Вникни как его нарисовать. Потом поставь задачу понять ООП. Потом попробуй написать программу, использующие кубики и ООП, анимацию. И так, шаг за шагом ты сможешь чего-то достигнуть. А так, вчера ты не знал ничего о графике, а сейчас решил написать эдакое и кричишь на форуме "дайте рабочий код!" - никто не станет помогать, поверь мне.
А вот если ты спросишь, почему тут глючит, что именно тебе не понятно, тебе тут с радостью ответят.


 
NewWonder ©   (2005-07-21 22:35) [47]

Я пол года писал тот курсовик, сам до всего доходил, но не скажу тебя, что я мастер, я просто сейчас представляю всё в общих чертах, до знания тонкостей мне ой как далеко.


 
MegaMoniak   (2005-07-22 08:02) [48]

Спасибо за помощь в продвижении моей работе.


 
Тульский ©   (2005-07-25 15:29) [49]

Слющай, дарагой, зачэм type так много дэлаешь?


 
MegaMoniak   (2005-07-25 19:49) [50]

А как правильно подскажи


 
Тульский ©   (2005-07-26 08:37) [51]


type
TMD2Header = record
  ...
end;

type
TMD2AliasTriangle = record
  ...
end;

type
TMD2Triangle = record
  ...
end;

type
TMD2Face = record
  ...
end;


правильно так:


type
TMD2Header = record
  ...
end;

TMD2AliasTriangle = record
  ...
end;

TMD2Triangle = record
  ...
end;

TMD2Face = record
  ...
end;



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

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.066 c
14-1132661452
mr.il
2005-11-22 15:10
2005.12.18
Прикольная вакансия


2-1132956257
Gala_l
2005-11-26 01:04
2005.12.18
Naity simvol v faile


14-1132924328
_Seldon_
2005-11-25 16:12
2005.12.18
как обмануть фильтр на прокси сервере


2-1133256755
saer
2005-11-29 12:32
2005.12.18
Изменение яркости


1-1132648092
romas_first
2005-11-22 11:28
2005.12.18
пустая строка в TDateTimePicker