长话短说明我有一个三维对象数组,每个对象都有指向数组中相邻对象的指针,并且由于某种原因,在初始化之后,这些指针向量在下次请求数据时为空。
我尝试在细分的多维数据集中表示顶点。每个节点都是这样表示的类:
#include <glm/glm.hpp>
class Vertex {
public:
glm::vec3 position;
vector<Vertex*> DiagNeighbours;
vector<Vertex*> DirectNeighbours;
vector<Vertex*> ExtNeighbours;
Vertex(float x, float y, float z) : position(glm::vec3(x, y, z)) { }
};
为了节省内存成本,我将指针存储到所有邻居。它的诊断邻居,它的直接邻居,以及它的扩展邻居(两个节点之间的直接邻居)。
我有另一个代表我建立的场景的类。它存储所有立方体顶点,初始化它们,并最终操纵它们的数据。它设置为这样(它有点长且重复,所以在第二次整个数组遍历后可以跳过它):
#include "Vertex.h"
class Scene {
Vertex vertices[8][8][8];
public:
Scene() {
for (int z = 0; z < 8; z++) {
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
vertices[z][y][x] = Vertex(glm::vec3(x, y, z)*cubeScale);
}
}
}
for (int z = 0; z < 8; z++) {
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
if(x != 7)
vertices[z][y][x].DirectNeighbours.push_back(&vertices[z][y][x + 1]);
if(x != 0)
vertices[z][y][x].DirectNeighbours.push_back(&vertices[z][y][x - 1]);
if(y != 7)
vertices[z][y][x].DirectNeighbours.push_back(&vertices[z][y + 1][x]);
if(y != 0)
vertices[z][y][x].DirectNeighbours.push_back(&vertices[z][y - 1][x]);
if(z != 7)
vertices[z][y][x].DirectNeighbours.push_back(&vertices[z + 1][y][x]);
if(z != 0)
vertices[z][y][x].DirectNeighbours.push_back(&vertices[z - 1][y][x]);
}
}
}
for (int z = 0; z < 8; z++) {
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
if (y != 7) {
if(x != 7)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z][y + 1][x + 1]);
if(x != 0)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z][y + 1][x - 1]);
}
if (y != 0) {
if (x != 7)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z][y - 1][x + 1]);
if (x != 0)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z][y - 1][x - 1]);
}
if (z != 7) {
if (x != 7)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z + 1][y][x + 1]);
if (x != 0)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z + 1][y][x - 1]);
}
if (z != 0) {
if (x != 7)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z - 1][y][x + 1]);
if (x != 0)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z - 1][y][x - 1]);
}
if (z != 7) {
if (y != 7)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z + 1][y + 1][x]);
if (y != 0)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z + 1][y - 1][x]);
}
if (z != 0) {
if (y != 7)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z - 1][y + 1][x]);
if (y != 0)
vertices[z][y][x].DiagNeighbours.push_back(&vertices[z - 1][y - 1][x]);
}
}
}
}
for (int z = 0; z < 8; z++) {
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
if (x != 6)
vertices[z][y][x].ExtNeighbours.push_back(&vertices[z][y][x + 2]);
if (x != 1)
vertices[z][y][x].ExtNeighbours.push_back(&vertices[z][y][x - 2]);
if (y != 6)
vertices[z][y][x].ExtNeighbours.push_back(&vertices[z][y + 2][x]);
if (y != 1)
vertices[z][y][x].ExtNeighbours.push_back(&vertices[z][y - 2][x]);
if (z != 6)
vertices[z][y][x].ExtNeighbours.push_back(&vertices[z + 2][y][x]);
if (z != 1)
vertices[z][y][x].ExtNeighbours.push_back(&vertices[z - 2][y][x]);
}
}
}
}
//By the time we enter this function the vectors are empty
void Simulate() {
for (int z = 0; z < 8; z++) {
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
masses[z][y][x]->velocity += ProcessVelocity(*(masses[z][y][x]));
masses[z][y][x]->position += masses[z][y][x]->velocity * deltaTime;
}
}
}
}
};
截至此构造函数的最后一行,所有内容都已填充。正如我所料,所有三个向量都被初始化和填充,分别为12,6和6。现在的问题在于,当我离开这个构造函数时,我已经发送了很多努力填充的所有指针向量都被清空了。最奇怪的部分是位置变量仍然设置,所以我知道对象仍然是相同的,它只是已经消失的矢量数据。
事先我很抱歉,如果之前已经问过这个问题(我老老实实地尝试过使用stackoverflow来解决这个问题,主要是寻找一个矢量可能会自行清空的原因),而且事实上我几乎可以肯定它我忽视了一些简单的事情,比如我没有看到的范围。提前感谢您的所有帮助。
更新信息
尝试帮助发现我在程序主函数中存储和访问场景的问题。
vector<Scene*> scenes;
unsigned int currentScene = 0;
int main() {
scenes.push_back(&Scene());
while(true) {
scenes[currentScene]->Simulate()
}
}