Маппер
Участник
Пользователь
- Сообщения
- 156
- Реакции
- 205
- Помог
- 5 раз(а)
Привет, форумчане!
Работаю над структурой BSP файла и встретил одну сложность в определении полигона/стороны/face.
Я смог извлечь каждый из лампов(lump/кусок) бсп файла. Теперь хочу перевести имеющиеся полигоны в другую систему координат, для этого нужно создать треугольники на основании нормального вектора(перпендикулярного вектора к плоскости) и точек, формирующих треугольник. С вектором проблем нет, он задан в плоскости, к которой привязан полигон, но проблема с вершинами.
В бсп есть часть, зарезервированная под точки, но она не имеет привязок к конкретному полигону, так как представляет собой просто точку в пространстве:
Полигон в свою очередь имеет отсылку к плоскости, на которой находится, и к ребрам (surfedge), его формирующим, но ребра представлены только нумерацией:
Вопрос такой: как на основании имеющейся информации получить вершины для каждого полигона? Буду рад, если кто-то объяснит мне принцип работы.
Ниже ссылка на полную неофициальную документацию.
Структура
Работаю над структурой BSP файла и встретил одну сложность в определении полигона/стороны/face.
Я смог извлечь каждый из лампов(lump/кусок) бсп файла. Теперь хочу перевести имеющиеся полигоны в другую систему координат, для этого нужно создать треугольники на основании нормального вектора(перпендикулярного вектора к плоскости) и точек, формирующих треугольник. С вектором проблем нет, он задан в плоскости, к которой привязан полигон, но проблема с вершинами.
В бсп есть часть, зарезервированная под точки, но она не имеет привязок к конкретному полигону, так как представляет собой просто точку в пространстве:
typedef struct _VECTOR3D
{
float x, y, z;
} VECTOR3D;
typedef VECTOR3D BSPVERTEX;
{
float x, y, z;
} VECTOR3D;
typedef VECTOR3D BSPVERTEX;
Полигон в свою очередь имеет отсылку к плоскости, на которой находится, и к ребрам (surfedge), его формирующим, но ребра представлены только нумерацией:
typedef int32_t BSPSURFEDGE;
typedef struct _BSPFACE
{
uint16_t iPlane; // Plane the face is parallel to
uint16_t nPlaneSide; // Set if different normals orientation
uint32_t iFirstEdge; // Index of the first surfedge
uint16_t nEdges; // Number of consecutive surfedges
uint16_t iTextureInfo; // Index of the texture info structure
uint8_t nStyles[4]; // Specify lighting styles
uint32_t nLightmapOffset; // Offsets into the raw lightmap data
} BSPFACE;
typedef struct _BSPFACE
{
uint16_t iPlane; // Plane the face is parallel to
uint16_t nPlaneSide; // Set if different normals orientation
uint32_t iFirstEdge; // Index of the first surfedge
uint16_t nEdges; // Number of consecutive surfedges
uint16_t iTextureInfo; // Index of the texture info structure
uint8_t nStyles[4]; // Specify lighting styles
uint32_t nLightmapOffset; // Offsets into the raw lightmap data
} BSPFACE;
Вопрос такой: как на основании имеющейся информации получить вершины для каждого полигона? Буду рад, если кто-то объяснит мне принцип работы.
Ниже ссылка на полную неофициальную документацию.
Структура