我目前正在一個 OpenGL 專案中作業,我目前應該在其中生成帶有頂點和索引的球體。
所有頂點都代表一個點,索引告訴圖形卡將 3 個點連接為一個三角形。 示例:索引:{0,1,2} = 它將與第一個、第二個和第三個點形成一個三角形。
我設法制作了一個具有正確頂點的 UV 球體,但我不知道如何獲得索引。
這是我目前的結果:

這是我的代碼:
Mesh ObjectFactory::createSphere() {
// Texture loaded and binded to the shaderprogram
Texture textures[]{
Texture("resources/pop_cat.png", "diffuse", 0, GL_RGBA, GL_UNSIGNED_BYTE),
};
int numHorizontalSegments = 20;
int numVerticalSegments = 20;
Vertex vertices[numVerticalSegments * numVerticalSegments] = {};
GLuint indices[numVerticalSegments * numVerticalSegments] = {};
int i = 0;
for (int h = 0; h < numHorizontalSegments; h ) {
float angle1 = (h 1) * M_PI / (numHorizontalSegments 1);
for (int v = 0; v < numVerticalSegments; v ) {
i ;
float angle2 = v * (2 * M_PI) / numVerticalSegments;
float x = sinf(angle1) * cosf(angle2);
float y = cosf(angle1);
float z = sinf(angle1) * sinf(angle2);
vertices[i] = Vertex{glm::vec3(x, y, z), glm::vec3(0.83f, 0.70f, 0.44f), glm::vec2(0.0f, 0.0f)};
indices[i] = i;
}
}
// Store mesh data in vectors for the mesh
std::vector<Vertex> verts(vertices, vertices sizeof(vertices) / sizeof(Vertex));
std::vector<GLuint> ind(indices, indices sizeof(indices) / sizeof(GLuint));
std::vector<Texture> tex(textures, textures sizeof(textures) / sizeof(Texture));
// Create sphere mesh
return {verts, ind, tex};
}
非常感謝您的幫助!
uj5u.com熱心網友回復:
您已經通過計算多個垂直層中的水平圓創建了一個頂點球體,一個 UV 球體。好的。
您只是為每個頂點添加一次索引,每個頂點總共一個索引,這不符合概念。
您需要重復做的是在頂點陣列中找到三個索引,它們構成一個可用的三角形。
除其他外,這意味著您將多次命名相同的頂點索引。主要是六次,因為您的大多數頂點將是六個三角形的一部分。至少一個到“左上”,一個到“右上”,“左下”,“右下”;而通常有兩個雙向;例如右上角的兩個三角形。
“主要是六個”,因為像“北極”和“南極”這樣的邊緣情況;參與許多三角形和四邊形。
讓我們看看你的 UV 球體的一部分:
V03----------V02----------V01---------V00
| | __/ | __/|
| | __/ | c __/ |
| | __/ | __/ |
| | / f | / d |
V13----------V12----------V11----------V10
| | __/ | e __/|
| | a __/ | __/ |
| | __/ | __/ |
| | / b | / |
V23----------V22----------V21----------V20
| | | |
| | | |
| | | |
| | | |
V33----------V32----------V31---------V30
可以看到,對于中間的四邊形(由兩個三角形“a”和“b”表示),
您需要六個索引條目,盡管它只有 4 個頂點,并且每個頂點將被更頻繁地使用,來自其他接觸四邊形。
對于三角形“a”,您將獲得頂點 V11、V12、V22 的索引(注意方向,取決于您想要表面的位置,認為始終“逆時鐘”或始終“順時針”將讓您到達您只需要一個很少嘗試獲得所需的結果)。
對于三角形“b”,您將獲得頂點 V11、V22、V21 的索引。
此外,頂點 V11 必須再次作為三角形“c”和“d”、“e”和“f”的索引;參加六個三角形或四個四邊形。
你設法把你的 UV 球做得很好,所以我認為我不需要提供回圈和選擇代碼來完成它。您設法將 UV 球體的結果可視化,只需在檢查結果后嘗試重試。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331761.html
