Форум: "Игры";
Текущий архив: 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.014 c