2017-06-01 2 views
2

Je travaille actuellement sur Oculus Rift PC SDK. Essayait de commencer avec quelque chose de plus simple comme Tiny Room Demo (DX11). A vu ce tutoriel en ligne pour charger un modèle 3D dans la scène du fichier externe (Rastertek Tutoriel 7: Modèle de rendu 3D)Oculus Tiny Room, Directx, Chargement d'un modèle 3D en scène

La façon dont la chambre minuscule de démonstration crée modèle est de coder les coordonnées et le rend

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

essayé de charger le modèle dans la scène en utilisant une fonction du tutoriel

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

Je n'ai pas utilisé la normale à partir du tutoriel, il a été destiné à la texture de l'objet. Au lieu de cela j'ai défini la couleur pour être jaune solide. Je ai essayé de garder la structure de chargement du modèle similaire à Tiny Room Demo que possible.

J'ai utilisé le même modèle, le même matériau et la même texture (vertex shader et pixel shader) que le fait Tiny Room Demo. Cependant ce qui a été rendu sur la scène n'apparaît pas comme ce qu'il est supposé être. Effectuer un débogage pas à pas pour voir si les coordonnées étaient correctement chargées dans les sommets [numVertices]. On dirait qu'il n'y a pas de problème. Le fichier que j'ai essayé de charger a été cube.txt

Vertex Count: 36

données:

-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

...

Ce qui était censé apparaître (sauf sans la texture) 3D cube

Ce qui a montré réellement était juste des fragments de triangle TinyRoomDemo + 3D cube

Vous ne savez pas ce qui s'est passé. S'il vous plaît, faites des conseils! Merci beaucoup :)

tampon Vertex et l'indice

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 édité: données modèle 3D:

Vertex Count: 798

données:

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

Dans votre fonction loadModel, il semble que vous démarrez la boucle en incrémentant numVertices. Par conséquent, les sommets [0] n'ont aucune valeur. –

+0

Avez-vous utilisé le tampon d'index? ou tampon de vertex seulement? Vous pourriez avoir des index déformés si vous avez utilisé le tampon d'index, regardez aussi si vous avez utilisé la méthode trianglestrip de dessiner des triangles, basé sur les vertices u fourni vous devriez utiliser trianglelist –

+0

@Sly_TheKing J'utilise à la fois le vertex et le tampon d'index. Ainsi qu'une trianglelist. Ont ajouté le code dans le message ci-dessus. Merci :) –

Répondre

0

a partir des données fournies u pour la maison, il semble que 1 triangle est tournée dans un sens et seconde fait face à la direction opposée.

Utilisez rasterizer sans culling à aspirer cet objet

+0

[rasterizer] (http://imgur.com/a/IJd4d) il semble être à cull_none. hmmm ... :( –

+0

J'ai réalisé le problème, il semble que tous les fichiers obj ne sont pas triangulaires, donc les sommets chargés sont beaucoup moins importants ce qui explique les vertices manquants des triangles –

+0

alors peut-être qu'ils sont stockés sous forme de bande triangulaire? 4 vertices et faire la bande triangle –