#c
#c
Вопрос:
Моя функция getHeightOfTerrain()
вызывает функцию барицентрической формулы, которая не возвращает правильную высоту для одной заданной тестовой высоты в : heightMapFromArray[][]
.
Я пытался посмотреть руководства по JAVA-играм OpenGL 14,21, 22 от «thin matrix», и я запутался в том, как использовать мой массив: heightMapforBaryCentric
в обеих предоставленных функциях и как каким-то образом установить аргументы, которые передаются в baryCentic()
функцию, чтобы я мог решить проблему.
int creaateTerrain(int height, int width)
{
float holderY[6] = { 0.f ,0.f,0.f,0.f,0.f,0.f };
float scaleit = 1.5f;
float holder[6] = { 0.f,0.f,0.f,0.f,0.f,0.f };
for (int z = 0, z2 =0; z < iterationofHeightMap;z2 )
{
//each loop is two iterations and creates one quad (two triangles)
//however because each iteration is by two (i.e. : x=x 2) om bottom
//the amount of triangles is half the x value
//
//number of vertices : 80 x 80 x 6.
//column
for (int x = 0, x2 = 0; x < iterationofHeightMap;x2 )
{
//relevant - A : first triangle - on left triangle
//[row] [colum[]
holder[0] = heightMapFromArray[z][x];
//holder[0] = (float)imageData[(z / 2 * MAP_Z (x / 2)) * 3];
//holder[0] = holder[0] / 255;// *scaleit;
vertices.push_back(glm::vec3(x, holder[0], z));
//match height map with online barycentric use
heightMapforBaryCentric[x2][z2] = holder[0];
holder[1] = heightMapFromArray[z 2][x];
//holder[1] = (float)imageData[(((z 2) / 2 * MAP_Z ((x) / 2))) * 3];
//holder[1] = holder[1] / 255;// 6 * scaleit;
vertices.push_back(glm::vec3(x, holder[1], z 2));
//match height map with online barycentric use
heightMapforBaryCentric[x2][z2 1] = holder[1];
holder[2] = heightMapFromArray[z 2][x 2];
//holder[2] = (float)imageData[(((z 2) / 2 * MAP_Z ((x 2) / 2))) * 3];
//holder[2] = holder[2] / 255;// *scaleit;
vertices.push_back(glm::vec3(x 2, holder[2], z 2));
////match height map with online barycentric use
heightMapforBaryCentric[x2 1][z2 1] = holder[2];
//relevant - B - second triangle (on right side)
holder[3] = heightMapFromArray[z][x];
//holder[3] = (float)imageData[((z / 2)*MAP_Z (x / 2)) * 3];
//holder[3] = holder[3] / 255;// 256 * scaleit;
vertices.push_back(glm::vec3(x, holder[3], z));
holder[4] = heightMapFromArray[x 2][z 2];
//holder[4] = (float)imageData[(((z 2) / 2 * MAP_Z ((x 2) / 2))) * 3];
//holder[4] = holder[4] / 255;// *scaleit;
vertices.push_back(glm::vec3(x 2, holder[4], z 2));
holder[5] = heightMapFromArray[x 2][z];
//holder[5] = (float)imageData[((z / 2)*MAP_Z ((x 2) / 2)) * 3];
//holder[5] = holder[5] / 255;// *scaleit;
vertices.push_back(glm::vec3(x 2, holder[5], z));
x = x 2;
}
z = z 2;
}
return(1);
}
float getHeightOfTerrain(float worldX, float worldZ) {
float terrainX = worldX;
float terrainZ = worldZ;
int gridSquareSize = 2.0f;
gridX = (int)floor(terrainX / gridSquareSize);
gridZ = (int)floor(terrainZ / gridSquareSize);
xCoord = ((float)(fmod(terrainX, gridSquareSize)) / (float)gridSquareSize);
zCoord = ((float)(fmod(terrainZ, gridSquareSize)) / (float)gridSquareSize);
if (xCoord <= (1 - zCoord))
{
answer = baryCentric(
//left triangle
glm::vec3(0.0f, heightMapforBaryCentric[gridX][gridZ], 0.0f),
glm::vec3(0.0f, heightMapforBaryCentric[gridX][gridZ 1], 1.0f),
glm::vec3(1.0f, heightMapforBaryCentric[gridX 1][gridZ 1], 1.0f),
glm::vec2(xCoord, zCoord));
// if (answer != 1)
// {
// fprintf(stderr, "Z:gridx: %d gridz: %d answer: %fn", gridX, gridZ,answer);
//
// }
}
else
{
//right triangle
answer = baryCentric(glm::vec3(0, heightMapforBaryCentric[gridX][gridZ], 0),
glm::vec3(1,heightMapforBaryCentric[gridX 1][gridZ 1], 1),
glm::vec3(1,heightMapforBaryCentric[gridX 1][gridZ], 0),
glm::vec2(xCoord, zCoord));
}
if (answer == 1)
{
answer = 0;
}
//answer = abs(answer - 1);
return(answer);
}
float baryCentric(glm::vec3 p1, glm::vec3 p2, glm::vec3 p3 , glm::vec2 pos) {
float det = (p2.z - p3.z) * (p1.x - p3.x) (p3.x - p2.x) * (p1.z - p3.z);
float l1 = ((p2.z - p3.z) * (pos.x - p3.x) (p3.x - p2.x) * (pos.y - p3.z)) / det;
float l2 = ((p3.z - p1.z) * (pos.x - p3.x) (p1.x - p3.x) * (pos.y - p3.z)) / det;
float l3 = 1.0f - l1 - l2;
return (l1 * p1.y l2 * p2.y l3 * p3.y);
}
Мои ожидаемые результаты заключались в том, что центр высоты тестовой сетки должен был иметь заданное значение .5 и постепенно уменьшаться по мере уменьшения высоты. Моими результатами были высоты, которые были одинаковыми, варьировались или увеличивались. Обычно эти высоты были меньше единицы.
Комментарии:
1. Выполните функцию с помощью отладчика и посмотрите, где программа отклоняется от ожидаемого. Скорее всего, ошибка именно в этом.
2. Хорошо. Я не уверен, правильно ли я вообще вызываю барицентрическую формулу, правильно ли это выглядит? Спасибо!