2017-06-01 9 views
2

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

...

+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. –

+0

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 –

+0

@Sly_TheKing verwenden. Sowie eine Dreiecksliste. Habe den Code in den obigen Beitrag eingefügt. Danke :) –

Antwort

0

Aus den Daten u für das Haus vorgesehen ist, wie es scheint, 1 Dreieck ist in einer Art und Weise zugewandt ist und die zweite ist die entgegengesetzte Richtung weist.

Verwenden Rasterizer ohne Dieses Objekt

+0

[Rasterizer] (http://imgur.com/a/IJd4d) scheint es bei cull_none zu sein. hmmm ... :( –

+0

Ich erkannte das Problem. Es scheint nicht alle obj Datei sind dreieckig. So sind die geladenen Scheitelpunkte viel weniger, die die fehlenden Scheitelpunkte für die Dreiecke –

+0

dann vielleicht sind sie als Dreiecksleiste gespeichert gespeichert? versuchen Sie lesen alle 4 Ecken und machen den Dreiecks-Streifen –