简体   繁体   中英

Oculus Tiny Room, Directx, Loading a 3D Model into scene

I am currently working on Oculus Rift PC SDK. Was trying to start off with something simpler like Tiny Room Demo(DX11). Saw this tutorial online to load a 3D model into the scene from external file (Rastertek Tutorial 7: 3D Model Rendering)

The way the Tiny Room Demo creates model is to hardcode the coordinates and renders it

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;
}

Tried to load the model into the scene using a function from the 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();
}

I did not use the normal as from the tutorial it was meant for the texture of the object. Instead I defined the color to be solid yellow. Tried to keep the structure of loading the model as similar to Tiny Room Demo as possible.

I have used the same model, material and texture (vertex shader and pixel shader) as how Tiny Room Demo does. However what was rendered onto the scene did not appear as what it is supposed to be.

Did a step by step debugging to see if the coordinates were correctly loading into the Vertices[numVertices]. Seems like there is no issue. The file I tried to load was cube.txt

Vertex Count: 36

Data:

-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

...

What was suppose to show up (except without the texture) 3D cube

What actually showed up was just fragments of triangle TinyRoomDemo + 3D cube

Unsure what went wrong. Please do advice! Thank you very much :)

Vertex and Index buffer

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 edited: 3D Model data:

Vertex Count: 798

Data:

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.809079 -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

...

From the data u provided for the house, it seems like 1 triangle is facing in one way and second is facing the opposite way.

Use rasterizer without back culling to draw this object

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM