VoidAccess

Members
  • Content count

    5
  • Joined

  • Last visited

Community Reputation

109 Neutral

About VoidAccess

  • Rank
    Newbie
  1. Picking Intersection Vertices

    Finally figured it out. Was mistaking RayOrgin for point in triangle clicked in its local space, but realized that no matter where I clicked the same spot would be selected. So I used the BaryCentric coordinates u,v to find highest influence, which results in the vertice that is the closest on the face to be selected. **This is from Frank D Luna directX book modified for point selection.   void PickingApp::pick(int sx, int sy) { D3DXMATRIX P = GetCamera().proj(); // Compute picking ray in view space. float vx = (+2.0f*sx/mClientWidth - 1.0f)/P(0,0); float vy = (-2.0f*sy/mClientHeight + 1.0f)/P(1,1); D3DXVECTOR3 rayOrigin(0.0f, 0.0f, 0.0f); D3DXVECTOR3 rayDir(vx, vy, 1.0f); // Tranform to world space. D3DXMATRIX V = GetCamera().view(); D3DXMATRIX inverseV; D3DXMatrixInverse(&inverseV, 0, &V); D3DXVec3TransformCoord(&rayOrigin, &rayOrigin, &inverseV); D3DXVec3TransformNormal(&rayDir, &rayDir, &inverseV); // Transform to the mesh's local space. D3DXMATRIX inverseW; D3DXMatrixInverse(&inverseW, 0, &mBaseWorld); D3DXVec3TransformCoord(&rayOrigin, &rayOrigin, &inverseW); D3DXVec3TransformNormal(&rayDir, &rayDir, &inverseW); ID3DX10Mesh* d3dxmesh = mBaseMesh.d3dxMesh(); UINT hitCount; float u,v,t; ID3D10Blob* allHits; d3dxmesh->Intersect(&rayOrigin, &rayDir, &hitCount, &mPickedTriangle, &u, &v, &t, &allHits); float v0 = 1 - u - v; float v1 = u; float v2 = v; if(v0 > v1 && v0 > v2) inf = mPickedTriangle * 3; if(v1 > v0 && v1 > v2) inf = mPickedTriangle * 3 + 1; if(v2 > v0 && v2 > v1) inf = mPickedTriangle * 3 + 2; ReleaseCOM(allHits); } drawScene(){ ..... ...... if( mPickedTriangle != -1 )     {         ID3DX10Mesh* d3dxmesh = mBaseMesh.d3dxMesh();         ID3DX10MeshBuffer* vb = 0;         ID3DX10MeshBuffer* ib = 0;         HR(d3dxmesh->GetVertexBuffer(0, &vb));         HR(d3dxmesh->GetIndexBuffer(&ib));         // Get the indices of the picked triangle.         DWORD* indices = 0;         SIZE_T size;         HR(ib->Map((void**)&indices, &size));                  DWORD i0 = indices[inf];              HR(ib->Unmap());         // Get the vertices of the picked triangle and copy them into our VB.         MeshVertex* vertices = 0;         HR(vb->Map((void**)&vertices, &size));         D3DXVECTOR3* triVerts = 0;                  HR(mPickedTriVB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&triVerts));                  triVerts[0] = vertices[i0].pos;                  mPickedTriVB->Unmap();         HR(vb->Unmap());         ReleaseCOM(vb);         ReleaseCOM(ib);         // Render the picked triangle specially to distinguish it         // from the other triangles.         md3dDevice->IASetInputLayout(InputLayout::Pos);         md3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_POINTLIST);         UINT stride = sizeof(D3DXVECTOR3);         UINT offset = 0;         md3dDevice->IASetVertexBuffers(0, 1, &mPickedTriVB, &stride, &offset);         D3D10_TECHNIQUE_DESC techDesc;         mPickedTech->GetDesc( &techDesc );         D3DXMATRIX W = mBaseWorld;         D3DXMATRIX V = GetCamera().view();         D3DXMATRIX P = GetCamera().proj();         D3DXMATRIX WVP = W*V*P;         mfxPickedWVPVar->SetMatrix((float*)&WVP);         for(UINT i = 0; i < techDesc.Passes; ++i)         {             ID3D10EffectPass* pass = mPickedTech->GetPassByIndex(i);             pass->Apply(0);             md3dDevice->Draw(1, 0);         }     } }     .
  2. Picking Intersection Vertices

    Still having issues getting this to work, I tried to get the shortest distance from the mouse click but its not working right. Just want the closest vertex to be selected from click on the triangle   void PickingApp::pick(int sx, int sy) { D3DXMATRIX P = GetCamera().proj(); // Compute picking ray in view space. float vx = (+2.0f*sx/mClientWidth - 1.0f)/P(0,0); float vy = (-2.0f*sy/mClientHeight + 1.0f)/P(1,1); D3DXVECTOR3 rayOrigin(0.0f, 0.0f, 0.0f); D3DXVECTOR3 rayDir(vx, vy, 1.0f); // Tranform to world space. D3DXMATRIX V = GetCamera().view(); D3DXMATRIX inverseV; D3DXMatrixInverse(&inverseV, 0, &V); D3DXVec3TransformCoord(&rayOrigin, &rayOrigin, &inverseV); D3DXVec3TransformNormal(&rayDir, &rayDir, &inverseV); // Transform to the mesh's local space. D3DXMATRIX inverseW; D3DXMatrixInverse(&inverseW, 0, &mBaseWorld); D3DXVec3TransformCoord(&rayOrigin, &rayOrigin, &inverseW); D3DXVec3TransformNormal(&rayDir, &rayDir, &inverseW); ID3DX10Mesh* d3dxmesh = mBaseMesh.d3dxMesh(); MouseCoord = rayOrigin; UINT hitCount; float u,v,t; ID3D10Blob* allHits; d3dxmesh->Intersect(&rayOrigin, &rayDir, &hitCount, &mPickedTriangle, &u, &v, &t, &allHits); ReleaseCOM(allHits); } drawScene(){ ... ... DWORD i0 = indices[mPickedTriangle*3+0]; DWORD i1 = indices[mPickedTriangle*3+1]; DWORD i2 = indices[mPickedTriangle*3+2]; HR(ib->Unmap()); // Get the vertices of the picked triangle and copy them into our VB. MeshVertex* vertices = 0; HR(vb->Map((void**)&vertices, &size)); D3DXVECTOR3* triVerts = 0; HR(mPickedTriVB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&triVerts)); float v1 = sqrt((pow(vertices[i0].pos.x - MouseCoord.x ,2) + pow(vertices[i0].pos.y - MouseCoord.y,2) + pow(vertices[i0].pos.z - MouseCoord.z,2))); float v2 = sqrt((pow(vertices[i1].pos.x - MouseCoord.x ,2) + pow(vertices[i1].pos.y - MouseCoord.y,2) + pow(vertices[i1].pos.z - MouseCoord.z,2))); float v3 = sqrt((pow(vertices[i2].pos.x - MouseCoord.x ,2) + pow(vertices[i2].pos.y - MouseCoord.y,2) + pow(vertices[i2].pos.z - MouseCoord.z,2))); if(v1 < v2 && v1 < v3) triVerts[0] = vertices[i0].pos; if(v2 < v1 && v2 < v3) triVerts[0] = vertices[i1].pos; if(v3 < v1 && v3 < v2) triVerts[0] = vertices[i2].pos; ...}
  3. I am trying to grab the closest vertex to my mouse click using picking. I understand that the &t represents distance, but how can I get the distance of each vertex from the mouse click after converting it all to the correct worlds I am able to select the faces of the mesh, but am struggling on selecting the closest vertex.   UINT hitCount; float u,v,t; ID3D10Blob* allHits; d3dxmesh->Intersect(&rayOrigin, &rayDir, &hitCount, &PickedTriangle, &u, &v, &t, &allHits); I know the vertex is going to be vertex[indices[PickedTriangle*3+0]] ..etc. So how can I get the distance from the click for each vertex in the triangle selected.
  4. I have set up this alphamap terrain that does multiple textures which works correctly except the textures seem off. The more you zoom out the more it the textures seem repeated. I believe this is because of the uv coordinates, looking for help on how to fix it as I am lost. Image of the problem: http://s13.postimg.org/dgh4awilj/image.png   float incrementSize, tu2Left, tu2Right, tv2Top, tv2Bottom;     int k = 0;     float texUIndex = 0;     float texVIndex = 0;     incrementSize = 1.0f / 255.0f;     tu2Left = 0.0f;     tu2Right = incrementSize;     tv2Bottom = 1.0f;     tv2Top = 1.0f - incrementSize;     for(DWORD i = 0; i < rows-1; i++)     {         for(DWORD j = 0; j < cols-1; j++)         {             indices[k]   = i*cols+j;             vertices[i*cols+j].texCoord = D3DXVECTOR2(texUIndex , texVIndex + 1.0f);             vertices[i*cols+j].texCoord2 = D3DXVECTOR2(tu2Left, tv2Bottom);             indices[k+1] = i*cols+j+1;             vertices[i*cols+j+1].texCoord = D3DXVECTOR2(texUIndex + 1.0f, texVIndex + 1.0f);             vertices[i*cols+j+1].texCoord2 = D3DXVECTOR2(tu2Right, tv2Bottom);             indices[k+2] = (i+1)*cols+j;             vertices[(i+1)*cols+j].texCoord = D3DXVECTOR2(texUIndex + 0.0f, texVIndex + 0.0f);             vertices[(i+1)*cols+j].texCoord2 = D3DXVECTOR2( tu2Left, tv2Top);             indices[k+3] = (i+1)*cols+j;             vertices[(i+1)*cols+j].texCoord = D3DXVECTOR2(texUIndex + 0.0f, texVIndex + 0.0f);             vertices[(i+1)*cols+j].texCoord2 = D3DXVECTOR2(tu2Left, tv2Top);             indices[k+4] = i*cols+j+1;             vertices[i*cols+j+1].texCoord = D3DXVECTOR2(texUIndex + 1.0f, texVIndex + 1.0f);             vertices[i*cols+j+1].texCoord2 = D3DXVECTOR2(tu2Right, tv2Bottom);             indices[k+5] = (i+1)*cols+j+1;             vertices[(i+1)*cols+j+1].texCoord = D3DXVECTOR2(texUIndex + 1.0f, texVIndex + 0.0f);             vertices[(i+1)*cols+j+1].texCoord2 = D3DXVECTOR2(tu2Right,tv2Top);             k += 6; // next quad             texUIndex++;             tu2Left += incrementSize;             tu2Right += incrementSize;         }         texUIndex = 0;         texVIndex++;         tu2Left = 0.0f;         tu2Right = incrementSize;         // Increment the tv texture coords for the alpha map.         tv2Top -= incrementSize;         tv2Bottom -= incrementSize;     }  
  5. bool InitScene() {     ///////////////**************new**************////////////////////     if(!LoadObjModel(d3d11Device, L"dragonbone_male.obj", groundModel, material, textureMgr, true, true))         return false;     ///////////////**************new**************////////////////////     if(!LoadObjModel(d3d11Device, L"Female.obj", groundModel1, material1, textureMgr1, true, true))         return false;     if(!LoadObjModel(d3d11Device, L"ground.obj", groundModel2, material2, textureMgr2, true, true))         return false;     // Compile Shaders from shader file     hr = D3DX11CompileFromFile(L"Effects.fx", 0, 0, "VS", "vs_4_0", 0, 0, 0, &VS_Buffer, 0, 0);     hr = D3DX11CompileFromFile(L"Effects.fx", 0, 0, "PS", "ps_4_0", 0, 0, 0, &PS_Buffer, 0, 0);     // Create the Shader Objects     hr = d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), NULL, &VS);     hr = d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS);     // Set Vertex and Pixel Shaders     d3d11DevCon->VSSetShader(VS, 0, 0);     d3d11DevCon->PSSetShader(PS, 0, 0);     light.pos = XMFLOAT3(0.0f, 7.0f, 0.0f);     light.dir = XMFLOAT3(0.5f, 0.75f, -0.5f);     light.range = 1000.0f;     light.cone = 12.0f;     light.att = XMFLOAT3(0.4f, 0.02f, 0.000f);     light.ambient = XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f);     light.diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);     // Create the Input Layout     hr = d3d11Device->CreateInputLayout( layout, numElements, VS_Buffer->GetBufferPointer(),         VS_Buffer->GetBufferSize(), &vertLayout );     // Set the Input Layout     d3d11DevCon->IASetInputLayout( vertLayout );     // Set Primitive Topology     d3d11DevCon->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );     // Create the Viewport     D3D11_VIEWPORT viewport;     ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));     viewport.TopLeftX = 0;     viewport.TopLeftY = 0;     viewport.Width = Width;     viewport.Height = Height;     viewport.MinDepth = 0.0f;     viewport.MaxDepth = 1.0f;     // Set the Viewport     d3d11DevCon->RSSetViewports(1, &viewport);     // Create the buffer to send to the cbuffer in effect file     D3D11_BUFFER_DESC cbbd;     ZeroMemory(&cbbd, sizeof(D3D11_BUFFER_DESC));     cbbd.Usage = D3D11_USAGE_DEFAULT;     cbbd.ByteWidth = sizeof(cbPerObject);     cbbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;     cbbd.CPUAccessFlags = 0;     cbbd.MiscFlags = 0;     hr = d3d11Device->CreateBuffer(&cbbd, NULL, &cbPerObjectBuffer);     // Create the buffer to send to the cbuffer per frame in effect file     ZeroMemory(&cbbd, sizeof(D3D11_BUFFER_DESC));     cbbd.Usage = D3D11_USAGE_DEFAULT;     cbbd.ByteWidth = sizeof(cbPerFrame);     cbbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;     cbbd.CPUAccessFlags = 0;     cbbd.MiscFlags = 0;     hr = d3d11Device->CreateBuffer(&cbbd, NULL, &cbPerFrameBuffer);     // Camera information     camPosition = XMVectorSet( 0.0f, 5.0f, -8.0f, 0.0f );     camTarget = XMVectorSet( 0.0f, 0.5f, 0.0f, 0.0f );     camUp = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );     // Set the View matrix     camView = XMMatrixLookAtLH( camPosition, camTarget, camUp );     // Set the Projection matrix     camProjection = XMMatrixPerspectiveFovLH( 0.4f*3.14f, Width/Height, 1.0f, 1000.0f);     // Describe the Sample State     D3D11_SAMPLER_DESC sampDesc;     ZeroMemory( &sampDesc, sizeof(sampDesc) );     sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;     sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;     sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;         sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;     sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;     sampDesc.MinLOD = 0;     sampDesc.MaxLOD = D3D11_FLOAT32_MAX;     //Create the Sample State     hr = d3d11Device->CreateSamplerState( &sampDesc, &LinearSamplerState );     D3D11_RASTERIZER_DESC cmdesc;     ZeroMemory(&cmdesc, sizeof(D3D11_RASTERIZER_DESC));     cmdesc.FillMode = D3D11_FILL_SOLID;     cmdesc.CullMode = D3D11_CULL_BACK;     cmdesc.FrontCounterClockwise = true;     hr = d3d11Device->CreateRasterizerState(&cmdesc, &CCWcullMode);     cmdesc.FrontCounterClockwise = false;     hr = d3d11Device->CreateRasterizerState(&cmdesc, &CWcullMode);     cmdesc.CullMode = D3D11_CULL_NONE;     //cmdesc.FillMode = D3D11_FILL_WIREFRAME;     hr = d3d11Device->CreateRasterizerState(&cmdesc, &RSCullNone);     D3D11_BLEND_DESC blendDesc;     ZeroMemory( &blendDesc, sizeof(blendDesc) );     D3D11_RENDER_TARGET_BLEND_DESC rtbd;     ZeroMemory( &rtbd, sizeof(rtbd) );     rtbd.BlendEnable             = true;     rtbd.SrcBlend                = D3D11_BLEND_INV_SRC_ALPHA;     rtbd.DestBlend               = D3D11_BLEND_SRC_ALPHA;     rtbd.BlendOp                 = D3D11_BLEND_OP_ADD;     rtbd.SrcBlendAlpha           = D3D11_BLEND_INV_SRC_ALPHA;     rtbd.DestBlendAlpha          = D3D11_BLEND_SRC_ALPHA;     rtbd.BlendOpAlpha            = D3D11_BLEND_OP_ADD;     rtbd.RenderTargetWriteMask   = D3D10_COLOR_WRITE_ENABLE_ALL;     blendDesc.AlphaToCoverageEnable = false;     blendDesc.RenderTarget[0] = rtbd;     d3d11Device->CreateBlendState(&blendDesc, &Transparency);     return true; } void UpdateScene(double time) {     //the loaded models world space     groundModel.World = XMMatrixIdentity();     groundModel1.World = XMMatrixIdentity();     groundModel2.World = XMMatrixIdentity();     Rotation = XMMatrixRotationY(3.14f);     Scale = XMMatrixScaling( 1.0f, 1.0f, 1.0f );     Translation = XMMatrixTranslation( 0.0f, 0.0f, 0.0f );     groundModel.World = Rotation * Scale * Translation;     groundModel1.World = Rotation * Scale * Translation;     groundModel2.World = Rotation * Scale * Translation; } void DrawObject(ObjModel &groundModels,std::vector<SurfaceMaterial> &material,TextureManager &textureMgr){     for(int i = 0; i < groundModels.Subsets; ++i)     {            // Only draw the NON-transparent parts of the model.         if(!material1[groundModels.SubsetMaterialID[i]].IsTransparent)                     {             cbPerObj.difColor = material[groundModels.SubsetMaterialID[i]].Diffuse;      // Let shader know which color to draw the model                                                                                         // (if no diffuse texture we defined)             cbPerObj.hasTexture = material[groundModels.SubsetMaterialID[i]].HasDiffTexture; // Let shader know if we need to use a texture             cbPerObj.hasNormMap = material[groundModels.SubsetMaterialID[i]].HasNormMap; // Let shader know if we need to do normal mapping             d3d11DevCon->UpdateSubresource( cbPerObjectBuffer, 0, NULL, &cbPerObj, 0, 0 );             d3d11DevCon->VSSetConstantBuffers( 0, 1, &cbPerObjectBuffer );             d3d11DevCon->PSSetConstantBuffers( 1, 1, &cbPerObjectBuffer );             // If this subset has a diffuse texture, send it to the pixel shader             if(material[groundModels.SubsetMaterialID[i]].HasDiffTexture)                     d3d11DevCon->PSSetShaderResources( 0, 1, &textureMgr.TextureList[material[groundModels.SubsetMaterialID[i]].DiffuseTextureID] );             // If this subset has a normal (bump) map, send it to the pixel shader             if(material[groundModels.SubsetMaterialID[i]].HasNormMap)                     d3d11DevCon->PSSetShaderResources( 1, 1, &textureMgr.TextureList[material[groundModels.SubsetMaterialID[i]].NormMapTextureID] );                  // Draw the NON-transparent stuff             int indexStart = groundModels.SubsetIndexStart[i];             int indexDrawAmount =  groundModels.SubsetIndexStart[i+1] - indexStart;             d3d11DevCon->DrawIndexed( indexDrawAmount, indexStart, 0 );              }     } } void DrawTransObject(ObjModel &groundModel,std::vector<SurfaceMaterial> &material,TextureManager &textureMgr){     for(int i = 0; i < groundModel.Subsets; ++i)     {            // Only draw the TRANSPARENT parts of the model now.         if(material[groundModel.SubsetMaterialID[i]].IsTransparent)                              {             cbPerObj.difColor = material[groundModel.SubsetMaterialID[i]].Diffuse;      // Let shader know which color to draw the model                                                                                         // (if no diffuse texture we defined)             cbPerObj.hasTexture = material[groundModel.SubsetMaterialID[i]].HasDiffTexture; // Let shader know if we need to use a texture             cbPerObj.hasNormMap = material[groundModel.SubsetMaterialID[i]].HasNormMap; // Let shader know if we need to do normal mapping             d3d11DevCon->UpdateSubresource( cbPerObjectBuffer, 0, NULL, &cbPerObj, 0, 0 );             d3d11DevCon->VSSetConstantBuffers( 0, 1, &cbPerObjectBuffer );             d3d11DevCon->PSSetConstantBuffers( 1, 1, &cbPerObjectBuffer );             // If this subset has a diffuse texture, send it to the pixel shader             if(material[groundModel.SubsetMaterialID[i]].HasDiffTexture)                                     d3d11DevCon->PSSetShaderResources( 0, 1, &textureMgr.TextureList[material[groundModel.SubsetMaterialID[i]].DiffuseTextureID] );             // If this subset has a normal (bump) map, send it to the pixel shader             if(material[groundModel.SubsetMaterialID[i]].HasNormMap)                                     d3d11DevCon->PSSetShaderResources( 1, 1, &textureMgr.TextureList[material[groundModel.SubsetMaterialID[i]].NormMapTextureID] );                  // The transparent parts are now drawn             int indexStart = groundModel.SubsetIndexStart[i];             int indexDrawAmount =  groundModel.SubsetIndexStart[i+1] - indexStart;             d3d11DevCon->DrawIndexed( indexDrawAmount, indexStart, 0 );              }     } } void DrawScene() {     // Clear our render target and depth/stencil view     float bgColor[4] = { 0.1f, 0.1f, 0.1f, 1.0f };     d3d11DevCon->ClearRenderTargetView(renderTargetView, bgColor);       d3d11DevCon->ClearDepthStencilView(depthStencilView, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0);     // Update the cbPerFrame     constbuffPerFrame.light = light;     d3d11DevCon->UpdateSubresource( cbPerFrameBuffer, 0, NULL, &constbuffPerFrame, 0, 0 );     d3d11DevCon->PSSetConstantBuffers(0, 1, &cbPerFrameBuffer);     // Set our Render Target     d3d11DevCon->OMSetRenderTargets( 1, &renderTargetView, depthStencilView );     // Set the default blend state (no blending) for opaque objects     d3d11DevCon->OMSetBlendState(0, 0, 0xffffffff);     // Set Vertex and Pixel Shaders     d3d11DevCon->VSSetShader(VS, 0, 0);     d3d11DevCon->PSSetShader(PS, 0, 0);     d3d11DevCon->PSSetSamplers( 0, 1, &LinearSamplerState );     d3d11DevCon->RSSetState(RSCullNone);     /////Draw our model's NON-transparent subsets/////     // Only set the vert and index buffer once per model     // Set the grounds index buffer     d3d11DevCon->IASetIndexBuffer( groundModel1.IndexBuff, DXGI_FORMAT_R32_UINT, 0);     // Set the grounds vertex buffer     d3d11DevCon->IASetVertexBuffers( 0, 1, &groundModel1.VertBuff, &stride, &offset );          // Set the WVP matrix and send it to the constant buffer in effect file     // This also only needs to be set once per model     WVP = groundModel1.World * camView * camProjection;     cbPerObj.WVP = XMMatrixTranspose(WVP);       cbPerObj.World = XMMatrixTranspose(groundModel1.World);     //WVP = groundModel1.World * camView * camProjection;    // cbPerObj.WVP = XMMatrixTranspose(WVP);      // cbPerObj.World = XMMatrixTranspose(groundModel1.World);     DrawObject(groundModel1,material1,textureMgr1);     Translation = XMMatrixTranslation( 0.0f, -5.0f, 0.0f );     Scale = XMMatrixScaling( .1f, .1f, .1f );     WVP = groundModel.World * (Scale * Translation  ) * camView * camProjection;     cbPerObj.WVP = XMMatrixTranspose(WVP);       cbPerObj.World = XMMatrixTranspose(groundModel.World);     d3d11DevCon->IASetIndexBuffer( groundModel.IndexBuff, DXGI_FORMAT_R32_UINT, 0);     d3d11DevCon->IASetVertexBuffers( 0, 1, &groundModel.VertBuff, &stride, &offset );     DrawObject(groundModel,material,textureMgr);     DrawTransObject(groundModel,material,textureMgr);     d3d11DevCon->IASetIndexBuffer( groundModel2.IndexBuff, DXGI_FORMAT_R32_UINT, 0);     d3d11DevCon->IASetVertexBuffers( 0, 1, &groundModel2.VertBuff, &stride, &offset );     DrawObject(groundModel2,material2,textureMgr2);     //Present the backbuffer to the screen     SwapChain->Present(0, 0); } I have 3 obj files loading into one location and I was trying to figure out how I can load these objects at specific points in a x,y,z location point without using Translation.