Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Пример создания 3D движка

Delphi , Графика и Игры , Создание игр

Пример создания 3D движка

Автор: BoogeMan
Оформил: RT17

   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. Я переведу текст на русский язык:

Структура классов Вы определили несколько классов, включая tGL_bject3D и tList_Objects3D. Эти классы seem to be designed для управления 3D-объектами и их свойствами. Структура класса не entirely clear из предоставленного кода, но appears, что tGL_object3D - это одиночный объект, а tList_objects3D управляет списком этих объектов.

Функциональность Определенные функции в каждом классе seem to be related к объектной манипуляции, включая добавление точек и полигонов, выбор объектов и выполнение операций над ними. Некоторые функции, такие как put_point, put_polygon и line_per, suggest, что движок предназначен для отображения 3D-графики.

Интеграция 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
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:32:20/0.0065510272979736/1