Oculus Tiny Room,DirectX,将3D模型加载到场景中

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

本文关键字:加载 模型 3D Tiny Room DirectX Oculus      更新时间:2023-10-16

我当前正在开发Oculus Rift PC SDK。试图从更简单的东西开始,例如Tiny Room Demo(DX11(。在线看到本教程将3D模型从外部文件加载到场景中(rastertek教程7:3D模型渲染(

微小的房间演示创建模型的方式是将坐标和呈现为

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

尝试使用教程中的功能将模型加载到场景中

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

我没有使用普通的,因为从教程中,它是针对对象的纹理的。相反,我将颜色定义为纯黄色。试图使加载模型的结构尽可能类似于小房间演示。

我使用了与小房间演示的相同型号,材料和纹理(顶点着色器和像素着色器(。但是,现场渲染的内容并不是应该的。

进行逐步调试,以查看坐标是否正确加载到顶点[Numvertices]。似乎没有问题。我尝试加载的文件是cube.txt

顶点计数:36

数据:

-1.0 1.0 -1.0 0.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 0.0 -1.0

-1.0 -1.0 -1.0 0.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 0.0 -1.0

1.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 1.0 0.0 0.0 0.0 -1.0

1.0 1.0 -1.0 0.0 0.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 0.0

1.0 -1.0 -1.0 0.0 1.0 1.0 0.0 0.0 0.0

1.0 -1.0 -1.0 0.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 0.0

1.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 0.0 1.0

-1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0

1.0 -1.0 1.0 0.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 0.0 1.0

-1.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 1.0 0.0 0.0 0.0 1.0

...

应该出现的内容(没有纹理除外(3D立方体

实际显示的只是三角形的片段小房间 3D立方体

不确定出了什么问题。请做建议!非常感谢:(

顶点和索引缓冲区

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

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2017年6月6日编辑:3D模型数据:

顶点计数:798

数据:

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

...

来自为房屋提供的数据,似乎以一种方式面对1个三角形,其次是面对相反的方式。

使用rasterizer 没有背扣来绘制此对象