我正在尝试创建一个位置数组和法向量,排列如下:
{
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
也许我只是绊倒了
完整的调试细节:
解决了
尽管我没有在代码中看到错误,但由于 HolyBlackCat 的评论,我仅使用 std::vector 就可以让一切正常工作。