void GeometryGenerator::Subdivide(MeshData& meshData)
{
// Save a copy of the input geometry.
MeshData inputCopy = meshData;
meshData.Vertices.resize(0);
meshData.Indices.resize(0);
// v1
// *
// /\
// / \
// m0*-----*m1
// /\ /\
/// \/ \
// *-----*-----*
// v0 m2 v2
UINT numTris = inputCopy.Indices.size()/3;
for(UINT i = 0; i < numTris; ++i)
{
Vertex v0 = inputCopy.Vertices[ inputCopy.Indices[i*3+0] ];
Vertex v1 = inputCopy.Vertices[ inputCopy.Indices[i*3+1] ];
Vertex v2 = inputCopy.Vertices[ inputCopy.Indices[i*3+2] ];
//
// Generate the midpoints.
//
Vertex m0, m1, m2;
// For subdivision, we just care about the position component. We
// derive the other
// vertex components in CreateGeosphere.
m0.Position = XMFLOAT3(
0.5f*(v0.Position.x + v1.Position.x),
0.5f*(v0.Position.y + v1.Position.y),
0.5f*(v0.Position.z + v1.Position.z));
m1.Position = XMFLOAT3(
0.5f*(v1.Position.x + v2.Position.x),
0.5f*(v1.Position.y + v2.Position.y),
0.5f*(v1.Position.z + v2.Position.z));
m2.Position = XMFLOAT3(
0.5f*(v0.Position.x + v2.Position.x),
0.5f*(v0.Position.y + v2.Position.y),
0.5f*(v0.Position.z + v2.Position.z));
//
// Add new geometry.
//
meshData.Vertices.push_back(v0); // 0
meshData.Vertices.push_back(v1); // 1
meshData.Vertices.push_back(v2); // 2
meshData.Vertices.push_back(m0); // 3
meshData.Vertices.push_back(m1); // 4
meshData.Vertices.push_back(m2); // 5
meshData.Indices.push_back(i*6+0);
meshData.Indices.push_back(i*6+3);
meshData.Indices.push_back(i*6+5);
meshData.Indices.push_back(i*6+3);
meshData.Indices.push_back(i*6+4);
meshData.Indices.push_back(i*6+5);
meshData.Indices.push_back(i*6+5);
meshData.Indices.push_back(i*6+4);
meshData.Indices.push_back(i*6+2);
meshData.Indices.push_back(i*6+3);
meshData.Indices.push_back(i*6+1);
meshData.Indices.push_back(i*6+4);
}
}
Diese Funktion ist in ‚GeometryGenerator.cpp‘ Datei und hat ein Netz unterteilen. Bevor diese Funktion aufgerufen wird, wird ein Ikosaeder erstellt und als Parameter meshData übertragen. Die Member von MeshData, Vertices und Indices sind Vektoren von STL.In einem Beispielcode des Buches „Einführung in die 3D-Spieleprogrammierung mit DirectX 11“
Meiner Meinung nach, ruft diese Funktion diese Reihe von Funktionen, meshData.Vertices.push_back, in der nächsten Iteration der Schleife einige der Scheitelpunkte wiederholt gespeichert werden.
Jeder konnte
- beantworten, ob ich falsch bin,
- , warum der Autor die Codes wie diese machen,
- oder ob es effizienter, wenn meine Gedanken richtig ist.
Danke an alle, die mein schlechtes Englisch gelesen haben.
Ich habe einige Tage und heute weggegangen sah ich Ihre feine Antwort! Vielen Dank für Ihre Hilfe und Entschuldigung für einen Kommentar zu spät. Es war sehr hilfreich, also überarbeite ich die Codes mit Bezug auf Ihre Antwort. Danach kann ich auch eine Formel finden, die hilft, die Anzahl der Eckpunkte der 'aktuellen' Geosphäre zu erhalten. Die Anzahl der Seiten ist die Anzahl der Scheitelpunkte, die erstellt werden, und ersteres kann dadurch erreicht werden: (aktuelle Dreieckszahl) * 3/2. Ihre Antwort gab mir die Möglichkeit, weiter fortgeschritten zu denken, danke :) – Owen