Im heutigen Tutorial präsentieren wir eine Methode, mit
deren Hilfe man 3D-Modelle schnell und einfach aus vorgefertigten Modellteilen
zusammensetzen kann. Die Definition dieser Modelle erfolgt mittels sogenannter ModelDescription-Dateien (zu finden im RasterBasedModels-Ordner), die sich
parallel zum laufenden Modelviewer-Programm jederzeit modifizieren und neu
einlesen lassen:
#Definition von
sogenannten Platzhaltern:
Positionen, an denen sich später (in einem Spiel)
Antriebssysteme, Positionslichter und Waffensysteme
platzieren lassen#
#Num Engines:# 1
0.0, 0.0, -7.0
#Num Lights:# 3
0.0, 0.5, 5.5
1.5, 0.0, -5.0
-1.5, 0.0, -5.0
#Num Weaponsystems:# 0
#Num Model Part (Mesh) Definitions:# 11
#1# ../ModelParts/Meshes/BaseBox.txt
#2# ../ModelParts/Meshes/LowerEdge1PosZ.txt
#3# ../ModelParts/Meshes/PyramidTrunk1_50_PosZ.txt
#4# ../ModelParts/Meshes/LateralCenteredDoubleEdge1_25_PosX.txt
#5# ../ModelParts/Meshes/LateralCenteredDoubleEdge1_25_NegX.txt
#6# ../ModelParts/Meshes/LateralCenteredDoubleEdge1_25_PosY.txt
#7# ../ModelParts/Meshes/LateralCenteredDoubleEdge1_25_NegY.txt
#8# ../ModelParts/Meshes/PyramidTrunk1_50_PosX.txt
#9# ../ModelParts/Meshes/PyramidTrunk1_50_NegX.txt
#10# ../ModelParts/Meshes/PyramidTrunk1_50_PosY.txt
#11# ../ModelParts/Meshes/PyramidTrunk1_50_NegY.txt
#Num Texture Sets:# 3
#Hinweise: Die verwendeten Texturen sind in der Datei TextureDesc.txt
angegeben!
Bei von der Würfelform abgeleiteten Modellteilen lassen sich alle 6 Seiten
individuell texturieren.#
#(-y) (+y) (-z) (+z) (-x) (+x)#
#1# 0, 0, 0, 0, 0, 0
#2# 0, 0, 5, 0, 0, 0
#3# 0, 1, 0, 0, 0, 0
#3D-Raster definieren und die einzelnen Modellteile an der
gewünschten Stelle positionieren:#
#Model Height (y-direction):# 5 #Hinweis: y = 2, 1, 0, -1, -2#
#Model Length (z-direction):# 14
#Model Width (x-direction):# 5
#Hinweise:
00 00 beschreibt ein leeres Rasterfeld
Der erste Index entspricht der MeshID, der zweite Index der TexursetID#
#y = 2:#
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
[...]
#y = 0:#
00 00, 00 00, 02 03, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
01 01, 09 01, 01 01, 08 01, 01 01
00 00, 00 00, 01 01, 00 00, 00 00
01 01, 09 01, 01 01, 08 01, 01 01
00 00, 00 00, 01 01, 00 00, 00 00
01 01, 09 01, 01 01, 08 01, 01 01
00 00, 00 00, 01 01, 00 00, 00 00
01 01, 09 01, 01 01, 08 01, 01 01
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 05 01, 01 01, 04 01, 00 00
00 00, 05 01, 01 01, 04 01, 00 00
00 00, 00 00, 03 02, 00 00, 00 00
[...]
Positionen, an denen sich später (in einem Spiel)
Antriebssysteme, Positionslichter und Waffensysteme
platzieren lassen#
#Num Engines:# 1
0.0, 0.0, -7.0
#Num Lights:# 3
0.0, 0.5, 5.5
1.5, 0.0, -5.0
-1.5, 0.0, -5.0
#Num Weaponsystems:# 0
#Num Model Part (Mesh) Definitions:# 11
#1# ../ModelParts/Meshes/BaseBox.txt
#2# ../ModelParts/Meshes/LowerEdge1PosZ.txt
#3# ../ModelParts/Meshes/PyramidTrunk1_50_PosZ.txt
#4# ../ModelParts/Meshes/LateralCenteredDoubleEdge1_25_PosX.txt
#5# ../ModelParts/Meshes/LateralCenteredDoubleEdge1_25_NegX.txt
#6# ../ModelParts/Meshes/LateralCenteredDoubleEdge1_25_PosY.txt
#7# ../ModelParts/Meshes/LateralCenteredDoubleEdge1_25_NegY.txt
#8# ../ModelParts/Meshes/PyramidTrunk1_50_PosX.txt
#9# ../ModelParts/Meshes/PyramidTrunk1_50_NegX.txt
#10# ../ModelParts/Meshes/PyramidTrunk1_50_PosY.txt
#11# ../ModelParts/Meshes/PyramidTrunk1_50_NegY.txt
#Num Texture Sets:# 3
#Hinweise: Die verwendeten Texturen sind in der Datei TextureDesc.txt
angegeben!
Bei von der Würfelform abgeleiteten Modellteilen lassen sich alle 6 Seiten
individuell texturieren.#
#(-y) (+y) (-z) (+z) (-x) (+x)#
#1# 0, 0, 0, 0, 0, 0
#2# 0, 0, 5, 0, 0, 0
#3# 0, 1, 0, 0, 0, 0
#3D-Raster definieren und die einzelnen Modellteile an der
gewünschten Stelle positionieren:#
#Model Height (y-direction):# 5 #Hinweis: y = 2, 1, 0, -1, -2#
#Model Length (z-direction):# 14
#Model Width (x-direction):# 5
#Hinweise:
00 00 beschreibt ein leeres Rasterfeld
Der erste Index entspricht der MeshID, der zweite Index der TexursetID#
#y = 2:#
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
00 00, 00 00, 00 00, 00 00, 00 00
[...]
#y = 0:#
00 00, 00 00, 02 03, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
01 01, 09 01, 01 01, 08 01, 01 01
00 00, 00 00, 01 01, 00 00, 00 00
01 01, 09 01, 01 01, 08 01, 01 01
00 00, 00 00, 01 01, 00 00, 00 00
01 01, 09 01, 01 01, 08 01, 01 01
00 00, 00 00, 01 01, 00 00, 00 00
01 01, 09 01, 01 01, 08 01, 01 01
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 00 00, 01 01, 00 00, 00 00
00 00, 05 01, 01 01, 04 01, 00 00
00 00, 05 01, 01 01, 04 01, 00 00
00 00, 00 00, 03 02, 00 00, 00 00
[...]
Obwohl sich die einzelnen Modellteile mithilfe von
Texture-Buffer-basiertem Geometry Instancing schnell und effizient darstellen
lassen (die in diesem Zusammenhang verwendeten Shader-Programme RasterBasedRendering.vert sowie RasterBasedRendering.frag befinden sich
im Ordner Shader), wird ein
3D-Raster-Modell (diese Bezeichnung rührt daher, dass die einzelnen Modellteile
auf einem dreidimensionalen Raster angeordnet sind) beim Einlesen der
zugehörigen Description-Datei – für eine mögliche spätere Verwendung in einem
anderen Programm – automatisch in ein Framework-Standardformat konvertiert. Alle
in diesem Zusammenhang benötigten Informationen – welches 3D-Model bei
Programmstart geladen wird und welche Parameter bei der Konvertierung
berücksichtigt werden sollen – sind in der Datei DemoConfig.txt gespeichert:
[...]
ActualUsedModelDescFile: ../RasterBasedModels/BattleCruiser3.txt
ConvertedModelName: BattleCruiser3
ConvertedModel_GenerateNormalsPerTriangle(no=0,yes=1): 1
ConvertedModel_MeshReconstruction(no=0,yes=1): 1
ModelScaleFactor: 1.0
RenderConvertedModel(no=0,yes=1): 1
ActualUsedModelDescFile: ../RasterBasedModels/BattleCruiser3.txt
ConvertedModelName: BattleCruiser3
ConvertedModel_GenerateNormalsPerTriangle(no=0,yes=1): 1
ConvertedModel_MeshReconstruction(no=0,yes=1): 1
ModelScaleFactor: 1.0
RenderConvertedModel(no=0,yes=1): 1
Hinweise zum Erstellen eines neuen Projekts:
- Kopieren Sie den Ordner GraphicsAndPhysicsFrameworkImports ins Projektverzeichnis
- Kopieren sie alle dll-Dateien sowie die Konfigurationsdatei ResolutionAndRendering.txt aus besagtem Ordner ins gleiche Verzeichnis, in dem sich auch die exe-Datei befindet (in unseren Programmbeispielen ist dies das Bin-Verzeichnis)
- Binden Sie die folgenden Dateien in Ihr Projekt ein: GraphicsAndPhysics_Framework_Imports.h, GraphicsAndPhysics_Framework_Imports.lib, glew32.lib, glew32s.lib, glut32.lib. Die Glew- und Glut-Bibliotheken ermöglichen die Nutzung der aktuellen OpenGL-Spezifikationen unabhängig vom Framework.
GraphicsAndPhysicsFrameworkDemo32.zip