Я пытаюсь реализовать ray caster, и я начинаю с простых файлов .obj (utah-teapot), и в настоящее время я делаю только классы для Сфер и Треугольников, у меня в основном есть все функции для пересечений, генерирующиепросмотр лучей и т. д. все готово, но я просто не могу разобрать файл .obj в треугольники (по три вектора в каждом), поэтому я могу иметь возможность приведения лучей в пользовательских файлах .obj, а не просто в сферах.
Это мой текущий анализатор файлов .obj (здесь не указан полный рабочий код)
char lineHeader[512];
// read the first word of the line
int res = fscanf(file, "%s", lineHeader);
if (res == EOF)
break; // EOF
// else : parse lineHeader
if (strcmp(lineHeader, "v") == 0) {
glm::vec3 vertex;
fscanf(file, "%f %f %f\n", &vertex.x, &vertex.y, &vertex.z);
vertex.x *= scale;
vertex.y *= scale;
vertex.z *= scale;
temp_vertices.push_back(vertex);
}
else if (strcmp(lineHeader, "vt") == 0) {
glm::vec2 uv;
fscanf(file, "%f %f\n", &uv.x, &uv.y);
uv.y = -uv.y; // Invert V coordinate since we will only use DDS texture, which are inverted. Remove if you want to use TGA or BMP loaders.
temp_uvs.push_back(uv);
}
else if (strcmp(lineHeader, "vn") == 0) {
glm::vec3 normal;
fscanf(file, "%f %f %f\n", &normal.x, &normal.y, &normal.z);
temp_normals.push_back(normal);
}
else if (strcmp(lineHeader, "f") == 0) {
std::string vertex1, vertex2, vertex3;
unsigned int vertexIndex[3] = { 0 }, uvIndex[3] = { 0 }, normalIndex[3] = { 0 };
char stupidBuffer[1024];
fgets(stupidBuffer, 1024, file);
int matches = sscanf(stupidBuffer, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIndex[0], &uvIndex[0], &normalIndex[0], &vertexIndex[1], &uvIndex[1], &normalIndex[1], &vertexIndex[2], &uvIndex[2], &normalIndex[2]);
if (matches != 9) {
vertexIndex[3] = { 0 }, uvIndex[3] = { 0 }, normalIndex[3] = { 0 };
matches = sscanf(stupidBuffer, "%d//%d %d//%d %d//%d\n", &vertexIndex[0], &normalIndex[0], &vertexIndex[1], &normalIndex[1], &vertexIndex[2], &normalIndex[2]);
if (matches != 6) {
vertexIndex[3] = { 0 }, uvIndex[3] = { 0 }, normalIndex[3] = { 0 };
matches = sscanf(stupidBuffer, "%d %d %d\n", &vertexIndex[0], &vertexIndex[1], &vertexIndex[2]);
if (matches != 3) {
printf("File can't be read \n");
fclose(file);
return false;
}
}
}
}
Это мой класс треугольника
class Triangle {
public:
Vector p0, p1, p2;
Vector color;
Vector normal(void);
};
Я могу 't понять, как разбить информацию из файла .obj на треугольники, состоящие из трех трехмерных векторов (точек).Мне не нужен код, мне просто нужно понять, как (если возможно?) Разобрать всю эту информацию в треугольники.Любые другие идеи приветствуются.Я хочу сделать простую головоломку в долгосрочной перспективе, но я просто делаю шаг за шагом.