Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Куб средствами Delphi в трёхмерном пространстве

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Куб средствами Delphi в трёхмерном пространстве
Имя
Сообщение << Старые топики   Новые топики >>
Куб средствами Delphi в трёхмерном пространстве - 2007-04-07 17:42:10.933333   
Vampiring Soul

Сообщений: 1984
Оценки: 0
Присоединился: 2006-06-27 00:13:43
Нужно не мне, у чела курсовик по Delphi - задание такое:
    Средствами делфи создать трёхмерный куб, который можно поворачивать в любом направлении и любым образом относительно центра куба, который в своё время не изменяет своего положения в пространстве.
    Сам я делфу не знаю, поэтому и обращаюсь сюда.
Post #: 1
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-07 17:47:31.263333   
blacksun

Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
Мля, парсь гугл!!
Post #: 2
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-07 17:58:08.830000   
Vampiring Soul

Сообщений: 1984
Оценки: 0
Присоединился: 2006-06-27 00:13:43
Ага, гугл выдаст методичку по заданной теме, дАААА??
Чел сам не знает, как это делать, поэтому НАДО ОБЪЯСНИТЬ КАК вообще подобные вещи делаются.
Post #: 3
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-07 18:32:17.126666   
saimon 2metra

Сообщений: 4281
Оценки: 0
Присоединился: 2007-01-26 10:56:51.426666
Чувак! Если сам нишаришь, то труба… Алгоритм нужен, а делфи или асемблер - эт уже пофиг. Мы в универе такие проги писали на турбопаскале гы, потому что первокурсников не подпускали к компам серьёзнее пентиума100:D:D:D. Ничо сложного
Post #: 4
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
Post #: 5
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.
Post #: 6
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-08 08:36:19.200000   
d0lph1n

Сообщений: 411
Оценки: 0
Присоединился: 2006-09-14 17:55:51.653333
DelphiWorld тебе в помощь. Копать в сторону OpenGL/
Post #: 7
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-08 08:47:12.640000   
NightmareZz

Сообщений: 1087
Оценки: 0
Присоединился: 2006-10-15 11:16:16.833333
10$
Post #: 8
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-08 12:24:47.616666   
T

Сообщений: 1100
Оценки: 0
Присоединился: 2006-01-14 00:15:36
9$ 50 центов
З.Ы. найт напишет такую, что у тебя на Жыфе 8800 будет тормозить…
Post #: 9
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-11 00:33:30.736666   
Lord Divius

Сообщений: 188
Оценки: 0
Присоединился: 2005-12-31 15:44:03
есть такая либа компонентов: GLScene. и она рулит…
Post #: 10
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-11 01:37:56.530000   
T

Сообщений: 1100
Оценки: 0
Присоединился: 2006-01-14 00:15:36
неслышай их ! Гугль это зло ! Там в поисках ты наткнёшся на злой вирус ! он сотрёт твой биос и твой айпи смутирует, что никуда не зайдёш ! а ещё твой комп станет радиоактивным ! лучше заплати мне, я всё сделаю )
Лана, а если не орать… учи школьный курс тригонометрии… тебе нада найти проэкцию точки лежащей в 3-х мерном пространстве (какбы за экраном), на плоскость экрана…. дальше думай сам… тебе ещё понадобятся функции поворота вектора на заданый угол… и гугль в помощч
З.Ы. про вирус я не шутил ))))
Post #: 11
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
Post #: 12
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-11 11:24:46.133333   
T

Сообщений: 1100
Оценки: 0
Присоединился: 2006-01-14 00:15:36
quote:

ORIGINAL: NightmareZz
Вот зачем ты херню морозишь. Ты ж сам дуб дубом в данной теме. Но лиж бы ляпнуть чё-нить.

Да? Ану просвети? Мои движки на 486 работали, без всяких дирекс иксов, на асме. А на твои работы я посмотрел, молодец реализовал, и всё…
Post #: 13
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

Алгоритм нужен, а делфи или асемблер - эт уже пофиг. Ничо сложного

Так что насчёт алгоритма?

Post #: 14
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 16:13:17.870000   
NightmareZz

Сообщений: 1087
Оценки: 0
Присоединился: 2006-10-15 11:16:16.833333
quote:

ORIGINAL: T
Да? Ану просвети? Мои движки на 486 работали, без всяких дирекс иксов, на асме. А на твои работы я посмотрел, молодец реализовал, и всё…

Где твои движки?
Post #: 15
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 нахаляву пишет, раз он такой умный.
Я свою цену сказал. Но я, в отличие от него, за свои слова отвечаю.
Post #: 16
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 16:21:24.800000   
blacksun

Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
quote:

К тому же в результатах Гугла и других поисковых систем я ничего явно отвечающего проблеме не нашёл. Вот и написал здесь.

Выпрями руки
Post #: 17
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 18:55:58.340000   
GorluM

Сообщений: 312
Оценки: 0
Присоединился: 2004-04-07 23:41:00
Нарисовать каркас куба легко - строишь 8 точек, соединяешь линиями, и все.
Крутить его мышкой? Тогда меняешь координаты всех восьми точек, просто умножая их на матрицу поворота на заданный угол, и заного рисуешь линии.
Post #: 18
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 19:42:14.516666   
blacksun

Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
- удалено -
Post #: 19
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-14 20:15:09.466666   
GorluM

Сообщений: 312
Оценки: 0
Присоединился: 2004-04-07 23:41:00
Могу выслать программку, которую я писал где-то лет 5 назад. Там парабалойд с освещением и заданием качества рендеринга. Убрать все лишнее - получишь свой кубик.
Post #: 20
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, а просто обойтись ориентацией граней. если каждой правильно прописать перпендикуляр, то потом надо будет просто рисовать только те грани, перпендикуляры которых направлены в сторону экрана. то есть, если перперндикуляр к экрану, торчащий в сторону пользователя умножить скалярно на перпендикуляр к грани, торчащий в сторону от куба, то результат может быть либо положительным либо отрицательным. те грани для которых положительно рисуешь, остальные – нет.

вот и всё. тривиально.
а насчёт отсутствия денег: захочешь – деньги найдёшь. один раз пивка не попьёшь – это не страшно, даже для здоровья полезно.
Post #: 21
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;{===&lt;===} 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.

Post #: 22
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-23 21:47:53.530000   
Vampiring Soul

Сообщений: 1984
Оценки: 0
Присоединился: 2006-06-27 00:13:43
найтмарез
    ИМХО барыга ты какой-то, вот и всё.[>:]
GorluM
    насчёт сорца - было бы очень даже спасибо:)
blacksun
    извини, в локтях всё время изгибаются. но я исправлюсь. точно-точно. когда более-менее сносный РуНет поставлю. потому что тогда смогу гулять по РуНету и без крайней необходимости
rgo
    спасибо за первое что-то вполне конкретное.
Post #: 23
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. Если хочешь - могу послать этот пример тебе на почту.
Post #: 24
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-24 12:53:57.353333   
JTG

Сообщений: 1189
Оценки: 0
Присоединился: 2007-03-05 11:56:01.993333
voody, в дельфе 7-й по краёней мере такого примера нет =(
Post #: 25
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++. Видимо, его и это устраивает. А что, пример вполне полноценный, там даже есть больше, чем надо.
Post #: 26
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-24 23:02:06.906666   
Mark999

Сообщений: 194
Оценки: 0
Присоединился: 2007-04-23 19:23:59.020000
ХМ…., походу здесь хочешь взять на халяву, а другану впарить по полное округленное…
Post #: 27
RE: Куб средствами Delphi в трёхмерном пространстве - 2007-04-28 23:34:15.720000   
Vampiring Soul

Сообщений: 1984
Оценки: 0
Присоединился: 2006-06-27 00:13:43
Нет, просто лично мне уже стало интересно + из этого исходника можно будет выжать алгоритм со всеми подробностями.
А на делф перепереть из алгоритма - дело техники.
Post #: 28
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Куб средствами Delphi в трёхмерном пространстве







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.