Лабораторная работа №2
Спрайт – плоский графический образ, реализованный средствами векторной и растровой графики. Спрайт – это резкое изменение графического образа при достижении некоторого геометрического условия.
Листинг программы:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
float t=0;
float U=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image1->Picture->LoadFromFile("1.bmp");
Image2->Picture->LoadFromFile("2.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
U=9.8*t;
t+=0.1;
Image1->Top += U;
if(Image1->Top+Image1->Height > Image2->Top)
{
Image1->Visible = false;
Image2->Picture->LoadFromFile("3.bmp");
}
}
//---------------------------------------------------------------------------
Результаты работы программы:
Лабораторная работа №3
Постановка задачи:
Работа с графическими средствами растровой графики (Adobe Photoshop). Компоновка единого растрового изображения из элементов нескольких исходных растровых изображений.
Результаты работы:
Лабораторная работа №4
Постановка задачи:
Использование средств 3D графики. Использование нескольких средств геометрического моделирования поверхности 3D. Использование деформации или модификации объектов. Использование текстур.
Результат работы:
Лабораторные работы №5 и №6
Постановка задачи:
Аффинные преобразования на плоскости и в пространстве
Листинг программы:
#include <Windows.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <vector>
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
//-----------------------------------------------------------------------------------------------------------
struct Vertex
{
D3DXVECTOR3 position;
D3DCOLOR color;
};
#define FVF D3DFVF_XYZ | D3DFVF_DIFFUSE
//-----------------------------------------------------------------------------------------------------------
HWND hWnd;
IDirect3D9* D3D9;
IDirect3DDevice9* device;
ID3DXFont* DXfont;
RECT rect = {0, 0, 1280, 1024};
IDirect3DVertexBuffer9* vb;
IDirect3DVertexBuffer9* vbOsi;
float CamX = 0, CamY = 0, CamZ = -20;
float ObjX = 0, ObjY = 0, ObjZ = 0, ObjRX = 0, ObjRY = 0, ObjRZ = 0;//глобальные
float lObjX = 0, lObjY = 0, lObjZ = 0, lObjRX = 0, lObjRY = 0, lObjRZ = 0;//локальные
float p = false;
float i = 0;
bool bCamX = false, bCamY = false, bCamZ = false, bObjX = false, bObjY = false, bObjZ = false;
bool bObjRX = false, bObjRY = false, bObjRZ = false, blObjX = false, blObjY = false, blObjZ = false;
bool blObjRX = false, blObjRY = false, blObjRZ = false;
//-----------------------------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void PrintVB(int x, int y);
void InitVB();
void Print(char* str, int x, int y);
void InitDX();
void Draw();
void InitVBOsi();
void DrawOsi();
void SetOsiMatrix();
void SetMatrixObj();
void DrawObject();
void MulMatrix(float x, float y, float z, D3DXMATRIX in, float* outx, float* outy, float* outz);
//-----------------------------------------------------------------------------------------------------------
void ComputeMatrix(D3DXMATRIX* out)
{
D3DXMATRIX world;
D3DXMATRIX translation;
D3DXMATRIX rX;
D3DXMATRIX rY;
D3DXMATRIX rZ;
D3DXMATRIX ltranslation;
D3DXMATRIX lrX;
D3DXMATRIX lrY;
D3DXMATRIX lrZ;
D3DXMatrixTranslation(&translation, ObjX, ObjY, ObjZ);
D3DXMatrixRotationX(&rX, ObjRХ);
D3DXMatrixRotationY(&rY, ObjRY);
D3DXMatrixRotationZ(&rZ, ObjRZ);
D3DXMatrixTranslation(<ranslation, lObjX, lObjY, lObjZ);
D3DXMatrixRotationX(&lrX, lObjRХ);
D3DXMatrixRotationY(&lrY, lObjRY);
D3DXMatrixRotationZ(&lrZ, lObjRZ);
world = lrX * lrY* lrZ * ltranslation * translation * rX * rY * rZ;
*out = world;
};
void MulMatrix(float x, float y, float z, D3DXMATRIX in, float* outx, float* outy, float* outz)
{
*outx = x*in._11+y*in._21+z*in._31+1*in._41;
*outy = x*in._12+y*in._22+z*in._32+1*in._42;
*outz = x*in._13+y*in._23+z*in._33+1*in._43;
}
void DrawObject()
{
device->SetStreamSource(0, vb, 0, sizeof(VerteХ));
device->SetFVF(FVF);
device->DrawPrimitive(D3DPT_LINELIST, 0, 7);
}
void SetMatrixObj()
{
D3DXMATRIX world;
ComputeMatrix(&world);
device->SetTransform(D3DTS_WORLD, &world);
}
void SetOsiMatrix()
{
D3DXMATRIX translation;
D3DXMatrixTranslation(&translation, 0, 0, 0);
device->SetTransform(D3DTS_WORLD, &translation);
}
void SetCamera(float x, float y, float z)
{
D3DXVECTOR3 position(x, y, z);
D3DXVECTOR3 targetPoint(x, y, z+1);
D3DXVECTOR3 worldUp(0.0f, 1.0f, 0.0f);
D3DXMATRIX viewMatrix;
D3DXMatrixLookAtLH(&viewMatrix, &position, &targetPoint, &worldUp);
device->SetTransform(D3DTS_VIEW, &viewMatriХ);
char str[100];
sprintf(str, "Камера: x:%f y:%f z:%f", CamX, CamY, CamZ);
str[strlen(str)] = '\0';
Print(str, 0, 380);
}
void PrintVB(int x, int y)
{
char str[100];
float _x, _y, _z;
D3DXMATRIX world;
ComputeMatrix(&world);
Vertex* vertices;
vb->Lock(0, 0, (void**)&vertices, 0);
for(int i = 0; i < 14; i+=2)
{
MulMatrix(vertices.position.x, vertices.position.y, vertices.position.z, world, &_x, &_y, &_z);
sprintf(str, "Точка №%d: x:%f y:%f z:%f", i/2+1, _x, _y, _z);
str[strlen(str)] = '\0';
Print(str, x, y+30*i/2);
}
vb->Unlock();
}
void DrawOsi()
{
device->SetStreamSource(0, vbOsi, 0, sizeof(VerteХ));
device->SetFVF(FVF);
device->DrawPrimitive(D3DPT_LINELIST, 0, 3);
}
void InitVBOsi()
{
device->CreateVertexBuffer(6 * sizeof(VerteХ), 0, FVF, D3DPOOL_MANAGED, &vbOsi, 0);
Vertex* vertices;
vbOsi->Lock(0, 0, (void**)&vertices, 0);
vertices[0].position = D3DXVECTOR3(0, 0, 0);
vertices[0].color = D3DCOLOR_ARGB(255, 255, 0, 0);
vertices[1].position = D3DXVECTOR3(10, 0, 0);
vertices[1].color = D3DCOLOR_ARGB(255, 255, 0, 0);
vertices[2].position = D3DXVECTOR3(0, 0, 0);
vertices[2].color = D3DCOLOR_ARGB(255, 0, 255, 0);
vertices[3].position = D3DXVECTOR3(0, 10, 0);
vertices[3].color = D3DCOLOR_ARGB(255, 0, 255, 0);
vertices[4].position = D3DXVECTOR3(0, 0, 0);
vertices[4].color = D3DCOLOR_ARGB(255, 0, 0, 255);
vertices[5].position = D3DXVECTOR3(0, 0, -10);
vertices[5].color = D3DCOLOR_ARGB(255, 0, 0, 255);
vbOsi->Unlock();
}
void InitVB()
{
device->CreateVertexBuffer(14 * sizeof(VerteХ), 0, FVF, D3DPOOL_MANAGED, &vb, 0);
Vertex* vertices;
vb->Lock(0, 0, (void**)&vertices, 0);
vertices[0].position = D3DXVECTOR3(0, 0, 0);
vertices[0].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[1].position = D3DXVECTOR3(0, 5, 0);
vertices[1].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[2].position = D3DXVECTOR3(0, 5, 0);
vertices[2].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[3].position = D3DXVECTOR3(2, 0, 0);
vertices[3].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[4].position = D3DXVECTOR3(2, 0, 0);
vertices[4].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[5].position = D3DXVECTOR3(7, 0, 0);
vertices[5].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[6].position = D3DXVECTOR3(7, 0, 0);
vertices[6].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[7].position = D3DXVECTOR3(4, -2, 0);
vertices[7].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[8].position = D3DXVECTOR3(4, -2, 0);
vertices[8].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[9].position = D3DXVECTOR3(-2, -2, 0);
vertices[9].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[10].position = D3DXVECTOR3(-2, -2, 0);
vertices[10].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[11].position = D3DXVECTOR3(-4, 0, 0);
vertices[11].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[12].position = D3DXVECTOR3(-4, 0, 0);
vertices[12].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vertices[13].position = D3DXVECTOR3(0, 0, 0);
vertices[13].color = D3DCOLOR_ARGB(255, 0, 0, 0);
vb->Unlock();
}
void Print(char* str, int x, int y)
{
rect.left = x;
rect.top = y;
DXfont->DrawTextA(NULL, str, -1, &rect, DT_TOP | DT_LEFT, 0xff000000);
}
void InitDX()
{
D3D9 = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS D3DPresentParameters;
D3DPresentParameters.BackBufferWidth = 1280;
D3DPresentParameters.BackBufferHeight = 1024;
D3DPresentParameters.BackBufferFormat = D3DFMT_A8R8G8B8;
D3DPresentParameters.BackBufferCount = 1;
D3DPresentParameters.MultiSampleType = D3DMULTISAMPLE_NONE;
D3DPresentParameters.MultiSampleQuality = 0;
D3DPresentParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
D3DPresentParameters.hDeviceWindow = hWnd;
D3DPresentParameters.Windowed = true;
D3DPresentParameters.EnableAutoDepthStencil = true;
D3DPresentParameters.AutoDepthStencilFormat = D3DFMT_D24S8;
D3DPresentParameters.Flags = 0;
D3DPresentParameters.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
D3DPresentParameters.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
D3D9->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&D3DPresentParameters,
&device);
D3DXMATRIX projection;
D3DXMatrixPerspectiveFovLH( &projection,
D3DX_PI * 0.5f,
1,
1.0f,
1000.0f);
device->SetTransform(D3DTS_PROJECTION, &projection);
device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
InitVB();
InitVBOsi();
//************************************************************************
D3DXFONT_DESCA font;
ZeroMemory(&font, sizeof(D3DXFONT_DESCA));
font.Height = 20;
font.Width = 10;
font.Weight = 500;
font.Italic = false;
font.CharSet = DEFAULT_CHARSET;
strcpy(font.FaceName, "Courier New");
D3DXCreateFontIndirectA(device, &font, &DXfont);
//************************************************************************
device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
device->SetRenderState(D3DRS_LIGHTING, false);
}
void Draw()
{
/*if(p == false)
{
i+=0.001;
ObjRZ=i;
lObjRZ=i*2;
}*/
device->BeginScene();
device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xFFFFFFFF, 1.0f, 0);
SetCamera(CamX, CamY, CamZ);
SetOsiMatrix();
DrawOsi();
SetMatrixObj();
DrawObject();
PrintVB(0, 0);
char str[100];
sprintf(str, "Глобальные преобразование: x:%f y:%f z:%f rx%f ry%f rz%f", ObjX, ObjY, ObjZ, ObjRX, ObjRY, ObjRZ);
str[strlen(str)] = '\0';
Print(str, 0, 300);
sprintf(str, "Локальные преобразование: x:%f y:%f z:%f rx%f ry%f rz%f", lObjX, lObjY, lObjZ, lObjRX, lObjRY, lObjRZ);
str[strlen(str)] = '\0';
Print(str, 0, 320);
device->EndScene();
device->Present(0, 0, 0, 0);
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEХ);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"ae";
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
if (!RegisterClassEx(&wceХ))
{
MessageBox(NULL, L"Call to RegisterClassEx failed!", L"Error", NULL);
return 1;
}
hWnd = CreateWindow( L"ae",
L"",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
1280, 1024,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
{
MessageBox(NULL, L"Call to CreateWindow failed!", L"Error", NULL);
return 1;
}
InitDX();
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(true)
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Draw();
}
}
return msg.wParam;
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_MOUSEWHEEL:
if(bCamХ) CamX+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(bCamY) CamY+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(bCamZ) CamZ+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
//-------------------------------------------------------------
else if(bObjХ) ObjX+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(bObjY) ObjY+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(bObjZ) ObjZ+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(bObjRХ) ObjRX+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(bObjRY) ObjRY+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(bObjRZ) ObjRZ+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
//-------------------------------------------------------------
else if(blObjХ) lObjX+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(blObjY) lObjY+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(blObjZ) lObjZ+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(blObjRХ) lObjRX+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(blObjRY) lObjRY+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
else if(blObjRZ) lObjRZ+=GET_WHEEL_DELTA_WPARAM(wParam)/(float)240;
break;
case WM_LBUTTONDOWN:
break;
case WM_KEYDOWN:
switch(wParam)
{
case 37://влево
CamX-=0.1;
break;
case 39://вправо
CamX+=0.1;
break;
case 38://вверх
CamY+=0.1;
break;
case 40://вниз
CamY-=0.1;
break;
case 32://пробел
p=!p;
break;
//--------------------------------------------------------------------------------------------
case 81://Q
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
bCamX = true;
break;
case 87://W
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
bCamY = true;
break;
case 69://E
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
bCamZ = true;
break;
//--------------------------------------------------------------------------------------------
case 65://A
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
bObjX = true;
break;
case 83://S
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
bObjY = true;
break;
case 68://D
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
bObjZ = true;
break;
case 70://F
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
bObjRX = true;
break;
case 71://G
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
bObjRY = true;
break;
case 72://H
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
bObjRZ = true;
break;
//--------------------------------------------------------------------------------------------
case 90://Z
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
blObjX = true;
break;
case 88://X
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
blObjY = true;
break;
case 67://C
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
blObjZ = true;
break;
case 86://V
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
blObjRX = true;
break;
case 66://B
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObjRZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
blObjRY = true;
break;
case 78://N
bCamX = bCamY = bCamZ = bObjX = bObjY = bObjZ = bObjRX = bObjRY = bObj
RZ = blObjX = blObjY = blObjZ = blObjRX = blObjRY = blObjRZ = false;
blObjRZ = true;
break;
//--------------------------------------------------------------------------------------------
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
Результат работы программы: