Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
2 / 2 / 1
Регистрация: 12.05.2014
Сообщений: 53
1

Загрузка модели через ASSIMP

22.11.2019, 16:10. Показов 3214. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Загружаю obj модель с помощью библиотеки assimp
получается такая картинка
Название: Снимок.PNG
Просмотров: 98

Размер: 56.9 Кб

для проверки написал свой загрузчик формата obj
Название: Снимок2.PNG
Просмотров: 96

Размер: 36.4 Кб

В чем ошибка при загрузке модели через assimp?

процедура загрузки
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
type
//3 дробных числа
  T3f = record
    x, y, z: single;
  end;
//массив вершин
  TVertexArray = array of T3f;
 
procedure LoadObj(var VertexArray: TVertexArray; var NormalArray: TVertexArray; const fname: string);
var
  s: PaiScene = nil;
  i, j: integer;
  MaxCoord, Min_x, Min_y, Min_z, Max_x, Max_y, Max_z: single;
  delta_x, delta_y, delta_z: single;
begin
  s := aiImportFile(PChar(fname), aiProcess_Triangulate + aiProcess_GenNormals);
  for i := 0 to s^.mNumMeshes - 1 do
    for j := 0 to s^.mMeshes[i]^.mNumVertices - 1 do
    begin
      SetLength(VertexArray, Length(VertexArray) + 1);
      VertexArray[High(VertexArray)].x := s^.mMeshes[i]^.mVertices[j].x;
      VertexArray[High(VertexArray)].y := s^.mMeshes[i]^.mVertices[j].y;
      VertexArray[High(VertexArray)].z := s^.mMeshes[i]^.mVertices[j].z;
    end;
  for i := 0 to s^.mNumMeshes - 1 do
    for j := 0 to s^.mMeshes[i]^.mNumVertices - 1 do
      if s^.mMeshes[i]^.mNormals <> nil then
      begin
        SetLength(NormalArray, Length(NormalArray) + 1);
        NormalArray[High(NormalArray)].x := s^.mMeshes[i]^.mNormals[j].x;
        NormalArray[High(NormalArray)].y := s^.mMeshes[i]^.mNormals[j].y;
        NormalArray[High(NormalArray)].z := s^.mMeshes[i]^.mNormals[j].z;
      end;
  aiReleaseImport(s);
  //нормализация нормалей
  if (Length(NormalArray) > 0) then
  begin
    MaxCoord := NormalArray[0].x;
    for i := 0 to High(NormalArray) do
    begin
      MaxCoord := Max(MaxCoord, Abs(NormalArray[i].x));
      MaxCoord := Max(MaxCoord, Abs(NormalArray[i].y));
      MaxCoord := Max(MaxCoord, Abs(NormalArray[i].z));
    end;
    if MaxCoord <> 0 then
    begin
      for i := 0 to High(NormalArray) do
      begin
        NormalArray[i].x := NormalArray[i].x / MaxCoord;
        NormalArray[i].y := NormalArray[i].y / MaxCoord;
        NormalArray[i].z := NormalArray[i].z / MaxCoord;
      end;
    end;
  end;
  //сдвиг центра модели в центр системы координат
  if (Length(VertexArray) > 0) then
  begin
    Min_x := VertexArray[0].x;
    Min_y := VertexArray[0].y;
    Min_z := VertexArray[0].z;
    Max_x := VertexArray[0].x;
    Max_y := VertexArray[0].y;
    Max_z := VertexArray[0].z;
    for i := 0 to High(VertexArray) do
    begin
      Min_x := Min(Min_x, VertexArray[i].x);
      Min_y := Min(Min_y, VertexArray[i].y);
      Min_z := Min(Min_z, VertexArray[i].z);
      Max_x := Max(Max_x, VertexArray[i].x);
      Max_y := Max(Max_y, VertexArray[i].y);
      Max_z := Max(Max_z, VertexArray[i].z);
    end;
    delta_x := (Min_x + Max_x) / 2;
    delta_y := (Min_y + Max_y) / 2;
    delta_z := (Min_z + Max_z) / 2;
    for i := 0 to High(VertexArray) do
    begin
      VertexArray[i].x := VertexArray[i].x - delta_x;
      VertexArray[i].y := VertexArray[i].y - delta_y;
      VertexArray[i].z := VertexArray[i].z - delta_z;
    end;
    Min_x := Min_x - delta_x;
    Min_y := Min_y - delta_y;
    Min_z := Min_z - delta_z;
    Max_x := Max_x - delta_x;
    Max_y := Max_y - delta_y;
    Max_z := Max_z - delta_z;
  end;
  //нормализация вершин
  if (Length(VertexArray) > 0) then
  begin
    MaxCoord := Abs(Min_x);
    MaxCoord := Max(MaxCoord, Abs(Min_y));
    MaxCoord := Max(MaxCoord, Abs(Min_z));
    MaxCoord := Max(MaxCoord, Abs(Max_x));
    MaxCoord := Max(MaxCoord, Abs(Max_y));
    MaxCoord := Max(MaxCoord, Abs(Max_z));
    if MaxCoord = 0 then
      MaxCoord := 1
    else
      for i := 0 to High(VertexArray) do
      begin
        VertexArray[i].x := VertexArray[i].x / MaxCoord;
        VertexArray[i].y := VertexArray[i].y / MaxCoord;
        VertexArray[i].z := VertexArray[i].z / MaxCoord;
      end;
  end;
 
end;
архив с проектом и файлом модели
assimp.zip
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2019, 16:10
Ответы с готовыми решениями:

Assimp некорректно загружает модели?
Всем привет! Извиняюсь, если выбрал не ту тему. Сделал загрузку моделей по этому туториалу. Все...

Как загружать модели с Assimp?
Ну скачал я библиотечку, а что потом? Как ее присоединить к моему Visual Studio? Как сам процесс...

Загрузка 3д модели C++
Здравствуйте! Делаю мини игру. Возникла необходимость загружать 3д модели. Использую C++. Какую...

Загрузка 3D модели OpenGL
Привет, форумчане. Пытаюсь загрузить 3D модель, но не выходит. Сделал также как и на уроке...

22
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
22.11.2019, 19:22 2
Я пробовал летом AssimpNET из C#. Насколько я помню нужно либо траингулировать модель в 3D редакторе. Например, в Blender'е 2.81 можно поставить галочку "Triangulate Faces" (в разделе "Geometry" в окне экспорта). Второй вариант - это в настройках Assimp выставить траингуляцию. Возможно, в этом причина, а может нет.
1
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
22.11.2019, 19:37 3
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Например, в Blender'е 2.81 можно поставить галочку "Triangulate Faces"
посмотрел его модель и увидел что это так, хотя там 50 на 50 тоисть в моделе есть и треугольники и полигоны
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
22.11.2019, 20:11 4
Цитата Сообщение от Antikl Посмотреть сообщение
посмотрел его модель и увидел что это так, хотя там 50 на 50 тоисть в моделе есть и треугольники и полигоны
Я перед тем как ответить выше специально открыл его модель в Blender'е и увидел, что Face'ы представляют из себя прямоугольники, а не треугольники:
Изображения
 
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
22.11.2019, 20:27 5
Цитата Сообщение от Antikl Посмотреть сообщение
хотя там 50 на 50 тоисть в моделе есть и треугольники и полигоны
Не знаю, как вы так оценили, что треугольников и прямоугольников 50 на 50. Я крутил модель со всех сторон и не нашёл ни одного треугольника, вижу, что все face'ы - прямоугольники. Кстати, раньше в Blender была возможность выделить фейсы с определённым числом вертексов "In edit mode, select > by number of sides. Set parameters to “greater than 4”". А сейчас я этой возможности не нашёл. Её убрали и перенесли в другое место? Или я невнимательно искал?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
22.11.2019, 20:38 6
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я крутил модель со всех сторон и не нашёл ни одного треугольника, вижу, что все face'ы - прямоугольники.
не ошибся там меньше треугольников, там все ок
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
22.11.2019, 21:18 7
Цитата Сообщение от Antikl Посмотреть сообщение
не ошибся там меньше треугольников, там все ок
То есть у вас получается по примерной оценке, что количество прямоугольных фейсов равно количеству треугольных фейсов? Вы не ошиблись и их точно 50% на 50%? Я опять открыл модель и внимательно покрутил её и не нашёл ни одного треугольника. Вы не могли бы в "Edit Mode" выделить хотя бы один треугольный фейс и показать на скриншоте, где он находится?

По моей примерной оценке соотношение такое:
  • 100% - прямоугольных фейсов
  • 0% - треугольных фейсов
0
2 / 2 / 1
Регистрация: 12.05.2014
Сообщений: 53
22.11.2019, 21:39  [ТС] 8
Разве флаг "aiProcess_Triangulate" принудительно не разбивает все полигоны на треугольники при импорте модели?
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
22.11.2019, 22:23 9
Цитата Сообщение от GlProggo Посмотреть сообщение
Разве флаг "aiProcess_Triangulate" принудительно не разбивает все полигоны на треугольники при импорте модели?
Да, это то что я имел ввиду, когда написал про настройку. Я в коде его не заметил. Попробуйте убрать его, а модель траингулируйте при экспорте, либо в Blender'е выберите всей фейсы и нажмите "Ctrl+T". Попробуйте для интереса, но скорее всего, не в этом проблема.

Добавлено через 4 минуты
Я попробовал AssimpNET, но мне больше понравился вариант с экспортом в файл формата .dae (Collada), потому что во всех современных языках есть парсинг XML и это упрощает парсинг, а .dae -это XML. А ещё .dae умеет хранить анимации в отличае от .obj. Я сейчас изучаю импорт скелетной анимации и работу со скелетной анимацией. Просто крутить статические модели совсем не интересно. Интересно создавать анимации, разбор механизмов, работу механизмов, а это можно сделать на скелетной анимации.

Добавлено через 1 минуту
Assimp не на всех языках реализован. На некоторых он реализован, но заброшен и не доделан, как например, на JavaScript/WebGL. Я пишу парсер на TypeScript/WebGL из .dae (Collada). Это даёт больше контроля и возможность быстро переписать свой парсер на любой язык.
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
22.11.2019, 22:46 10
Никто не экспортирует на тесте сразу итоговую модель из 100500 вершин.
Создают пару треугольников в 3д редакторе ручками и смотрят во что превращает экспортер.

В порядке сложности отладка:
1) Пытаются отладить первым делом играя с настройками 3д редактора т.к. они наиболее доступны. ИМХО это очевидно.
2) Лезут в справку \ гугл играть с опциями импортера.
3)Самый адовый…пишут свой экспортер, фактически это бред т.к. 2019 год и форматов есть 100500, редакторов тьма, спец прог экспорта\импорта…еще в древнем халфе были 3д модели с анимациями.
0
2 / 2 / 1
Регистрация: 12.05.2014
Сообщений: 53
23.11.2019, 00:55  [ТС] 11
Excalibur921, где в моем вопросе шла речь про экспорт?

Добавлено через 5 минут
8Observer8, если в 3д редакторе принудительно разбить все полигоны на треугольники, то assimp импортирует нормально.
Получается, что assimp не умеет триангулировать или делает это неверно. Возможно, я неверно выставляю ключи импорта (пробовал разные комбинации - результат не меняется). Единственное найденное мной решение - перед импортом разбивать все полигоны на треугольники, результат разбивки записывать в файл и этот файл импортировать assimp'ом. Но хотелось бы импорт делать через assimp без предобработки.
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
23.11.2019, 01:55 12
Цитата Сообщение от GlProggo Посмотреть сообщение
Получается, что assimp не умеет триангулировать или делает это неверно.
Я вспомнил. У меня тоже в AssimpNET этот ключ не работал и результат получался такой же. Поэтому я и обратил на это внимание. Может я неправильно комбинировал ключи. Не похоже, чтобы это был такой большой баг. Я не разобрался, почему не работало. Не хотел тратить время. Мне проще сделать траингуляцию во время экспорта.
Цитата Сообщение от GlProggo Посмотреть сообщение
Единственное найденное мной решение - перед импортом разбивать все полигоны на треугольники, результат разбивки записывать в файл и этот файл импортировать assimp'ом. Но хотелось бы импорт делать через assimp без предобработки.
Кстати, в Blender'е если экспортировать в файл .dae (Collada), то галочка "Triangulate" установлена поумолчанию. Assimp умеет загружать .dae Да и, в принципе, ничего плохого нет если ставить галочку при экспорте в .obj. А если найдёте, как заставить Assimp траингулировать, то ещё лучше.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
23.11.2019, 09:11 13
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я опять открыл модель и внимательно покрутил её и не нашёл ни одного треугольника
я писал что ошибся так как одной программой проверял вообщем она не правильно показала, неважно какой,
Миниатюры
Загрузка модели через ASSIMP  
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
23.11.2019, 10:59 14
Цитата Сообщение от Antikl Посмотреть сообщение
я писал что ошибся
Вы написали:
Цитата Сообщение от Antikl Посмотреть сообщение
не ошибся там меньше треугольников, там все ок
"не ошибся" и меня смутило "меньше треугольников", потому что я не видел ни одного треугольника. нашёл, как можно выделить фейсы с определённым числом вертексов. В "Edit Mode" > "Select" > "Select All by Trait" > "Face by Side" > выбрать количество вершин. Треугольников гораздо меньше, чем прямоугольников. Они оказывается на внутренних поверхностях зубов:

Название: Select Faces by Sides.png
Просмотров: 93

Размер: 6.6 Кб

Загрузка модели через ASSIMP
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
23.11.2019, 11:08 15
Цитата Сообщение от 8Observer8 Посмотреть сообщение
"не ошибся" и меня смутило "меньше треугольников", потому что я не видел ни одного треугольника. нашёл, как можно выделить фейсы с определённым числом вертексов. В "Edit Mode" > "Select" > "Select All by Trait" > "Face by Side" > выбрать количество вершин. Треугольников гораздо меньше, чем прямоугольников. Они оказывается на внутренних поверхностях зубов:
Надо было написать: я ошибся, их намногО меньше, почему? потому что пользовался другой программой с неверной настройкой, я понятно объяснил? Так же я скинул картинку с зубом и выделенным треугольником.
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
23.11.2019, 11:17 16
Цитата Сообщение от Antikl Посмотреть сообщение
Надо было написать: я ошибся
Я не мог догадаться, что вы ошиблись, когда писали, что ошиблись. Главное, что я нашёл, как выделять фейсы с указанным числом вершин.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
23.11.2019, 11:55 17
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я вспомнил. У меня тоже в AssimpNET этот ключ не работал и результат получался такой же. Поэтому я и обратил на это внимание. Может я неправильно комбинировал ключи. Не похоже, чтобы это был такой большой баг. Я не разобрался, почему не работало. Не хотел тратить время. Мне проще сделать траингуляцию во время экспорта.
в с++ работает этот ключ отлично вот результат на картинках
Миниатюры
Загрузка модели через ASSIMP  
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
23.11.2019, 12:35 18
Цитата Сообщение от Antikl Посмотреть сообщение
в с++ работает этот ключ отлично вот результат на картинках
Скорее всего, этот ключ только в C++ работает, а может ещё в Java работает. В реализации на C# этот ключ не работает. В реализации на Pascal тоже не работает. Я хотел попробовать реализацию Assimp на JavaScript, но проект давно заброшен: https://github.com/assimp/assimp-web У него всего 4 звезды. Тем более что на TypeScript не @types для Assimp, а у меня приоритет на TypeScript и WebGL.
0
2 / 2 / 1
Регистрация: 12.05.2014
Сообщений: 53
24.11.2019, 04:11  [ТС] 19
Не знаю, почему не получилось заставить работать флаг триангуляции assimp при импорте модели (даже в свежесобранной с гитхаба версии 4.1.0).
Тогда произведем триангуляцию сами после импорта (естественно, нижеприведенный метод триангуляции работает только с выпуклыми полигонами))))

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
procedure LoadObj(var VertexArray: TVertexArray; var NormalArray: TVertexArray; const fname: string);
 
  procedure AddVertexAndNormal(const s: PaiScene; const i, j, k: longword);
  begin
    SetLength(VertexArray, Length(VertexArray) + 1);
    with s^.mMeshes[i]^.mVertices[s^.mMeshes[i]^.mFaces[j].mIndices[k]] do
    begin
      VertexArray[High(VertexArray)].x := x;
      VertexArray[High(VertexArray)].y := y;
      VertexArray[High(VertexArray)].z := z;
    end;
    if s^.mMeshes[i]^.mNormals <> nil then
    begin
      SetLength(NormalArray, Length(NormalArray) + 1);
      with s^.mMeshes[i]^.mNormals[s^.mMeshes[i]^.mFaces[j].mIndices[k]] do
      begin
        NormalArray[High(NormalArray)].x := x;
        NormalArray[High(NormalArray)].y := y;
        NormalArray[High(NormalArray)].z := z;
      end;
    end;
  end;
 
 var
  s: PaiScene = nil;
  i, j, k: longword;
begin
  s := aiImportFile(PChar(fname), 0);
  if s = nil then
    exit;
  for i := 0 to s^.mNumMeshes - 1 do
    for j := 0 to s^.mMeshes[i]^.mNumFaces - 1 do
      for k := 0 to s^.mMeshes[i]^.mFaces[j].mNumIndices - 3 do
      begin
        AddVertexAndNormal(s, i, j, k);
        AddVertexAndNormal(s, i, j, k + 1);
        AddVertexAndNormal(s, i, j, s^.mMeshes[i]^.mFaces[j].mNumIndices - 1);
      end;
  aiReleaseImport(s);
end;
Добавлено через 2 минуты
Antikl, скиньте, пожалуйста, dll вашей библиотеки, в которой работает флаг триангуляции
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
24.11.2019, 05:37 20
тока это к версии 4.0.1
Вложения
Тип файла: rar libassimp.rar (2.52 Мб, 22 просмотров)
0
24.11.2019, 05:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2019, 05:37
Помогаю со студенческими работами здесь

Загрузка модели из файла
Подскажите у opengl в отличи от директа нет своего формата и функции загрузки из файла нада будет...

Загрузка ASE модели
Здравствуйте, Не могу разобраться с форматом ASE, а именно что значат некоторые параметры, Если...

Загрузка модели в формате STEP
Приветствую, есть ли готовые решения для загрузки модели в данном формате, шпасиба.

Загрузка obj модели в OpenGl
Есть .obj файл типа: v 1.25022 0 -0.0571689 vt -49.2212 2.25074 vn 0 -1 -0 v 0.108959 0...

загрузка 3D модели в OpenGL (с++), помогите незнающему
вот столкнулся с проблемой..... надо бы узнать как подгружаются модели в OpenGL всё равно какой...

Проблема с загрузка модели из файла DirectX 11
Добрый день, уважаемые форумчане! В ходе выполнения лабораторной работы по DirectX 11 столкнулась с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru