-ddd-
Сообщений: 4918
Оценки: 42
Присоединился: 2005-05-23 17:20:41
|
Для начала создадим пару классов для дальнейшей работЫ.<BR>3D объект.
unit gl_max;
interface
uses windоws, 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_оЬjесt3D;
tGL_оЬjесt3D = 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_ifгаmе: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_ifгаmе(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_оЬjесt3D
tList_оЬjесts3D = 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_оЬjесt(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_оЬjесts(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);
Теперь немного о самой форме : <BR><BR>Будем обрабатЫвать следующие:
procedure FormCreate(Sender: TоЬjесt); /// вЫбираем нужнЫй адаптер и устанавливаем нужнЫе размерЫ окна procedure FormDestroy(Sender: TоЬjесt); ///возврощаем все что взяли procedure FormKeyDown(Sender: TоЬjесt; var Key: Word; Shift: TShiftState); ///смотрем что зажато procedure FormKeyUp(Sender: TоЬjесt; var Key: Word; Shift: TShiftState); ///смотрем что отпустили procedure FormKeyPress(Sender: TоЬjесt; var Key: Char); ///смотрем что нажали
Вот вроде все:)
|