Ich arbeite gerade am Oculus Rift PC SDK. Ich habe versucht mit etwas einfacherem wie Tiny Room Demo (DX11) anzufangen. Sah dieses Tutorial Online ein 3D-Modell in die Szene von einem externen Datei (Rastertek Tutorial 7: 3D-Modell Rendering) zu ladenOculus Tiny Room, DirectX, Laden eines 3D-Modells in Szene
Die Art und Weise der winzigen Raum Demo schafft Modell ist die Koordinaten zu codieren und macht es
TriangleSet walls;
walls.AddSolidColorBox(10.1f, 0.0f, 20.0f, 10.0f, 4.0f, -20.0f, 0xff808080); // Left Wall
walls.AddSolidColorBox(10.0f, -0.1f, 20.1f, -10.0f, 4.0f, 20.0f, 0xff808080); // Back Wall
walls.AddSolidColorBox(-10.0f, -0.1f, 20.0f, -10.1f, 4.0f, -20.0f, 0xff808080); // Right Wall
Add(
new Model(&walls, XMFLOAT3(0, 0, 0), XMFLOAT4(0, 0, 0, 1),
new Material(
new Texture(false, 256, 256, Texture::AUTO_WALL)
)
)
);
void AddSolidColorBox(float x1, float y1, float z1, float x2, float y2, float z2, uint32_t c)
{
AddQuad(Vertex(XMFLOAT3(x1, y2, z1), ModifyColor(c, XMFLOAT3(x1, y2, z1)), z1, x1),
Vertex(XMFLOAT3(x2, y2, z1), ModifyColor(c, XMFLOAT3(x2, y2, z1)), z1, x2),
Vertex(XMFLOAT3(x1, y2, z2), ModifyColor(c, XMFLOAT3(x1, y2, z2)), z2, x1),
Vertex(XMFLOAT3(x2, y2, z2), ModifyColor(c, XMFLOAT3(x2, y2, z2)), z2, x2));
...}
AddQuad(Vertex v0, Vertex v1, Vertex v2, Vertex v3) { AddTriangle(v0, v1, v2); AddTriangle(v3, v2, v1); }
void AddTriangle(Vertex v0, Vertex v1, Vertex v2)
{
VALIDATE(numVertices <= (maxBuffer - 3), "Insufficient triangle set");
for (int i = 0; i < 3; i++) Indices[numIndices++] = short(numVertices + i);
Vertices[numVertices++] = v0;
Vertices[numVertices++] = v1;
Vertices[numVertices++] = v2;
}
versucht das Modell in die Szene mit einer Funktion aus dem Tutorial
TriangleSet models;
models.LoadModel("F:\\cube.txt");
Add(
new OBJModel(&models, XMFLOAT3(0, 0, 0), XMFLOAT4(0, 0, 0, 1),
new OBJMaterial(
new Texture(false, 256, 256, Texture::AUTO_WHITE)
//new Texture(DirectX, L"wallpaper.jpg")
)
)
); //3D Model
void LoadModel(char* filename)
{
ifstream fin;
char input;
// Open the model file.
fin.open(filename);
// Read up to the value of vertex count.
fin.get(input);
while (input != ':')
{
fin.get(input);
}
// Read in the vertex count.
m_vertexCount = 0;
fin >> m_vertexCount;
// Read up to the beginning of the data.
fin.get(input);
while (input != ':')
{
fin.get(input);
}
fin.get(input);
fin.get(input);
// Read in the vertex data.
for (int i = 0; i<m_vertexCount; i++)
{
Indices[numIndices++] = short(numVertices + i);
//numVertices++; deleted
fin >> Vertices[numVertices].Pos.x >> Vertices[numVertices].Pos.y >> Vertices[numVertices].Pos.z;
fin >> Vertices[numVertices].U >> Vertices[numVertices].V;
fin >> Normals[numVertices].Norm.x >> Normals[numVertices].Norm.y >> Normals[numVertices].Norm.z;
Vertices[numVertices].C = ModifyColor(0xffffffff, Vertices[numVertices].Pos);
numVertices+=1; //new statement
}
// Close the model file.
fin.close();
}
ich das normal wie aus dem Tutorial nicht laden es für die Textur des Objektes gemeint war. Stattdessen habe ich die Farbe als fest gelb definiert. Versucht, die Struktur des Ladens des Modells so ähnlich wie Tiny Room Demo zu halten.
Ich habe das gleiche Modell, Material und Textur (Vertex Shader und Pixel Shader) wie Tiny Room Demo verwendet. Was jedoch auf die Szene übertragen wurde, erschien nicht als das, was es sein sollte.
Wurde eine schrittweise Überprüfung durchgeführt, um zu sehen, ob die Koordinaten korrekt in die Vertices [numVertices] geladen wurden. Es scheint, als gäbe es kein Problem. Die Datei-I wurde versucht zu laden cube.txt
Vertex-Zähler: 36
Daten:
-1,0 1,0 -1,0 0,0 0,0 0,0 0,0 -1,0
1,0 1,0 -1,0 1,0 0,0 0,0 0,0 -1,0
-1,0 -1,0 -1,0 0,0 1,0 0,0 0,0 -1,0
-1,0 -1,0 -1,0 0,0 1,0 0,0 0,0 -1,0
1,0 1,0 -1,0 1,0 0,0 0,0 0,0 -1,0
1,0 -1,0 -1,0 1,0 1,0 0,0 0,0 -1,0
1,0 1,0 -1,0 0,0 0,0 1,0 0,0 0,0
1,0 1,0 1,0 1,0 0,0 1,0 0,0 0,0
1,0 -1,0 -1,0 0,0 1,0 1,0 0,0 0,0
1,0 -1,0 -1,0 0,0 1,0 1,0 0,0 0,0
1,0 1,0 1. 0 1,0 0,0 1,0 0,0 0,0
1,0 -1,0 1,0 1,0 1,0 1,0 0,0 0,0
1,0 1,0 1,0 0,0 0,0 0,0 0,0 1,0
-1,0 1,0 1,0 1,0 0,0 0,0 0,0 1,0
1,0 - 1,0 1,0 0,0 1,0 0,0 0,0 1,0
1,0 -1,0 1,0 0,0 1,0 0,0 0,0 1,0
-1,0 1,0 1,0 1,0 0,0 0,0 0,0 1.0
-1,0 -1,0 1,0 1,0 1,0 0,0 0,0 1,0
...
Was (außer ohne die Textur) zu zeigen, war wohl 3D cube
Was tatsächlich zeigte up war nur Fragmente des Dreiecks TinyRoomDemo + 3D cube
Unsicher, was schief gelaufen ist. Bitte machen Sie Rat! Vielen Dank :)
Vertex und Index-Puffer
struct OBJModel
{
XMFLOAT3 Pos;
XMFLOAT4 Rot;
OBJMaterial * Fill;
DataBuffer * VertexBuffer;
DataBuffer * IndexBuffer;
int NumIndices;
OBJModel() : Fill(nullptr), VertexBuffer(nullptr), IndexBuffer(nullptr) {};
void Init(TriangleSet * t)
{
NumIndices = t->numIndices;
VertexBuffer = new DataBuffer(DIRECTX.Device, D3D11_BIND_VERTEX_BUFFER, &t->Vertices[0], t->numVertices * sizeof(Vertex));
IndexBuffer = new DataBuffer(DIRECTX.Device, D3D11_BIND_INDEX_BUFFER, &t->Indices[0], t->numIndices * sizeof(short));
}
...
DIRECTX.Context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
---------------- -------------------------------------------------- -------------------------------------------------- -------------
06/06/2017 bearbeitet: 3D-Modelldaten:
Vertex Count: 798
Daten:
28,3005 0,415886 -45,8282 0,7216 0,720211 0 0 -1
28,3005 -0,809079 -45,8282 0,732222 0,720211 0 0 -1
-27,7441 -0,809079 -45,8282 0,732222 0,847836 0 0 -1
28,3005 0,415886 68,1056 0,459891 0,720286 0 1 -0
28,3005 0,415886 -45,8282 0,719341 0,720286 0 1 -0
-27,7441 0,415886 -45,8282 0,719341 0,847911 0 1 -0
28,3005 -0,809079 68,1056 0,721603 0,720211 0 0 1
28,3005 0,415886 68,1056 0,732225 0,720211 0 0 1
-27,7441 0,415886 68,1056 0,732225 0,847836 0 0 1
28,3005 -0,8 09079 -45,8282 0,459891 0,720298 0 -1 -0
28,3005 -0,809079 68,1056 0,719341 0,720298 0 -1 -0
-27,7441 -0,809079 68,1056 0,719341 0,847923 0 -1 -0
28,3005 0,415886 68,1056 0,719341 0,70683 1 0 -0
...
In Ihrer Funktion loadmodel, so scheint es, dass Sie die Schleife starten durch Erhöhen numVertices zu ziehen Culling. Deshalb hat Vertices [0] keinen Wert. –
hast du den Indexpuffer benutzt? oder Vertex-Puffer nur? Sie könnten Indexe vermasselt haben, wenn Sie den Index-Puffer verwendet haben. Achten Sie auch darauf, ob Sie die Triplestrip-Methode zum Zeichnen von Dreiecken verwenden, basierend auf Vertices, vorausgesetzt, Sie sollten die Dreiecksliste –
@Sly_TheKing verwenden. Sowie eine Dreiecksliste. Habe den Code in den obigen Beitrag eingefügt. Danke :) –