Obj чем открыть. Что такое расширение файла OBJ? Возможные проблемы с файлами в формате OBJ

Этот урок показывает способ загрузки моделей из файлов.obj
Формат obj - это текстовые файлы, содержащие очень мало данных о модели. Но благодаря своей
простоте эти файлы может импортировать/экспортировать практически любой соответствующий софт.

Код урока взят из урока "загрузка текстур".
Минус формата.obj - он не хранит информации о материалах, так что мне пришлось придумать другой способ.
Я бы не стал использовать этот формат для демки или игры, но полезно уметь с ним обращатся, так как
он очень прост и популярен. Вообще, надо было написать этот урок раньше загрузки 3sd...

В этом уроке мы будем использовать STL vector. Что это такое я подробно описал в уроке "загрузка.3ds".

Вот небольшое описание формата OBJ. Каждая программа, экспортирующая и импортирующая этот формат,
делает это по-своему. Некоторые сохраняют нормали, некоторые - имена обьектов, и так далее.

Данные вы читаете на основе первого символа в строке.

"v" - эта линия содержит вершину (x y z)

// пример: v -1 -1 0

Прочитав все такие линии, вы получите геометрию обьекта.

"vt" - текстурные координаты обьекта (U V)

// пример: vt .99998 .99936

"f" - эта линия содержит индексы вершин для массива полигонов.
Если есть UV координаты, она содержит также и их индексы.

// пример: (Только вершины): f 1 2 3

// пример: (Вершины и текстуры): f 1/1 2/2 3/3

Теперь напишем класс, загружающий.obj-файл.

Новый файл: obj.h :

#ifndef _OBJ_H
#define _OBJ_H

#include "main.h"

// Класс, загружающий файл формата OBJ
class CLoadObj {

public:

// Вы будете вызывать только эту функцию. Просто передаёте структуру
// модели для сохранения данных, и имя файла для загрузки.
bool ImportObj(t3DModel * pModel, char * strFileName) ;

// Главный загружающий цикл, вызывающийся из ImportObj()
void ReadObjFile(t3DModel * pModel) ;

// Вызывается в ReadObjFile() если линия начинается с "v"
void ReadVertexInfo() ;

// Вызывается в ReadObjFile() если линия начинается с "f"
void ReadFaceInfo() ;

// Вызывается после загрузки информации полигонов
void FillInObjectInfo(t3DModel * pModel) ;

// Вычисление нормалей. Это не обязятельно, но очень желательно.
void ComputeNormals(t3DModel * pModel) ;

// Так как.obj файлы не хранят имен текстур и информации о материалах, мы создадим
// функцию, устанавливающую их вручную. materialID - индекс для массива pMaterial нашей модели.
void SetObjectMaterial(t3DModel * pModel, int whichObject, int materialID) ;

// Чтобы проще присваивать материал к.obj обьекту, создадим для этого функцию.
// Передаём в неё модель, имя материала, имя файла текстуры и цвет RGB.
// Если нам нужен только цвет, передаём NULL для strFile.
void AddMaterial(t3DModel * pModel, char * strName, char * strFile,
int r = 255 , int g = 255 , int b = 255 ) ;

private:

// Указатель на файл
FILE * m_FilePointer;

// STL vector, содержащий список вершин
vector< CVector3> m_pVertices;

// STL vector, содержащий список полигонов
vector< tFace> m_pFaces;

// STL vector, содержащий список UV координат
vector< CVector2> m_pTextureCoords;

// Говорит нам, имеет ли обьект текстурные координаты
bool m_bObjectHasUV;

// Говорит нам, что мы только что прочитали данные полигонов, чтобы мы могли читать несколько обьектов
bool m_bJustReadAFace;
} ;

#endif

Файл obj.cpp :
#include "main.h"
#include "obj.h"


///// Функция загружает файл.obj в указанную переменную из указанного имени файла
///////////////////////////////// IMPORT OBJ \\\\\\\\\\\\\\\\*

Bool CLoadObj::ImportObj(t3DModel *pModel, char *strFileName)
{
char strMessage = {0}; // Будет использоваться для сообщения об ошибке

// Убедимся, что переданы не пустые модель и имя файла
if(!pModel || !strFileName) return false;

// Открываем указанный файл для чтения
m_FilePointer = fopen(strFileName, "r");

// Убедимся, что файл правильно открыт
if(!m_FilePointer) {
// Сформируем сообщение об ошибке
sprintf(strMessage, "Unable to find or open the file: %s", strFileName);
MessageBox(NULL, strMessage, "Error", MB_OK);
return false;
}

// Теперь, имея открытый файл, считываем информацию
ReadObjFile(pModel);

// Прочитав всю информацию, вычисляем вершинные нормали
ComputeNormals(pModel);

// Закрываем файл
fclose(m_FilePointer);

// И возвращаем true
return true;
}


///// Эта функция - главный цикл чтения файла.obj
///////////////////////////////// READ OBJ FILE \\\\\\\\\\\\\\\\*

Void CLoadObj::ReadObjFile(t3DModel *pModel)
{
char strLine = {0};
char ch = 0;

While(!feof(m_FilePointer))
{
float x = 0.0f, y = 0.0f, z = 0.0f;

// Читаем первый символ текущей строки файла
ch = fgetc(m_FilePointer);

Switch(ch)
{
case "v": // Проверяем, не "v" ли это (может быть вершина/нормаль/текст. коорд.)

// Если мы только что читали информацию о полигоне, а сейчас читаем вершину,
// значит мы перешли к следующему обьекту, и нужно сохранить данные предыдущего.
if(m_bJustReadAFace) {
// Сохраняем данные последнего обьекта в структуру модели
FillInObjectInfo(pModel);
}

// Расшифровываем всю текущую линию
ReadVertexInfo();
break;

Case "f": // Если первый символ -"f", эта строка описывает полигон

// Если прочитан символ новой строки - это пустая строка, ничего не делаем.
break;

Default:
// Если что-то неизвестное, просто читаем эту строку в "мусор", чтобы перейти
// к следующей - нам она не нужна.

break;
}
}

// Теперь сохраняем последний прочитанный обьект
FillInObjectInfo(pModel);
}


///// Эта функция читает информацию о вершинах ("v" вершина: "vt" UVCoord)
///////////////////////////////// READ VERTEX INFO \\\\\\\\\\\\\\\\*

Void CLoadObj::ReadVertexInfo()
{
CVector3 vNewVertex = {0};
CVector2 vNewTexCoord = {0};
char strLine = {0};
char ch = 0;

// Читаем второй сисвол строки, чтобы увидеть, что содержит строка: вершины/нормали/UV
ch = fgetc(m_FilePointer);

// Читаем остальную линию, чтобы перейти к следующей
fgets(strLine, 100, m_FilePointer);

// Добавляем новую вершину в список
m_pVertices.push_back(vNewVertex);
}
else if(ch == "t") // Если второй символ - "t", строка содержит UV координаты ("vt")
{
// Читаем текстурные координаты. Формат: "vt u v"
fscanf(m_FilePointer, "%f %f", &vNewTexCoord.x, &vNewTexCoord.y);

// Читаем оставшуюся линию, чтобы перейти к следующей
fgets(strLine, 100, m_FilePointer);

// Вносим новые текстурные координаты в список
m_pTextureCoords.push_back(vNewTexCoord);

// Активируем флаг, сообщающий, что обьект имеет текстурные координаты.
// Теперь мы знаем, что строки полигонов будут содержать индексы не только
// вершин, но и текст. координат ("f 1/1 2/2 3/3")
m_bObjectHasUV = true;
}
else // Иначе это, видимо, нормаль, и нам она не нужна ("vn")
{
// Мы рассчитываем собственные нормали, так что пропустим строку
fgets(strLine, 100, m_FilePointer);
}
}


///// Читает информацию полигона ("f")
///////////////////////////////// READ FACE INFO \\\\\\\\\\\\\\\\*

Void CLoadObj::ReadFaceInfo()
{
tFace newFace = {0};
char strLine = {0};

// Функция читает информацию о полигонах обьекта.
// Эта информация - 3д точки, составляющие полигон, и UV координаты,
// если на обьект наложена текстура.
// Если обьект имеет текстурные координаты, формат строки будет
// такой: "f v1/uv1 v2/uv2 v3/uv3"
// Иначе такой: "f v1 v2 v3"
// Внимание! Всегда убеждайтесь, что вычитаете 1 из индексов, так как
// массивы в c++ начинаются с 0, а индексы в.obj начинаются с 1.

// Проверяем, имеет ли обьект текстурные координаты
if(m_bObjectHasUV)
{
// Читаем индексы вершин и текстурных координат.
fscanf(m_FilePointer, "%d/%d %d/%d %d/%d", &newFace.vertIndex, &newFace.coordIndex,
&newFace.vertIndex, &newFace.coordIndex,
&newFace.vertIndex, &newFace.coordIndex);
}
else // если обьект НЕ содержит текстурных координат
{
// Читаем только индексы вершин
fscanf(m_FilePointer, "%d %d %d", &newFace.vertIndex,
&newFace.vertIndex,
&newFace.vertIndex);
}

// Читаем линию до конца, чтобы перейти к следующей
fgets(strLine, 100, m_FilePointer);

// Добавляем новый полигон в список
m_pFaces.push_back(newFace);

// Устанавливаем этот флаг в TRUE, чтобы знать, что только что читали полигон. Если
// после этого читается вершина - значит, мы перешли к следующему обьекту и нужно
// сохранить этот.
m_bJustReadAFace = true;

Разработан

Wavefront Technologies

Тип формата

OBJ - это формат файлов описания геометрии, разработанный в Wavefront Technologies для их анимационного пакета Advanced Visualizer. Формат файла является открытым и был принят другими разработчиками приложений графики и может быть экспортирован/импортирован в e-Frontier"s Poser, Maya , XSI, Blender , MeshLab, Misfit Model 3D, 3D Studio Max и Rhinoceros 3D , Hexagon, CATIA , Newtek Lightwave, Art of Illusion , Modo , Cinema 4D , Zanoza Modeller и т. д. По большей части это общепринятый формат.

Формат файлов OBJ - это простой формат данных, который содержит только 3D геометрию, а именно, позицию каждой вершины, связь координат текстуры с вершиной, нормаль для каждой вершины, а также параметры, которые создают полигоны.

Формат файла

Строки начинающиеся с решётки(#) это коментарии.

# Это коментарий

Obj файл содержит несколько типов определения:

# Список вершин, с координатами (x,y,z[,w]), w является не обязательным и по умолчанию 1.0. v 0.123 0.234 0.345 1.0 v ... ... # Текстурные координаты (u[,v][,w]), v и w является не обязательным и по умолчанию 0. vt 0.500 -1.352 vt ... ... # Нормали (x,y,z); нормалей может не быть unit. vn 0.707 0.000 0.707 vn ... ... # Параметры вершин в пространстве (u [,v] [,w]); свободная форма геометрического состояния (смотри ниже) vp 0.310000 3.210000 2.100000 vp ... ... # Определения поверхности(сторон) (смотри ниже) f 1 2 3 f 3/1 4/2 5/3 f 6/4/1 3/5/3 7/6/5 f ...

Определение сторон

Поверхность определяется в списке вершин, текстурных координат и нормалей. Полигоны такие как квадрат могут быть определены с помощью более 3 вершин/текстурных координат/нормалей.

Вершины

Строка начинающаяся с f представляет собой индекс Поверхности. Каждая сторона может состоять из трех или более вершин.

Смотреть что такое "Obj" в других словарях:

    Obj - (or .OBJ) is a geometry definition file format first developed by Wavefront Technologies for its Advanced Visualizer animation package. The file format is open and has been adopted by other 3D graphics application vendors and can be… … Wikipedia

    OBJ - or OBJ may refer to: Object file, an organized machine code file created by a compiler with .obj file extension Relocatable Object Module Format, an Object file for Intel microprocessors with .obj file extension Wavefront .obj file, a 3D geometry … Wikipedia

    Или Obj (сокр. англ. object, «объект») многозначное сокращение. Означает несколько форматов и расширений файлов, в том числе: .obj расширение объектных модулей у ряда компиляторов Wavefront OBJ формат файлов геометрии объекта, используется в … Википедия

OBJ - это формат файлов описания геометрии, разработанный в Wavefront Technologies для их анимационного пакета Advanced Visualizer. Формат файла является открытым и был принят другими разработчиками приложений графики и может быть экспортирован/импортирован в e-Frontier"s Poser, Maya , XSI, Blender , MeshLab, Misfit Model 3D, 3D Studio Max и Rhinoceros 3D , Hexagon, CATIA , Newtek Lightwave, Art of Illusion , milkshape 3d,Modo , Cinema 4D , Zanoza Modeller, ПК ЛИРА , Mineways и т. д. По большей части это общепринятый формат.

Формат файлов OBJ - это простой формат данных, который содержит только 3D геометрию, а именно, позицию каждой вершины, связь координат текстуры с вершиной, нормаль для каждой вершины, а также параметры, которые создают полигоны.

Формат файла

Строки, начинающиеся с решётки(#), - это комментарии.

# Это комментарий

Obj файл содержит несколько типов определения:

# Список вершин, с координатами (x,y,z[,w]), w является не обязательным и по умолчанию 1.0. v 0.123 0.234 0.345 1.0 v ... ... # Текстурные координаты (u,v[,w]), w является не обязательным и по умолчанию 0. # Текстурная координата по y может быть указана как 1 - v, и при этом по x = u vt 0.500 -1.352 vt ... ... # Нормали (x,y,z); нормали могут быть не нормированными . . vn 0.707 0.000 0.707 vn ... ... # Параметры вершин в пространстве (u [,v] [,w]); свободная форма геометрического состояния (смотри ниже) vp 0.310000 3.210000 2.100000 vp ... ... # Определения поверхности (сторон) (смотри ниже) f 1 2 3 f 3/1 4/2 5/3 f 6/4/1 3/5/3 7/6/5 f 6//1 3//3 7//5 f ... ... # Группа g Group1 ... # Объект o Object1

Определение сторон

Поверхность определяется в списке вершин, текстурных координат и нормалей. Полигоны такие как квадрат могут быть определены с помощью более 3 вершин/текстурных координат/нормалей.

Вершины

Строка начинающаяся с f представляет собой индекс Поверхности. Каждая поверхность (полигон) может состоять из трех или более вершин.

F v1 v2 v3 v4 ...

Индексация начинается с первого элемента, а не с нулевого как принято в некоторых языках программирования, так же индексация может быть отрицательной. Отрицательный индекс указывает позицию относительно последнего элемента (индекс -1 указывает на последний элемент).

Вершины / Текстурные координаты

Наряду с вершинами могут сохраняться соответствующие индексы текстурных координат.

F v1/vt1 v2/vt2 v3/vt3 v4/vt4 ...

Вершины / Текстурные координаты / Нормали

Также допустимо сохранение соответствующих индексов нормалей.

F v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 v4/vt4/vn4 ...

Вершины / / Нормали

При отсутствии данных о текстурных координатах допустима запись с пропуском индексов текстур.

F v1//vn1 v2//vn2 v3//vn3 v4//vn4 ...

Библиотека материалов

Краткий обзор

OBJ является одним из самых популярных форматов передачи 3-х мерной компьютерной геометрии. Информация о внешнем виде объектов(материалы) передается в файлах-спутниках в формате MTL (Material Library). OBJ при необходимости ссылается на такой файл с помощью директивы:

Mtllib [имя внешнего MTL файла]

Введение

MTL является стандартом, установленным компанией Wavefront Technologies. Вся информация представлена в ASCII виде и абсолютно читабельна для человека. Стандарт MTL так же очень популярен и поддерживается большинством пакетов для работы с 3D-графикой.

Информация о простых материалах в файле выглядит следующим образом:

Newmtl название_материала1 # Объявление очередного материала # Цвета Ka 1,000 1,000 0,000 # Цвет окружающего освещения (желтый) Kd 1,000 1,000 1,000 # Диффузный цвет (белый) # Параметры отражения Ks 0,000 0,000 0,000 # Цвет зеркального отражения (0;0;0 - выключен) Ns 10,000 # Коэффициент зеркального отражения (от 0 до 1000) # Параметры прозрачности d 0,9 # Прозрачность указывается с помощью директивы d Tr 0,9 # или в других реализациях формата с помощью Tr #Следующий материал newmtl название_материала2 ...

Наличие всех параметров необязательно. При отсутствии какого-либо параметра программа автоматически устанавливает его по умолчанию.

Самой частой причиной проблем с раскрытием файла OBJ является просто отсутствие соответствующих приложений, установленных на Вашем компьютере. В таком случае достаточно найти, скачать и установить приложение, обслуживающее файлы в формате OBJ - такие программы доступны ниже.

Поисковая система

Введите расширение файла

Помощь

Подсказка

Необходимо учесть, что некоторые закодированные данные из файлов, которые наш компьютер не читает, иногда можно просмотреть в Блокноте. Таким образом мы прочитаем фрагменты текста или числа - Стоит проверить, действует ли этот метод также в случае файлов OBJ.

Что сделать, если приложение со списка уже было установлено?

Часто установленное приложение должно автоматически связаться с файлом OBJ. Если это не произошло, то файл OBJ успешно можно связать вручную с ново установленным приложением. Достаточно нажать правой кнопкой мышки на файл OBJ, а затем среди доступных выбрать опцию "Выбрать программу по умолчанию". Затем необходимо выбрать опцию "Просмотреть" и отыскать избранное приложение. Введенные изменения необходимо утвердить с помощью опции "OK".

Программы, открывающие файл OBJ

Windows
Mac OS
Linux

Почему я не могу открыть файл OBJ?

Проблемы с файлами OBJ могут иметь также другую почву. Иногда даже установление на компьютере программного обеспечения, обслуживающего файлы OBJ не решит проблему. Причиной невозможности открытия, а также работы с файлом OBJ может быть также:

Несоответственные связи файла OBJ в записях реестра
- повреждение файла OBJ, который мы открываем
- инфицирование файла OBJ (вирусы)
- слишком маленький ресурс компьютера
- неактуальные драйверы
- устранение расширения OBJ из реестра системы Windows
- незавершенная установка программы, обслуживающей расширение OBJ

Устранение этих проблем должно привести к свободному открытию и работе с файлами OBJ. В случае, если компьютер по-прежнему имеет проблемы с файлами, необходимо воспользоваться помощью эксперта, который установит точную причину.

Мой компьютер не показывает расширений файлов, что сделать?

В стандартных установках системы Windows пользователь компьютера не видит расширения файлов OBJ. Это успешно можно изменить в настройках. Достаточно войти в "Панель управления" и выбрать "Вид и персонализация". Затем необходимо войти в "Опции папок", и открыть "Вид". В закладке "Вид" находится опция "Укрыть расширения известных типов файлов" - необходимо выбрать эту опцию и подтвердить операцию нажатием кнопки "OK". В этот момент расширения всех файлов, в том числе OBJ должны появится сортированные по названию файла.

Расширение OBJ может быть представлено тремя основными исполнениями:

  • Формат OBJ относится к типу файлов Wavefront 3D Object File и предназначен для обработки и хранения данных о трехмерной модели объекта. Являясь простым текстовым форматом представления данных, OBJ расширение может содержать весь набор параметрических данных, связанный с координатами вершин 3Д-объекта и положением его в пространстве, значением нормали к каждой из сторон, и любую другую информацию, которая имеет отношение к геометрическому представлению трехмерной модели.

Wavefront Technologies , являющийся официальным разработчиком OBJ расширения, предусмотрел хранение ссылки на файл внутри формата. В MTL содержится набор структурированных данных, который дает представление о внешней геометрической форме объекта. MTL файл хранится в отдельном каталоге “Textures ” и дополнительно может включать информацию о материале 3Д-модели.

OBJ - один из самых неприхотливых для импорта/экспорта форматов. Помимо стандартных систем автоматизированного проектирования (САПР) и многочисленных графических редакторов, визуализация трехмерной OBJ модели доступна и с использованием онлайн-ресурсов. В интернете собраны полномасштабные библиотеки 3Д-объектов в данном формате.

  • OBJ - объектно-ориентированный, модульный формат, предназначенный специально для программных приложений, функционирующих на базе микропроцессоре 80×86 Intel. Изначально, он назывался Object Module Format (объектно-модульный формат) и использовался на базе операционной системы MS-DOS. В таком виде OBJ расширение принято считать устаревшим.
  • Файл с расширением OBJ - результат генерации программного продукта Microsoft Visual Studio . В этом случае OBJ формат используется в качестве связующего звена между отдельными компилируемыми файлами. Таким образом, OBJ файл может принимать два типа: общий объектный файловый формат (Common Object File Format - COFF ); 32-ух битный модульный формат объекта (Object Module Format - OMF ).

Программы для открытия OBJ файлов

Если OBJ расширение представляет собой параметризованный набор данных о трехмерной модели объекта, для генерации и воспроизведения его на базе ОС Windows можно воспользоваться самыми разнообразными программными комплексами:

В данном представлении OBJ адаптирован и для платформы ОС Mac:

Примечательно, что расширение может быть открыто и на базе ОС Linux с применением программных плагинов Blender , Autodesk Maya , MeshLab или GLC_Player .

Если OBJ - объектно-ориентированный, модульный формат, его воспроизведение возможно исключительно в программных приложениях на платформе операционной системы MS-DOS, функционирующей на базе устаревшего микропроцессора 80×86 Intel.

OBJ файлы в Microsoft Visual Studio генерируются автоматически и используются в качестве вспомогательных для преобразования COFF и OMF . Какое-либо редактирование формата бывает востребовано крайне редко.

Если при открытии расширения OBJ возникает ошибка, причины могут заключаться в следующем:

  • поврежден или инфицирован файл;
  • файл не связан с реестром ОС (выбрано некорректное приложение для воспроизведения или не произведена инсталляция конкретного плагина);
  • недостаточно ресурсов устройства или ОС;
  • поврежденные или устаревшие драйвера.

Конвертация OBJ в другие форматы

Уникальная структура и область применения OBJ для случаев, когда формат представляет собой вспомогательный файл Microsoft Visual Studio или объектно-ориентированный, модульный файл для микропроцессора 80×86 Intel, не предоставляют возможностей для каких-либо конвертаций данного расширения.

Попытки конвертации расширения в другой формат могут не только не дать никаких практических результатов, но и повредить исходный файл. В этой связи трансляция данного формата практически не практикуется.

OBJ формат имеет три различных представления:

  • файл, содержащий параметризованный набор данных о трехмерной модели объекта;
  • объектно-ориентированный, модульный файл, адаптированный под устаревший микропроцессор 80×86 Intel;
  • вспомогательный файл, обеспечивающий корректную работу других форматов в программе Microsoft Visual Studio .

Расширение практически не востребовано в последних двух случаях.

Однако большую популярность формат приобрел у многочисленных компьютерных дизайнеров, конструкторов и проектировщиков трехмерных моделей изделий.

Без его наличия невозможна организованная запись геометрических параметров 3Д-объекта:

  • параметрических данных;
  • значения координат вершин 3Д-объекта;
  • положения 3D-модели в пространстве;
  • значения нормали к каждой из сторон 3Д-объекта;
  • текстуры координат.