Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2009, 07:30   #1
devi409
Пользователь
 
Регистрация: 28.12.2006
Сообщений: 75
По умолчанию 3d редактор, где взять и как загрузить модель

Здраствуйте уважаемые.
возник вопрос где бы взять редактор для 3D моделей чтобы потом сохранять их в файл.
соответственно чтобы потом эти модели можно было загрузить в delphi
а вот с использованием хотелось бы попроще например вставляешь строку в процедуру отрисовки Model[1] и это означает кучу плоскостей которые там отрисовывались бы.
может имеется какой либо бодуть?
подскажите плиз.
ЗЫ: можно без анимирования
devi409 вне форума Ответить с цитированием
Старый 19.03.2009, 07:35   #2
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

юзай 3Dmax, я где то видел как в delphi работают с его моделями
либо GLScense там можно моделировать объекты

http://www.render.ru/books/show_book.php?book_id=242
Перед тем как спросить ищи на форуме и в GOOGLE

Последний раз редактировалось KORN; 19.03.2009 в 07:40.
KORN вне форума Ответить с цитированием
Старый 19.03.2009, 08:11   #3
devi409
Пользователь
 
Регистрация: 28.12.2006
Сообщений: 75
По умолчанию

к сожалению у меня свой движек. пускай малопроизводительный но работает.
мне нужен только модуль загружающий модели и отображающий их.
devi409 вне форума Ответить с цитированием
Старый 19.03.2009, 10:11   #4
lerka
Пользователь
 
Аватар для lerka
 
Регистрация: 19.03.2009
Сообщений: 14
По умолчанию

в 3dMax можно
из него сохранить объекты в формат .ASE
а потом через Converter3DMax сделать .shp - там можно и с текстурками работать и простейшее редактирование осуществлять,
а уж .sph к делфи подключаются:
Код:
MakeObject3Dmax('RES\cube1.shp',BOX1);
и еще страничка с процедурой построения, там почти полностью из .ASE файла все
сюда не разрешают код вставить (

Последний раз редактировалось lerka; 19.03.2009 в 10:17.
lerka вне форума Ответить с цитированием
Старый 19.03.2009, 12:20   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
MakeObject3Dmax
Ну и в каком модуле это?
Цитата:
сюда не разрешают код вставить (
Кто?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.03.2009, 13:19   #6
lerka
Пользователь
 
Аватар для lerka
 
Регистрация: 19.03.2009
Сообщений: 14
По умолчанию

Код:
unit UnBuildModel3Dmax;

interface

uses OpenGL,SysUtils, Dialogs, UnBuildTexture;

const
  MAX_COL_POINTS=10000;   // максимальное количество точек в объекте
  MAX_COL_DETAY=1000;      // максимальное количество элементов

type
  TVector=record
    x: glFloat;
    y: glFloat;
    z: glFloat;
  end;
  TObj=record          // Структура с информацией об отображаемых объектах
    mov: array[0..2] of GLfloat; // Перемещение
    rot: array[0..2] of GLfloat; // Вращение
    sca: array[0..2] of GLfloat; // Масштабирование
    typ: GLInt;                  // Тип примитива
    num_obj: GLInt;
    num_array: GLInt;
    col_point: GLInt;            // Количество точек примитива
    col_norm: GLInt;             // Количество нормалей
    col_tex: GLInt;             // Количество текстурных вершин
    col_face: GLInt;             // Количество граней примитива
    col_face_texture: GLInt;     // Количество текстурных граней примитива
    vert_point: array[0..MAX_COL_POINTS] of TVector; // Координаты точек
    norm_point: array[0..MAX_COL_POINTS] of TVector; // Координаты нормали
    norm_point_ASE: array[0..MAX_COL_POINTS,0..2] of TVector; // Координаты нормали
    text_point: array[0..MAX_COL_POINTS,0..2] of GLfloat; // Координаты текстуры
    Type_text: word;// Способ наложения текстуры
    num_vertex: array [0..MAX_COL_POINTS,0..2] of word;
    num_vertex_texture: array [0..MAX_COL_POINTS,0..2] of word;
  end;

  procedure MakeObject3Dmax(FileName: string; Num: integer);
  procedure LoadObject3Dmax(FileName: string; Num: integer);
  procedure BuildObject3Dmax(Num: integer);

implementation

var

  Mater_Ambien: array[1..MAX_COL_DETAY,0..3]of GLFloat;
  Mater_Specul: array[1..MAX_COL_DETAY,0..3]of GLFloat;
  Mater_Diffus: array[1..MAX_COL_DETAY,0..3]of GLFloat;
  Mater_Emissi: array[1..MAX_COL_DETAY,0..3]of GLFloat;
  Mater_Shinin: array[1..MAX_COL_DETAY] of GLFloat;
  ModeMaterial: array[1..MAX_COL_DETAY] of word; // Fr, Ba, Fr+Ba

  Name_elem:array[0..MAX_COL_DETAY] of string;
  Name_texture:array[0..MAX_COL_DETAY] of string;
  col_obj: integer;
  Obj: array of TObj;


procedure MakeObject3Dmax(FileName: string; Num: integer);
begin
  LoadObject3Dmax(FileName, Num);
  BuildObject3Dmax(Num);
  if Obj<>nil then Finalize(Obj);
end;

procedure LoadObject3Dmax(FileName: string; Num: integer);
var a,b,c: integer;
  S: String;
  F_Name:TextFile;
begin
  S:=FileName;
  if not FileExists(s) then begin
    MessageDlg('Нет файла '+s, mtInformation,[mbOk], 0);
    exit;
  end;
  AssignFile(F_Name,S);  {Связывание файла с именем}
  Reset(F_Name);
  ReadLn(F_Name, S);     //Описание
  ReadLn(F_Name, S);     //Количество объектов
  if s<>'Ver2' then begin
    CloseFile(F_Name);
    exit
  end;
  ReadLn(F_Name, S);     //'Количество элементов';
  ReadLn(F_Name, S);     //'Количество элементов';
  col_obj:=strtoint(s);
  SetLength(Obj, (col_obj+3));
  for a:=1 to col_obj do begin
    ReadLn(F_Name, S);     //Имя объекта
    ReadLn(F_Name, S);     //Имя объекта
    Name_elem[a]:=s;
    ReadLn(F_Name, S);     //Перенос'
    ReadLn(F_Name, S);     //Перенос'
    Obj[a].mov[0]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Перенос'
    Obj[a].mov[1]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Перенос'
    Obj[a].mov[2]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Поворот'
    ReadLn(F_Name, S);     //Поворот'
    Obj[a].rot[0]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Поворот'
    Obj[a].rot[1]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Поворот'
    Obj[a].rot[2]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Масштабирование
    ReadLn(F_Name, S);     //Масштабирование
    Obj[a].sca[0]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Масштабирование
    Obj[a].sca[1]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Масштабирование
    Obj[a].sca[2]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Имя текстуры
    ReadLn(F_Name, S);     //Имя текстуры
    Name_texture[a]:=s;
    ReadLn(F_Name, S);     //Способ наложения текстуры
    ReadLn(F_Name, S);     //Способ наложения текстуры
    Obj[a].Type_text:=strtoint(s);
    ReadLn(F_Name, S);     //Материал зеркальный
    ReadLn(F_Name, S);     //Материал зеркальный
    Mater_Specul[a,0]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Материал зеркальный
    Mater_Specul[a,1]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Материал зеркальный
    Mater_Specul[a,2]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Материал зеркальный
    Mater_Specul[a,3]:=Strtofloat(s);

    ReadLn(F_Name, S);     //Материал рассеяный
    ReadLn(F_Name, S);     //Материал рассеяный
    Mater_Ambien[a,0]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Материал рассеяный
    Mater_Ambien[a,1]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Материал рассеяный
    Mater_Ambien[a,2]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Материал рассеяный
    Mater_Ambien[a,3]:=Strtofloat(s);
lerka вне форума Ответить с цитированием
Старый 19.03.2009, 13:20   #7
lerka
Пользователь
 
Аватар для lerka
 
Регистрация: 19.03.2009
Сообщений: 14
По умолчанию

Код:
 ReadLn(F_Name, S);     //Материал диффузный
    ReadLn(F_Name, S);     //Материал диффузный
    Mater_Diffus[a,0]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Материал диффузный
    Mater_Diffus[a,1]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Материал диффузный
    Mater_Diffus[a,2]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Материал диффузный
    Mater_Diffus[a,3]:=Strtofloat(s);
    ReadLn(F_Name, S);     //Тип примитива
    ReadLn(F_Name, S);     //Тип примитива
    Obj[a].typ:=strtoint(s);
    ReadLn(F_Name, S);     // Front, Back, Front and Back
    ReadLn(F_Name, S);
    ModeMaterial[a]:=StrToInt(S);
    ReadLn(F_Name, S);     // Shinin
    ReadLn(F_Name, S);
    Mater_Shinin[a]:=StrToFloat(S);

    ReadLn(F_Name, S);     // Emissi
    ReadLn(F_Name, S);
    Mater_Emissi[a,0]:=StrToFloat(S);
    ReadLn(F_Name, S);
    Mater_Emissi[a,1]:=StrToFloat(S);
    ReadLn(F_Name, S);
    Mater_Emissi[a,2]:=StrToFloat(S);
    ReadLn(F_Name, S);
    Mater_Emissi[a,3]:=StrToFloat(S);

    ReadLn(F_Name, S);     //  Количество вершин
    ReadLn(F_Name, S);
    Obj[a].col_point:=StrToInt(S);
    for b:=0 to Obj[a].col_point-1 do begin
      ReadLn(F_Name, S);
      Obj[a].vert_point[b].x:=StrToFloat(S);
      ReadLn(F_Name, S);
      Obj[a].vert_point[b].y:=StrToFloat(S);
      ReadLn(F_Name, S);
      Obj[a].vert_point[b].z:=StrToFloat(S);
    end;
    ReadLn(F_Name, S);    // Грани и номера вершин
    ReadLn(F_Name, S);
    Obj[a].col_face:=StrToInt(S);
    for b:=0 to Obj[a].col_face-1 do begin
      ReadLn(F_Name, S);
      Obj[a].num_vertex[b,0]:=StrToInt(S);
      ReadLn(F_Name, S);
      Obj[a].num_vertex[b,1]:=StrToInt(S);
      ReadLn(F_Name, S);
      Obj[a].num_vertex[b,2]:=StrToInt(S);
    end;
    ReadLn(F_Name, S);   // Текстурные координаты
    ReadLn(F_Name, S);
    Obj[a].col_tex:=StrToInt(S);
    if (Obj[a].col_tex>0) then begin
      for b:=0 to Obj[a].col_tex-1 do begin
        ReadLn(F_Name, S);
        Obj[a].text_point[b,0]:=StrToFloat(S);
        ReadLn(F_Name, S);
        Obj[a].text_point[b,1]:=StrToFloat(S);
        ReadLn(F_Name, S);
        Obj[a].text_point[b,2]:=StrToFloat(S);
      end;
    end;
    ReadLn(F_Name, S);   // Грани и номера вершин текстурных координат
    ReadLn(F_Name, S);
    Obj[a].col_face_texture:=StrToInt(S);
    if (Obj[a].col_face_texture>0) then begin
      for b:=0 to Obj[a].col_face_texture-1 do begin
        ReadLn(F_Name, S);
        Obj[a].num_vertex_texture[b,0]:=StrToInt(S);
        ReadLn(F_Name, S);
        Obj[a].num_vertex_texture[b,1]:=StrToInt(S);
        ReadLn(F_Name, S);
        Obj[a].num_vertex_texture[b,2]:=StrToInt(S);
      end;
    end;
    ReadLn(F_Name, S);   // Нормали для всех вершин граней
    ReadLn(F_Name, S);
    Obj[a].col_norm:=StrToInt(S);
    for b:=0 to Obj[a].col_norm-1 do begin
      for c:=0 to 2 do begin
        ReadLn(F_Name, S);
        Obj[a].norm_point_ASE[b,c].x:=StrToFloat(S);
        ReadLn(F_Name, S);
        Obj[a].norm_point_ASE[b,c].y:=StrToFloat(S);
        ReadLn(F_Name, S);
        Obj[a].norm_point_ASE[b,c].z:=StrToFloat(S);
      end;
    end;
  end;
  CloseFile(F_Name);
end;
lerka вне форума Ответить с цитированием
Старый 19.03.2009, 13:21   #8
lerka
Пользователь
 
Аватар для lerka
 
Регистрация: 19.03.2009
Сообщений: 14
По умолчанию

Код:
procedure BuildObject3Dmax( Num: integer);
var
  mat_a : array [0..3] of GLFloat ; //
  mat_s : array [0..3] of GLFloat ; //
  mat_d : array [0..3] of GLFloat ; //
  a,b: integer;
  x,y,z,xt,yt: array[1..3] of real;
begin
  glNewList (Num, GL_COMPILE);// Создаём объект
    for a:=1 to col_obj do begin
      glPushMatrix;
        if (Obj[a].mov[0]<>0) or     //Перемещение
             (Obj[a].mov[1]<>0) or
                (Obj[a].mov[2]<>0) then
                    glTranslatef(Obj[a].mov[0],Obj[a].mov[1],Obj[a].mov[2]);
        if Obj[a].rot[0]<>0 then  glRotatef(Obj[a].rot[0],1,0,0); //Поворот
        if Obj[a].rot[1]<>0 then  glRotatef(Obj[a].rot[1],0,1,0);
        if Obj[a].rot[2]<>0 then  glRotatef(Obj[a].rot[2],0,0,1);
        if (Obj[a].sca[0]<>1) or     // Масштабирование
             (Obj[a].sca[1]<>1) or
                (Obj[a].sca[2]<>1) then
                    glScalef(Obj[a].sca[0],Obj[a].sca[1],Obj[a].sca[2]);
        if (Obj[a].Type_text<>11) then PrepareImage (Name_texture[a],Obj[a].Type_text,0)
                                  else glDisable(GL_TEXTURE_2D);
        mat_a[0]:=Mater_Ambien[a,0];
        mat_a[1]:=Mater_Ambien[a,1];
        mat_a[2]:=Mater_Ambien[a,2];
        mat_a[3]:=Mater_Ambien[a,3];
        mat_s[0]:=Mater_Specul[a,0];mat_s[1]:=Mater_Specul[a,1];mat_s[2]:=Mater_Specul[a,2];mat_s[3]:=Mater_Specul[a,3];
        mat_d[0]:=Mater_Diffus[a,0];mat_d[1]:=Mater_Diffus[a,1];mat_d[2]:=Mater_Diffus[a,2];mat_d[3]:=Mater_Diffus[a,3];
        case  ModeMaterial[a] of
          0: begin
            glMaterialfv(GL_FRONT, GL_DIFFUSE,@mat_d);
            glMaterialfv(GL_FRONT, GL_AMBIENT,@mat_a);
            glMaterialfv(GL_FRONT, GL_SPECULAR,@mat_s);
          end;
          1: begin
            glMaterialfv(GL_BACK, GL_DIFFUSE,@mat_d);
            glMaterialfv(GL_BACK, GL_AMBIENT,@mat_a);
            glMaterialfv(GL_BACK, GL_SPECULAR,@mat_s);
          end;
          2: begin
            glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,@mat_d);
            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,@mat_a);
            glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,@mat_s);
          end;
        end;
        glBegin(GL_TRIANGLES);
          for b:=0 to Obj[a].col_face-1 do begin
            if Obj[a].col_face_texture>0 then begin
              glTexCoord2f(Obj[a].text_point[Obj[a].num_vertex_texture[b,0]][0],
                           Obj[a].text_point[Obj[a].num_vertex_texture[b,0]][1]);
             end;
             glNormal3f(Obj[a].norm_point_ASE[b,0].x,
                        Obj[a].norm_point_ASE[b,0].y,
                        Obj[a].norm_point_ASE[b,0].z);
             glVertex3f(Obj[a].vert_point[Obj[a].num_vertex[b,0]].X,
                        Obj[a].vert_point[Obj[a].num_vertex[b,0]].y,
                        Obj[a].vert_point[Obj[a].num_vertex[b,0]].z);

             if Obj[a].col_face_texture>0 then begin
               glTexCoord2f(Obj[a].text_point[Obj[a].num_vertex_texture[b,1]][0],
                            Obj[a].text_point[Obj[a].num_vertex_texture[b,1]][1]);
             end;
             glNormal3f(Obj[a].norm_point_ASE[b,1].x,
                        Obj[a].norm_point_ASE[b,1].y,
                        Obj[a].norm_point_ASE[b,1].z);
        	   glVertex3f(Obj[a].vert_point[Obj[a].num_vertex[b,1]].X,
                        Obj[a].vert_point[Obj[a].num_vertex[b,1]].y,
                        Obj[a].vert_point[Obj[a].num_vertex[b,1]].z);
             if Obj[a].col_face_texture>0 then begin
               glTexCoord2f(Obj[a].text_point[Obj[a].num_vertex_texture[b,2]][0],
                            Obj[a].text_point[Obj[a].num_vertex_texture[b,2]][1]);
             end;
             glNormal3f(Obj[a].norm_point_ASE[b,2].x,
                        Obj[a].norm_point_ASE[b,2].y,
                        Obj[a].norm_point_ASE[b,2].z);
             glVertex3f(Obj[a].vert_point[Obj[a].num_vertex[b,2]].X,
                        Obj[a].vert_point[Obj[a].num_vertex[b,2]].y,
                        Obj[a].vert_point[Obj[a].num_vertex[b,2]].z);
           end;
        glEnd;
        if (Obj[a].Type_text=11) then glEnable(GL_TEXTURE_2D);
      glPopMatrix;
    end;
  glEndList;// Создаём объект
end;

end.
lerka вне форума Ответить с цитированием
Старый 19.03.2009, 13:24   #9
lerka
Пользователь
 
Аватар для lerka
 
Регистрация: 19.03.2009
Сообщений: 14
По умолчанию

По длине не разрешали)
для каждого объекта сделать свой CallList и свою видовую матрицу (если нужно с ними по отдельности работать)
и вот процедура в которой вызыван
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
CreatOpenGL;
SettingsOpenGL;
MakeObject3Dmax('RES\cube1.shp',BOX1);
MakeObject3Dmax('RES\cube2.shp',BOX2);
end;

Последний раз редактировалось lerka; 19.03.2009 в 13:39.
lerka вне форума Ответить с цитированием
Старый 19.03.2009, 13:24   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вопрос еще такой: Какие версии МАКСа поддерживает код или shp не имеет зависимостей?
Цитата:
Сообщение от lerka Посмотреть сообщение
По длинне не разрешали)
А можно было просто приаттачить сам файл
I'm learning to live...

Последний раз редактировалось Stilet; 19.03.2009 в 13:26.
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где взять WinSock2? AngelOfDeath Компоненты Delphi 5 14.03.2009 16:18
Добавить инди в delphi 10 light, но как это зделать и где её взять не знаю 100GRamm Компоненты Delphi 1 09.02.2009 13:38
Где взять dll? Lady_olga БД в Delphi 4 11.06.2008 00:17
Где взять модуль для редактирования текста. Подойдёт как на этом форуме kkkggg PHP 1 21.09.2007 00:59