Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет по лабам мой 1.doc
Скачиваний:
0
Добавлен:
18.04.2019
Размер:
1.27 Mб
Скачать

Лабораторная работа №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(&ltranslation, 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;

}

Результат работы программы: