Куб средствами Delphi в трёхмерном пространстве
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Куб средствами Delphi в трёхмерном пространстве - 2007-04-07 17:42:10.933333
|
|
|
Vampiring Soul
Сообщений: 1984
Оценки: 0
Присоединился: 2006-06-27 00:13:43
|
Нужно не мне, у чела курсовик по Delphi - задание такое: Средствами делфи создать трёхмерный куб, который можно поворачивать в любом направлении и любым образом относительно центра куба, который в своё время не изменяет своего положения в пространстве. Сам я делфу не знаю, поэтому и обращаюсь сюда.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-07 17:47:31.263333
|
|
|
blacksun
Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
|
Мля, парсь гугл!!
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-07 17:58:08.830000
|
|
|
Vampiring Soul
Сообщений: 1984
Оценки: 0
Присоединился: 2006-06-27 00:13:43
|
Ага, гугл выдаст методичку по заданной теме, дАААА?? Чел сам не знает, как это делать, поэтому НАДО ОБЪЯСНИТЬ КАК вообще подобные вещи делаются.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-07 18:32:17.126666
|
|
|
saimon 2metra
Сообщений: 4281
Оценки: 0
Присоединился: 2007-01-26 10:56:51.426666
|
Чувак! Если сам нишаришь, то труба… Алгоритм нужен, а делфи или асемблер - эт уже пофиг. Мы в универе такие проги писали на турбопаскале гы, потому что первокурсников не подпускали к компам серьёзнее пентиума100:D:D:D. Ничо сложного
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-07 20:21:39.310000
|
|
|
blacksun
Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
|
quote:
ORIGINAL: Vampiring Soul Ага, гугл выдаст методичку по заданной теме, дАААА?? Чел сам не знает, как это делать, поэтому НАДО ОБЪЯСНИТЬ КАК вообще подобные вещи делаются. Бля дочего обнаглели! http://www.google.com/search?client=opera&rls=ru&q=%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B+OpenGL&sourceid=opera&ie=utf-8&oe=utf-8
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-08 02:41:48.996666
|
|
|
SanseiK7
Сообщений: 18
Оценки: 0
Присоединился: 2007-04-07 16:11:58.650000
|
Пусть тот чел поюзает компоненты DelphiX 2000.07.17. Там есть в качестве примера вращающийся 3d-куб. Компоненты юзают вызов функций DirectX. Еще, если не изменяет память, сорсисы вращающегося куба есть в примерах дистра TMT Pascal 3.50.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-08 08:36:19.200000
|
|
|
d0lph1n
Сообщений: 411
Оценки: 0
Присоединился: 2006-09-14 17:55:51.653333
|
DelphiWorld тебе в помощь. Копать в сторону OpenGL/
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-08 08:47:12.640000
|
|
|
NightmareZz
Сообщений: 1087
Оценки: 0
Присоединился: 2006-10-15 11:16:16.833333
|
10$
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-08 12:24:47.616666
|
|
|
T
Сообщений: 1100
Оценки: 0
Присоединился: 2006-01-14 00:15:36
|
9$ 50 центов З.Ы. найт напишет такую, что у тебя на Жыфе 8800 будет тормозить…
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-11 00:33:30.736666
|
|
|
Lord Divius
Сообщений: 188
Оценки: 0
Присоединился: 2005-12-31 15:44:03
|
есть такая либа компонентов: GLScene. и она рулит…
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-11 01:37:56.530000
|
|
|
T
Сообщений: 1100
Оценки: 0
Присоединился: 2006-01-14 00:15:36
|
неслышай их ! Гугль это зло ! Там в поисках ты наткнёшся на злой вирус ! он сотрёт твой биос и твой айпи смутирует, что никуда не зайдёш ! а ещё твой комп станет радиоактивным ! лучше заплати мне, я всё сделаю ) Лана, а если не орать… учи школьный курс тригонометрии… тебе нада найти проэкцию точки лежащей в 3-х мерном пространстве (какбы за экраном), на плоскость экрана…. дальше думай сам… тебе ещё понадобятся функции поворота вектора на заданый угол… и гугль в помощч З.Ы. про вирус я не шутил ))))
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-11 07:33:16.993333
|
|
|
NightmareZz
Сообщений: 1087
Оценки: 0
Присоединился: 2006-10-15 11:16:16.833333
|
quote:
ORIGINAL: T учи школьный курс тригонометрии… тебе нада найти проэкцию точки лежащей в 3-х мерном пространстве (какбы за экраном), на плоскость экрана…. дальше думай сам… тебе ещё понадобятся функции поворота вектора на заданый угол… Вот зачем ты херню морозишь. Ты ж сам дуб дубом в данной теме. Но лиж бы ляпнуть чё-нить. quote:
ORIGINAL: T и гугль в помощч А дальше мысль закончилась :D:D:D
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-11 11:24:46.133333
|
|
|
T
Сообщений: 1100
Оценки: 0
Присоединился: 2006-01-14 00:15:36
|
quote:
ORIGINAL: NightmareZz Вот зачем ты херню морозишь. Ты ж сам дуб дубом в данной теме. Но лиж бы ляпнуть чё-нить. Да? Ану просвети? Мои движки на 486 работали, без всяких дирекс иксов, на асме. А на твои работы я посмотрел, молодец реализовал, и всё…
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 15:55:08.950000
|
|
|
Vampiring Soul
Сообщений: 1984
Оценки: 0
Присоединился: 2006-06-27 00:13:43
|
x$ - это, извините, фиг вам, у студентов денег нету :):) А вот про проекции и вектора читал в книжке по OpenGL, только она для C/C++ - там вовсю использовались объекты и структуры. quote:
blacksun Бля дочего обнаглели! Ага, такие мы, :Dчёрное солнышко:D К тому же в результатах Гугла и других поисковых систем я ничего явно отвечающего проблеме не нашёл. Вот и написал здесь. quote:
saimon 2metra Алгоритм нужен, а делфи или асемблер - эт уже пофиг. Ничо сложного Так что насчёт алгоритма?
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 16:13:17.870000
|
|
|
NightmareZz
Сообщений: 1087
Оценки: 0
Присоединился: 2006-10-15 11:16:16.833333
|
quote:
ORIGINAL: T Да? Ану просвети? Мои движки на 486 работали, без всяких дирекс иксов, на асме. А на твои работы я посмотрел, молодец реализовал, и всё… Где твои движки?
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 16:14:33.640000
|
|
|
NightmareZz
Сообщений: 1087
Оценки: 0
Присоединился: 2006-10-15 11:16:16.833333
|
quote:
ORIGINAL: Vampiring Soul x$ - это, извините, фиг вам, у студентов денег нету :):) Ну это уж твои проблемы. quote:
ORIGINAL: Vampiring Soul Так что насчёт алгоритма? Ну пусть тебе T нахаляву пишет, раз он такой умный. Я свою цену сказал. Но я, в отличие от него, за свои слова отвечаю.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 16:21:24.800000
|
|
|
blacksun
Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
|
quote:
К тому же в результатах Гугла и других поисковых систем я ничего явно отвечающего проблеме не нашёл. Вот и написал здесь. Выпрями руки
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 18:55:58.340000
|
|
|
GorluM
Сообщений: 312
Оценки: 0
Присоединился: 2004-04-07 23:41:00
|
Нарисовать каркас куба легко - строишь 8 точек, соединяешь линиями, и все. Крутить его мышкой? Тогда меняешь координаты всех восьми точек, просто умножая их на матрицу поворота на заданный угол, и заного рисуешь линии.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 19:42:14.516666
|
|
|
blacksun
Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
|
- удалено -
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 20:15:09.466666
|
|
|
GorluM
Сообщений: 312
Оценки: 0
Присоединился: 2004-04-07 23:41:00
|
Могу выслать программку, которую я писал где-то лет 5 назад. Там парабалойд с освещением и заданием качества рендеринга. Убрать все лишнее - получишь свой кубик.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 20:49:33.040000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: Vampiring Soul Так что насчёт алгоритма? гуглем пользоваться не умеем? OpenGL не катит? ну тогда слушай сюда внимательно. 1. любое преобразование, как-то движение, поворот вокруг центра координат, растяжение/сжатие и проекция, описывается матрицей. суперпозиция преобразований – умножением матриц. применение преобразование к вектору – умножение матрицы на вектор. усёк? идея понятна? я думаю – да. возможно, непонятно как же эти матрицы получать. ну так, идёшь в гугль, и ищешь что-нибудь вокруг "компьютерная графика", "матрица", "вектор". я натыкался когда-то на очень неплохие описания. 2. если же тебе надо ещё отсекать невидимые грани, и проч дребедень. то для кубика, можно даже не заводить z-buffer, а просто обойтись ориентацией граней. если каждой правильно прописать перпендикуляр, то потом надо будет просто рисовать только те грани, перпендикуляры которых направлены в сторону экрана. то есть, если перперндикуляр к экрану, торчащий в сторону пользователя умножить скалярно на перпендикуляр к грани, торчащий в сторону от куба, то результат может быть либо положительным либо отрицательным. те грани для которых положительно рисуешь, остальные – нет. вот и всё. тривиально. а насчёт отсутствия денег: захочешь – деньги найдёшь. один раз пивка не попьёшь – это не страшно, даже для здоровья полезно.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 22:48:35.253333
|
|
|
Oburec
Сообщений: 18
Оценки: 0
Присоединился: 2006-12-09 20:19:25.436666
|
Вот примитивный пример кубика рисуемого в OpenGl. Впринципе таких примеров полно по инету.В самом низу можешь прочитать как повращать и подвигать коробку.
unit Unit1;
interface
uses
Windows,Classes,Forms,Dialogs,OpenGL;
type
TfrmGL = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
DC:HDC;
hrc: HGLRC; //ссылка на контекст воспроизведения
RotZ,RotX,RotY,TransZ, //Координаты обьекта
eyex, eyey, eyez,centerx, centery, // положение
centerz, upx, upy, upz, // камеры
TransX,TransY:GLDouble;//поворот и положение
ReturnM:boolean; //Признаки - не используются сейчас.
TexObj: array [0..1] of GLuint; i:word;//номер текстуры
procedure InitGL;
end;
var
frmGL: TfrmGL;
//----------------пока не понял где че
Angle : GLfloat = 0;
Step : GLfloat = 1;
wrkStep : GLfloat = 1;
wrkTime : longint ;
wrkX, wrkY : Integer ;
f: TextFile;
Frame:integer; // Используется для определения рисуемого обьекта
const
//-------------[формат данных для glPointer x1,y1,z1, x2,y2,z2 ]
kvadrat:array[0..71] of glFloat=
(1, 1, 1, -1, 1, 1, -1,-1, 1, 1,-1, 1,
1, 1,-1, 1,-1,-1, -1,-1,-1, -1, 1,-1,
-1, 1, 1, -1, 1,-1, -1,-1,-1, -1,-1, 1,
1, 1, 1, 1,-1, 1, 1,-1,-1, 1, 1,-1,
-1, 1,-1, -1, 1, 1, 1, 1, 1, 1, 1,-1,
-1,-1,-1, 1,-1,-1, 1,-1, 1, -1,-1, 1);
ind:array [0..23] of integer=
(0,1,2,3,
4,5,1,0,
3,2,6,7,
5,4,7,6,
1,5,6,2,
4,0,3,7);
implementation
{$R *.DFM}
procedure glVertexPointer (size: GLint; atype: GLenum;
stride: GLsizei; data: pointer);
stdcall; external OpenGL32;
//---------------------------------------------------------------------
procedure glColorPointer (size: GLint; atype: GLenum; stride: GLsizei;
data: pointer); stdcall; external OpenGL32;
//---------------------------------------------------------------------
procedure glDrawArrays (mode: GLenum; first: GLint; count: GLsizei);
stdcall; external OpenGL32;
//---------------------------------------------------------------------
procedure glEnableClientState (aarray: GLenum);
stdcall; external OpenGL32;
//---------------------------------------------------------------------
procedure glDisableClientState (aarray: GLenum);
stdcall; external OpenGL32;
//---------------------------------------------------------------------
procedure glDrawElements(mode: GLenum;count: GLsizei;
GlType:GLEnum;data: pointer);
stdcall; external OpenGL32;
//---------------------------------------------------------------------
procedure glBindTexture(mode: GLenum; Texture:GLuint
); stdcall; external OpenGL32;
//---------------------------------------------------------------------
procedure glGenTextures (n: GLsizei; textures: PGLuint);
stdcall; external opengl32;
const
GL_VERTEX_ARRAY = $8074;
GL_COLOR_ARRAY = $8076;
{===========Инициализация формы=============================}
Procedure TfrmGL.InitGL;
begin
glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
// Включить преобразование нормалей
// при масштабировании
glEnable (GL_NORMALIZE);
glColor3f (0.4, 0.6, 0.6);
end;
{=======================================================================
Перерисовка окна}
procedure TfrmGL.FormPaint(Sender: TObject);
Const Textured:boolean = True;
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(40.0, ClientWidth / ClientHeight, 3.0, 13.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
{========================================================}
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);// очистка буфера цвета
glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов
{=================Задаем положение камеры============================}
glLoadIdentity;
gluLookAt(eyex, eyey, eyez,centerx, centery, centerz, upx, upy, upz);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
{=================Рисуем оси координат===============================}
glColor3f (1.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex3f(2,0,0);
glVertex3f(0,0,0);
glEnd;
glColor3f (0.0, 1.0, 0.0);
glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(0,2,0);
glEnd;
glColor3f (0.0, 0.0, 1.0);
glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(0,0,2);
glEnd;
//=========================Анимация=========================================
GlPushMatrix;
//======================Интерфейс===========================================
glTranslate(TransX,TransY,TransZ);
glRotate(RotZ,0,0,1);
glRotate(RotY,0,1,0);
glRotate(RotX,1,0,0);
//=========================Рисуем объект====================================
glColor3f (0, 0, 0);
//==========Рисование с помощью массива=====================================
//=====Массив передается в виде одномерного x1,y1,z1,x2,y2,z2,...
glEnableClientState(GL_VERTEX_ARRAY) ;// вкл. режим рисования
glVertexPointer(3, GL_FLOAT, 0,@Kvadrat) ;// указатель на массив
//glDrawElements(GL_Quads,24,GL_Unsigned_Byte,@ind);
glDrawArrays(GL_Quads, 0,72) ;// Рисование методом квадратов
glDisableClientState(GL_VERTEX_ARRAY) ;
glBindTexture(GL_TEXTURE_2D, TexObj[1]);
Frame:=1;
{============================Рисование обьектов сцены з файла=============}
{for i:=0 to 6 do
begin
MyMesh.CurrentFrame:=i*Frame;
MyMesh.draw;
end;}
//================== Рисование одиночного обьекта сцены ===================
//----------------------------------------------------------------------
SwapBuffers(Canvas.Handle); // содержимое буфера - на экран
end;
{=======================================================================
Формат пикселя}
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
{=======================================================================
Создание формы}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
//-------------Инициализация переменных-------------------------
RotZ:=0 ; // Начальный поворот
RotY:=0 ; // Начальный поворот
RotX:=0 ; // Начальный поворот
TransZ:=0 ; // Начальное положение в пространстве
TransX:=0 ;
TransY:=0 ;
ReturnM:=false;
i:=0 ; // Номер текстуры
frame:=0 ; // Номер обьекта по умолчанию при загрузке из файла
{=========================Инициация контекста==========================}
DC := GetDC (Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
InitGL;
{========================Борьба с мерцанием============================}
If DC=0 then showMessage('хрен');
If hrc=0 then showMessage('хрен1');
{====================Задание вида(откуда смотрим=======================}
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode (GL_PROJECTION) ;
glMatrixMode (GL_MODELVIEW) ;
glLoadIdentity ;
eyex:=-6;eyey:=-6;eyez:=1 ; //положение глаз
centerx:=-0.5;centery:=-0.5;centerz:=0.5 ; //положение наблюдаемой точки
upx:=0;upy:=1;upz:=0 ; //Поворот камеры
end;
{=======================================================================
Конец работы приложения}
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0) ;
wglDeleteContext(hrc) ;
ReleaseDC (Handle, DC) ;
DeleteDC (DC) ;
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
{Повороты фигуры-----------------------------------------}
case key of
33: begin TransZ:=1+TransZ ;end;{PageUp}
34: begin TransZ:=-1+TransZ;end;{PageDown}
36: begin TransX:=1+TransX ;end;{Home}
35: begin TransX:=-1+TransX;end;{End}
45: begin TransY:=1+TransY ;end;{Insert}
46: begin TransY:=-1+TransY;end;{Delete}
38: begin RotZ:=5+RotZ ;end;{===Up===}
40: begin RotZ:=-5+RotZ ;end;{==Down=}
39: begin RotY:=5+RotY ;end;{===right===}
37: begin RotY:=-5+RotY ;end;{==left=}
188:begin RotX:=5+RotX ;end;{===<===}
190:begin RotX:=-5+RotX ;end;{==A=}
65: begin eyex:= 1+eyex ;centerx:=centerx+1;end;{==W=}
87: begin eyez:= 1+eyez ;centerz:=centerz+1;end;{==D=}
68: begin eyex:=-1+eyex ;centerx:=centerx-1;end;{==X=}
88: begin eyez:=-1+eyez ;centerz:=centerz-1;end;{==E=}
69: begin eyey:= 1+eyey ;centery:=centery+1;end;{==C=}
67: begin eyey:=-1+eyey ;centery:=centery-1;end;{==C=}
else exit ;
end;
{--------------------------------------------------------}
InvalidateRect(Handle, nil, False);
end;
end.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-23 21:47:53.530000
|
|
|
Vampiring Soul
Сообщений: 1984
Оценки: 0
Присоединился: 2006-06-27 00:13:43
|
найтмарез ИМХО барыга ты какой-то, вот и всё.[>:] GorluM насчёт сорца - было бы очень даже спасибо:) blacksun извини, в локтях всё время изгибаются. но я исправлюсь. точно-точно. когда более-менее сносный РуНет поставлю. потому что тогда смогу гулять по РуНету и без крайней необходимости rgo спасибо за первое что-то вполне конкретное.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-23 22:27:57.703333
|
|
|
voody
Сообщений: 958
Оценки: 0
Присоединился: 2005-02-06 22:28:30
|
В Borland C++ Builder 6 в папке Borland\CBuilder6\Examples\OpenGL\Drawing находится пример куба, шара и конуса, которые вращаются в пространстве при нажатии стрелок на клавиатуре. Получается, это даже больше, чем тебе надо. Я уверен, что в Delphi есть аналог, только уже не на C++, а на Object Pascal. Если хочешь - могу послать этот пример тебе на почту.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-24 12:53:57.353333
|
|
|
JTG
Сообщений: 1189
Оценки: 0
Присоединился: 2007-03-05 11:56:01.993333
|
voody, в дельфе 7-й по краёней мере такого примера нет =(
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-24 22:27:03.570000
|
|
|
voody
Сообщений: 958
Оценки: 0
Присоединился: 2005-02-06 22:28:30
|
quote:
ORIGINAL: JTG voody, в дельфе 7-й по краёней мере такого примера нет =( Это уже не так важно. Мне Vampiring Soul написал в личку и попросил послать ему исходник на C++. Видимо, его и это устраивает. А что, пример вполне полноценный, там даже есть больше, чем надо.
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-24 23:02:06.906666
|
|
|
Mark999
Сообщений: 194
Оценки: 0
Присоединился: 2007-04-23 19:23:59.020000
|
ХМ…., походу здесь хочешь взять на халяву, а другану впарить по полное округленное…
|
|
|
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-28 23:34:15.720000
|
|
|
Vampiring Soul
Сообщений: 1984
Оценки: 0
Присоединился: 2006-06-27 00:13:43
|
Нет, просто лично мне уже стало интересно + из этого исходника можно будет выжать алгоритм со всеми подробностями. А на делф перепереть из алгоритма - дело техники.
|
|
|
|
|