(0xBAADF00D)即使我在循环中设置值

问题描述 投票:0回答:1

我正在尝试创建一个位置数组和法向量,排列如下:

{
something1.x, something1.y, something1.z, normal1.x, normal1.y, normal1.z
something2.x, something2.y, something2.z, normal1.x, normal1.y, normal1.z
something3.x, something3.y, something3.z, normal1.x, normal1.y, normal1.z
something1.x, something1.y, something1.z, normal2.x, normal2.y, normal2.z
something2.x, something2.y, something2.z, normal2.x, normal2.y, normal2.z
something3.x, something3.y, something3.z, normal2.x, normal2.y, normal2.z
etc...
}

这是我的代码:

#include "perlin_mesh.h"
#include "perlin.h"

#include <cstdlib>

PerlinMesh::PerlinMesh(int square_length, int frequency, float x_offset, float z_offset, float scale) {
    this->square_length = square_length;

    int extended_square_length = square_length * frequency;

    vertices = (float*) malloc(sizeof(float) * extended_square_length * extended_square_length * 3);
    normals = (float*) malloc(sizeof(float)*(extended_square_length - 1) * (extended_square_length - 1) * 2);
    indices = (unsigned int*) malloc(sizeof(unsigned int)*(extended_square_length - 1) * (extended_square_length - 1) * 6);

    vertices_indexed = (float*) malloc(sizeof(float)*(extended_square_length - 1) * (extended_square_length - 1)*6*3*2);

    for (unsigned int i = 0; i < extended_square_length; i++) {
        for (unsigned int j = 0; j < extended_square_length; j++) {
            // Calculate the index for the current vertex
            unsigned int index = (i * extended_square_length + j) * 3;

            // Assign coordinates to the vertex
            vertices[index]     = static_cast<float>(i)/(float)frequency;
            vertices[index + 1] = perlin(
                ((float)i*0.3f*scale + x_offset)/(float)frequency,
                ((float)j*0.3f*scale + z_offset)/(float)frequency
            );
            vertices[index + 2] = static_cast<float>(j)/(float)frequency;
        }
    }

    for (unsigned int i = 0; i < (extended_square_length - 1); i++) {
        for (unsigned int j = 0; j < (extended_square_length - 1) * 6; j+=6) {
            // Triangle 1
            indices[i * (extended_square_length-1) + j] = j/6 + extended_square_length * i;
            indices[i * (extended_square_length-1) + j+1] = (j/6) + extended_square_length * (i + 1);
            indices[i * (extended_square_length-1) + j+2] = (j/6) + 1 + extended_square_length * i;

            // Triangle 2
            indices[i * (extended_square_length-1) + j+3] = (j/6) + 1 + extended_square_length * i;
            indices[i * (extended_square_length-1) + j+4] = (j/6) + extended_square_length * (i + 1);
            indices[i * (extended_square_length-1) + j+5] = (j/6) + 1 + extended_square_length * (i + 1);
        }
    }


    for (unsigned int i = 0; i < (extended_square_length - 1) * (extended_square_length - 1) * 2; i+=3) {
        glm::vec3 p1 = glm::vec3(vertices[indices[i]], vertices[indices[i]+1], vertices[indices[i]+2]);
        glm::vec3 p2 = glm::vec3(vertices[indices[i+1]], vertices[indices[i+1]+1], vertices[indices[i+1]+2]);
        glm::vec3 p3 = glm::vec3(vertices[indices[i+2]], vertices[indices[i+2]+1], vertices[indices[i+2]+2]);

        glm::vec3 u = p2 - p1;
        glm::vec3 v = p3 - p1;

        //  Set Normal.x to (multiply U.y by V.z) minus (multiply U.z by V.y)
        //  Set Normal.y to (multiply U.z by V.x) minus (multiply U.x by V.z)
        //  Set Normal.z to (multiply U.x by V.y) minus (multiply U.y by V.x)

        normals[i] = u.y*v.z - u.z*v.y;
        normals[i+1] = u.z*v.x - u.x*v.z;
        normals[i+2] = u.x*v.y - u.y*v.x;
    }

    for (unsigned int i = 0; i < (extended_square_length - 1) * (extended_square_length - 1)*6*3*2; i+=6) {
        // positions
        vertices_indexed[i] = vertices[indices[i]];
        vertices_indexed[i+1] = vertices[indices[i] + 1];
        vertices_indexed[i+2] = vertices[indices[i] + 2];

        // normals
        for (unsigned int j = 2; j < 5; j++) {
            vertices_indexed[i+j] = normals[i/6];
        }
    }

}

我使用此代码来生成我的索引

    for (unsigned int i = 0; i < (extended_square_length - 1); i++) {
        for (unsigned int j = 0; j < (extended_square_length - 1) * 6; j+=6) {
            // Triangle 1
            indices[i * (extended_square_length-1) + j] = j/6 + extended_square_length * i;
            indices[i * (extended_square_length-1) + j+1] = (j/6) + extended_square_length * (i + 1);
            indices[i * (extended_square_length-1) + j+2] = (j/6) + 1 + extended_square_length * i;

            // Triangle 2
            indices[i * (extended_square_length-1) + j+3] = (j/6) + 1 + extended_square_length * i;
            indices[i * (extended_square_length-1) + j+4] = (j/6) + extended_square_length * (i + 1);
            indices[i * (extended_square_length-1) + j+5] = (j/6) + 1 + extended_square_length * (i + 1);
        }

但是当我在这个循环中访问它时:

    for (unsigned int i = 0; i < (extended_square_length - 1) * (extended_square_length - 1) * 2; i+=3) {
        glm::vec3 p1 = glm::vec3(vertices[indices[i]], vertices[indices[i]+1], vertices[indices[i]+2]);
        glm::vec3 p2 = glm::vec3(vertices[indices[i+1]], vertices[indices[i+1]+1], vertices[indices[i+1]+2]);
        glm::vec3 p3 = glm::vec3(vertices[indices[i+2]], vertices[indices[i+2]+1], vertices[indices[i+2]+2]);

        glm::vec3 u = p2 - p1;
        glm::vec3 v = p3 - p1;

        //  Set Normal.x to (multiply U.y by V.z) minus (multiply U.z by V.y)
        //  Set Normal.y to (multiply U.z by V.x) minus (multiply U.x by V.z)
        //  Set Normal.z to (multiply U.x by V.y) minus (multiply U.y by V.x)

        normals[i] = u.y*v.z - u.z*v.y;
        normals[i+1] = u.z*v.x - u.x*v.z;
        normals[i+2] = u.x*v.y - u.y*v.x;
    }

我开始访问这一行中未分配的内存

glm::vec3 p1 = glm::vec3(vertices[indices[i]], vertices[indices[i]+1], vertices[indices[i]+2]);

...每当 i = 126

我注意到在我的调试工具中我收到了这个(对我来说)不熟悉的警告: “在指向成员构造的指针中使用非指向成员值的指针”

我还注意到,在内存视图中,它仅在 126 处开始显示 BAADFOOD,这是一个可疑的数字,因为我使用平方长度为 10、频率为 1 的测试值测试了此代码,并且:

(10-1)*(10-1)*6 = 486 和 486除以j值(18)正好等于(10-1)*3

也许我只是绊倒了

完整的调试细节:

c++ c++20 glm-math
1个回答
0
投票

解决了

尽管我没有在代码中看到错误,但由于 HolyBlackCat 的评论,我仅使用 std::vector 就可以让一切正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.