【问题标题】:Various array operations各种数组操作
【发布时间】:2014-01-23 02:35:14
【问题描述】:

我正在创建一个类,其中一个值是它所组成的所有顶点(它是一个 3d 程序)。我也想要一个默认的顶点数组(因为要输入的顶点很大),我想要这样做的方法是定义顶点数组:

    Entity::vertices[] = {
        { -0.5f, 0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } },
        { 0.5f, 0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } },
        { 0.5f, -0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } },
        { 0.5f, -0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } },
        { -0.5f, -0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } },
        { -0.5f, 0.5f, 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f } }
    };

然后在类的构造函数中检查是否输入了自定义顶点,如果输入了,则将顶点数组作为输入数组。

有复制数组功能吗?
如果没有怎么清除数组(会清除现有的默认顶点,因为如果输入的顶点小于默认我会有额外的顶点,这对渲染不利)

【问题讨论】:

  • std::vector 有问题吗?
  • @uberwulu 它不保存颜色数据(除非它保存?),这在渲染某些东西时很重要。
  • std::vectors 是模板化的。它们可以保存您创建的任何顶点结构,无论您的顶点是否包含颜色数据。它还有一个 clear() 函数。
  • 一个 std::vector 可以保存你想给它的任何类型的数据,但如果你有固定数量的数据,一个 std::array 可能就是你要找的。如果您真的必须自制数组,最好编写自己的副本和清除函数并将其全部封装在一个类中。但是你真的应该研究一下 STL 和 std 算法。

标签: c++ arrays vertices


【解决方案1】:

我不能 100% 确定您要在数组中存储哪些数据,但这里有一个简化示例,说明了我如何在我制作的游戏中存储顶点数据。

struct Vertex
{
    vec3 pos;
    vec3 nrm;
    vec2 uvs;  // Can replace this with D3DCOLOR for example if you want colors instead of texture samples.
};

要将它们存储在 std::vector 中,请创建向量:

std::vector<Vertex> myVerts;

向向量添加顶点:

Vertex vert;
myVerts.push_back(vert);

清除向量:

myVerts.clear();

从顶点对象数组复制到向量(将向量分配给数组):

// assuming: Vertex otherVerts[] = { ... };
myVerts.assign(otherVerts,otherVerts+otherSize);

如果您只想将新顶点数组添加到现有向量:

// assuming: Vertex otherVerts[] = { ... };
myVerts.insert(myVerts.end(),otherVerts,otherVerts+size);

从另一个顶点向量复制到这个向量中(将这个分配给另一个):

// assuming: std::vector<Vertex> otherVerts(...);
myVerts = otherVerts;

要向这个向量添加另一个顶点向量:

// assuming: std::vector<Vertex> otherVerts(...);
myVerts.insert(myVerts.end(),otherVerts.begin(),otherVerts.end());

如果您绝对坚持使用自己的数组而不是 STL 中可用的数组,那么您最终需要在自己的动态数组类中模仿这些相同的函数。如果您的数组不需要是动态的(它是在编译时已知的固定大小),那么您不一定需要在类中封装功能(尽管可以使用 std::array 来完成),但是使用带有自定义构造函数的自定义 Vertex 结构仍然比将每个元素手写为长且难以阅读的一系列浮点数更容易。

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2011-02-11
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2010-12-26
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多