Skip to content

Latest commit

 

History

History
60 lines (48 loc) · 3.82 KB

README.md

File metadata and controls

60 lines (48 loc) · 3.82 KB

Домашно 1 (почти OBJ)

Тримерен модел ще наричаме съвкупност от точки в тримерното пространство и съвкупност от многоъгълници с върхове измежду дадените върхове.

Често използван формат за съхраняване на такива обекти във файл е Wavefront (.obj). Файл от този тип е текстов и се състои три типа редове:

  • v <x> <y> <z> - описва връх в модела. <x>, <y> и <z> са рационални числа, записани в текстов вид (10.001, 123.045, 2, -5.000).
  • f <v1> <v2> … <vn> - описва многоъгълник от повърхността на модела. <v1>, <v2>, …, <vn> са индексите на върховете, които участват в многоъгълника (цели положителни числа).
  • # … - коментар; Всеки ред, започващ с # се игнорира при четене от файл.

Такива файлове може да визуализирате чрез приложението 3D Viewer в Windows 10. Друга добра опция е f3d.

Пример:

Горепоказания модел на куб, записан във файл, изглежда така:

v -1 -1 -1
v 1 -1 -1
v 1 -1 1
v -1 -1 1
v -1 1 -1
v 1 1 -1
v 1 1 1
v -1 1 1
f 1 2 3 4
f 8 7 6 5
f 1 5 6 2
f 2 6 7 3
f 3 7 8 4
f 4 8 5 1

Задание

  1. Реализирайте клас Object3d, който представя тримерен модел в езика C++.
  2. Реализирайте конструктор, който приема име на файл и зарежда модел от него.
  3. Реализирайте конструктор, който приема поток за вход и зарежда модел от него.
  4. Реализирайте методи int getVertexCount() и int getFaceCount(), които връщат съответно броя върхове и броя многоъгълници в модел.
  5. Реализирайте метод void save(const std::string& file), който приема име на файл и съхранява модела във файла.
  6. Реализирайте метод void print(std::ostream&), който приема изходен поток, в който да се запишат данните на обекта в указания формат.
  7. Реализирайте метод Object3d cut(std::function<bool(float x, float y, float z)> f), който връща модел съставен само от тези многоъгълници в модела, чиито върхове отговарят на предиката f.
  8. Реализирайте метод void flip(), който обръща всички многоъгълници в модела наобратно. (Четириъгълникът 1 2 3 4 става 4 3 2 1)
  9. Реализирайте статични методи за създаване на куб и сфера с параметри съответно дължина на ръб и радиус. (Не е задължително сферата да изглежда точно като на картинката по-горе)
  10. При опит за прочитане на невалиден файл изведете подходящи съобщения.

Ресурси

Файловете от по-горе:

Пример

Object3d b("./bunny.obj");
Object3d b_cut = b.cut([](float x, float y, float z) -> bool {
    return y - x < 2.5;
});
b_cut.save("./bunny_cut.obj");