Пример создания 3D движкаDelphi , Графика и Игры , Создание игрПример создания 3D движкаАвтор: BoogeMan OpenGL - стандартный для большинства платформ и операционных систем набор низкоуровневых функций двумерной и трехмерной графики, библиотека, широко используемая в промышленных CAD-системах и играх. Поставляется в составе операционной системы Windows, начиная с версии OSR2 в виде двух DLL-файлов - opengl32.dll и glu32.dll. Первая из этих библиотек и есть собственно набор функций OpenGL, вторая содержит дополнительный набор функций, упрощающих кодирование, но построенных и выполняемых с подключением opengl32.dll и являющаяся надстройкой. То, что эти библиотеки поставляются в составе операционной системы, значительно упрощает распространение разработанных приложений. То, что OpenGL распространяется в виде динамических библиотек, упрощает доступ к его функциям. При выборе базы для построения приложений графики несомненными достоинствами OpenGL являются его простота и стандартность - код в случае необходимости можно легко перенести на другую платформу или под другую операционную систему. Для более подробной информации о OpenGL смотрите здесь Ну что, начнем? Для начала создадим пару классов для дальнейшей работы. 3D объект. unit gl_max; interface uses Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Controls, Dialogs, SysUtils, OpenGL; type gl_color=array[1..3]of glfloat; gl_Rotate=array[1..3]of glfloat; text_cor=record x,y:glfloat; //нормаль (вектор) end; normal=record x,y,z:glfloat; //нормаль (вектор) znak:boolean; //знак нормали end; sl_point=^tpoint; tpoint=record x,y,z:integer; texture:text_cor; smooh_nrml:normal; n:integer; //координаты и номер select:boolean; //выделение точки color:gl_color; //цвет вершины next:sl_point; //сл. точка в списке end; tpoint_fl=record x,y,z:glfloat; end; sl_poly=^tpoly; tpoly=record vr:array[1..3]of sl_point; //Ссылки на точки в списке nrml:normal; //каждый полигон имеет свою нормаль gl_p_color:boolean; //цвет полигона или по верширнам color:gl_color; //цвет полигона next:sl_poly; //ссылка на сл. полигон end; sl_obj=^tGL_object3D; tGL_object3D = class obj_set:record texture,smooth, color_m,light:boolean; draw_mode:glenum; end; angcn,angfr:array[1..3]of glfloat; next:sl_obj; x,y,z:integer; select:boolean; smooth:boolean; private fall_points:sl_point; //Список точек next_p,new_p:sl_point; //Список точек fall_polys,next_poly:sl_poly; //список полигонов sh_points:boolean; sh_frame:boolean; public function put_point(x,y,z:integer):sl_point; function put_polygon:sl_poly; function get_selested:integer; function get_point(x,y,z:integer):sl_point; function get_sel_poly:sl_poly; procedure set_text_cor(x,y:glfloat); function get_col_points:integer; function get_col_polys:integer; procedure ved_diap(x,y,z,rad:glfloat); procedure ved_poly_by_point; function line_per(x1,y1,z1,x2,y2,z2:glfloat;var nrm:normal):tpoint_fl; procedure reset_ss_normals; procedure reset_sm_nrml_sel; procedure reset_sm_nrml; procedure filter_obj(x,y,z,rad:glfloat); procedure sin_obj(kof:glfloat); procedure set_s_color(r,g,b:glfloat); procedure de_sel; procedure invert_obj(x,y,z:boolean); procedure clear_obj; procedure select_all; procedure invert_select; procedure show_points(mode:boolean); procedure show_frame(mode:boolean); procedure invert_nrm; procedure del_polygons; procedure del_points; procedure reset_normals; //производит расщет всех нормалей procedure invert_normals; //инвертирует все нормали procedure LoadFromFile(const FileName : String); procedure Save_to_File(const FileName : String); procedure Draw; end; Список 3D объектов, единичный объект которого будет класс tGL_object3D. tList_objects3D = class private fall_obj,new_obj,next_obj:sl_obj; public function put_obj(x,y,z:integer;filename:string):sl_obj; function GET_obj_XY(x,y:integer):sl_obj; function GET_obj_Xz(x,z:integer):sl_obj; function get_col_s:integer; function get_col:integer; procedure sel_point_xz(x,z:integer); procedure set_color(r,g,b:glfloat); procedure SET_TEXT_CORD(x,y:glfloat); procedure filter_list(x,y,z,rad:glfloat); procedure reset_nrm_s; procedure del_poly_obj; procedure sdv_object(x,y,z:integer); procedure del_s_points; procedure sel_point_xy(x,y:integer); procedure put_poly_obj; procedure save_to_file_s(filename:string); procedure sel_all_points; procedure select_all; procedure inv_select; procedure inv_smooth; procedure set_draw_mode(mode:glenum); procedure show_points(b:boolean); procedure save_to_list_file(filename:string); procedure load_from_list_file(filename:string); procedure put_point_In_s(x,y,z:integer); procedure sdv_points_obj(xh,yh,zh:integer); procedure invert_objects(x,y,z:boolean); procedure Inv_sel_points; procedure obr_nrm_sel; procedure draw_list; procedure draw_list_xy(pw,ph,xsm,ysm,st:integer); procedure draw_list_xz(pw,ph,xsm,ysm,st:integer); procedure calk_sm_nrml; procedure del_obj; procedure clear; end; И несколько дополнительный функций: procedure butbar3d(x1,y1,z1,x2,y2,z2:real;dr_type:glenum); function get_Normal(p1,p2,p3:tpoint;zn:boolean):normal; function get_Normal_fl(p1,p2,p3:tpoint_fl):normal; function get_dl_line(x1,y1,z1,x2,y2,z2:glfloat):glfloat; function get_S_abc(x1,y1,z1,x2,y2,z2,x3,y3,z3:integer):glfloat; function getpoint(p1,p2,pt1,pt2,pt3:tpoint_fl;nrm:normal):tpoint_fl; function get_angle(x,y:glfloat):glfloat; function point_in_triangle(x1,y1,x2,y2,x3,y3,x,y:glfloat):boolean; function PixelInOtr(x1,y1,x2,y2,x,y:glfloat):boolean; procedure rotate_point(angle:glfloat;var x,y:glfloat); procedure butbar3d_in(x1,y1,z1,x2,y2,z2:real;dr_type:glenum); Теперь немного о самой форме : Будем обрабатывать следующие: procedure FormCreate(Sender: TObject); // выбираем нужный адаптер и устанавливаем нужные размеры окна procedure FormDestroy(Sender: TObject); //возврощаем все что взяли procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); //смотрем что зажато procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); //смотрем что отпустили procedure FormKeyPress(Sender: TObject; var Key: Char); //смотрем что нажали Исходный текст можна взять здесь Программист, используя модель Deepseek Coder, разрабатывает 3D-игровой движок с использованием OpenGL. Я переведу текст на русский язык: Структура классов
Вы определили несколько классов, включая Функциональность
Определенные функции в каждом классе seem to be related к объектной манипуляции, включая добавление точек и полигонов, выбор объектов и выполнение операций над ними. Некоторые функции, такие как Интеграция OpenGL Это здорово, что вы используете OpenGL, который является широко используемым и хорошо зарекомендованным библиотекой для 3D-графики. Однако, я не вижуdirect references к функциям или переменным OpenGL в вашем коде. Вы может хотеть интегрировать эти функции непосредственно в классы, чтобы упростить отображение и другие операции с графикой. Процедуры форм Процедуры форм (FormCreate, FormDestroy, FormKeyDown и т.д.) suggest, что вы строите графическое пользовательское интерфейсе (GUI) с использованием фреймворка Delphi. Эти процедуры будут использоваться для обработки различных событий, таких как создание окна, нажатия клавиш и клики мыши. Предложения 1. Организация кода: Рассмотрите разделение вашего кода на отдельные модули или units для каждого класса или функциональности. Это упростит поддержку и обновление индивидуальных компонентов без влияния на весь проект. 2. Комментарии и документация: Добавьте комментарии и docstrings, чтобы объяснить цель каждой функции, переменной и класса. Это поможет другим понимать ваш код и сделать его более читаемым. 3. Интеграция OpenGL: Рассмотрите интеграцию функций OpenGL непосредственно в классы для упрощения отображения и других операций с графикой. 4. Обработка ошибок: Реализуйте механизмы обработки ошибок, чтобы обеспечить recoverability вашего программы от неожиданных ошибок или исключений. В целом, ваш проект имеет много потенциала, и я рад видеть, как он будет развиваться! Если у вас есть конкретные вопросы или вы хотите более детального обратного связи по отдельным аспектам кода, пожалуйста, не стесняйтесь спрашивать. Пример создания 3D движка для приложений с использованием библиотеки OpenGL и языка программирования Pascal. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Создание игр ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |