【问题标题】:C++ - Read 3D ModelC++ - 读取 3D 模型
【发布时间】:2011-12-05 00:57:38
【问题描述】:

我有一个文件,它定义了 3D 模型的顶点、法线和连接信息。

示例:

v -2.491060 -2.491060 0.000000
v 2.491060 -2.491060 0.000000
v -2.491060 2.491060 0.000000
v 2.491060 2.491060 0.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000
f 1/1 2/2 3/3
f 3/3 2/2 4/1

地点:

v          vertex coordinate (x, y, z position)
vt        texture coordinate (u, v coordinate)
f          polygon connectivity information with vertex and texture indices

读取和存储这些信息的最佳方式是什么?具有每个顶点和连接信息的内部数组的自定义类/结构?我想我曾经用 C++ 以分隔方式读取数据,但它是相同的数据类型,所以我将它放入一个多维数组中。我应该只使用stringstreams 和自定义结构/类吗?

编辑披露,这是针对我的 3D 图形课程的,但我只是在这里寻求建议,而不是完整编写的项目等。

【问题讨论】:

  • ¤ 使用来自<string>std::getline 一次读取一行。然后使用您喜欢的任何内容来解析每一行。 std::istringstream 很简单,但可能效率低下。您在编写时将需要一些“自定义类”,例如作为基本元素类型。但尽可能少地从头开始发明。而是利用标准库的容器,例如 vectormap 和 C++11 array 等等。目标是在任何地方都没有明确的new。干杯&hth.,

标签: c++ file parsing object delimiter


【解决方案1】:

首先有一个事实,您必须将它们存储在动态数组中。据我所知,wavefront 不包含有关 3D-Obj 文件中有多少个顶点的任何信息。顶点法线、纹理坐标和面也一样。

所以我倾向于将它们(顶点、法线等)读入结构并在定义三角形后删除它们。字符串流和自定义结构对我来说听起来不错,因此您可以使用正则表达式来读取必要的顶点/面数据。

我是 java 程序员(不太长),如果我错了,请见谅:/

这可能是我项目中 .obj 加载器的一个有点复杂的版本:https://github.com/Chrise55/Llama3D/blob/master/src/llama/zoo1/llgeometry/LLLoadGeometry.java 它是java,但也许它可以帮助你? :/

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多