2014-01-08 5 views
2

Я создаю игру, в которой будут 2D-изображения внутри 3D-мира.Как преобразовать координаты мира в координаты экрана

Первоначально я начал с того, что не заботился о том, чтобы мои изображения были растянуты на квадрат, в то время как я узнал больше о том, как работает игровая механика ... но настало время, чтобы мои текстуры отображались в правильном соотношении и ... размере ,

Только боковое примечание, я играл с орфографическими левыми проекциями, но я заметил, что вы не можете делать 3D в этом ... (я думаю, это имеет смысл ... но я мог ошибаться, я пробовал это и когда Я повернул свой образ, он прошел все натянуто и weirdosss).

природа моей игры заключается в следующем:

enter image description here

В изображении написано -1,0 до +1,0 ... Я не суетился, если координаты:

  • = 0,0,0 верхнее-левое
  • внизу справа = 1920, 1200, 0

Но если это решение, то что угодно ... (игра в настоящее время не настроена так, что -1.0 и 1.0 слева и справа от экрана. Infact я не знаю, как я собираюсь сделать экран края границы (но это вопрос на другой день)


Вопрос:

Проблема, которую я имею что мое изображение для моего плеера (2d) - 128 x 64 пикселей. После умножения матрицы в мире (я думаю, что это именно так) вершины, которые я вкладываю в масштаб моей текстуры, чрезвычайно ... что имеет смысл, но выглядит грустно, и я не хочу просто бить массивную матрицу масштабирования в микс, потому что это будет сложно разобраться, как сделать текстуру 1: 1 на мои пиксели экрана (хотя, может быть, вы скажете мне, что это на самом деле, как вы это делаете, но вам нужно сделать умную формулу, чтобы определить, что такое масштабирование).

Но в принципе, я хочу вершины держать 1: размер 1 пиксель моего изображения, нерастянутого ...

Так что я полагаю, мне нужно, чтобы преобразовать мой мир COORDS к экранировать COORDS перед выводом моих текстур и вершины ??? Я не уверен, как это работает ...

В любом случае, здесь мои вершины .. Вы можете заметить, что я сделал:

struct VERTEX 
{ 
    float X, Y, Z; 
    //float R, G, B, A; 
    float NX, NY, NZ; 
    float U, V;   // texture coordinates 
}; 

const unsigned short SquareVertices::indices[ 6 ] = { 
    0, 1, 2, // side 1 
    2, 1, 3 
}; 

const VERTEX SquareVertices::vertices[ 4 ] = { 
     //{ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f }, // side 1 
     //{ 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f }, 
     //{ -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f }, 
     //{ 1.0f, 1.0f, 0.0f,  0.0f, 0.0f, -1.0f, 1.0f, 1.0f } 

    { -64.0f, -32.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f }, // side 1 
    { 64.0f, -32.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f }, 
    { -64.0f, 32.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f }, 
    { 64.0f, 64.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f } 
}; 

(128 пикселей/2 = 64), (64/2 = 32), потому что центр 0.0 ... но что мне нужно сделать, чтобы проекции, мировые трансдобификации и что не нужно, чтобы заставить миры экранировать?

Мои текущие установок выглядеть следующим образом:

// called 1st 
void Game::SetUpViewTransformations() 
{ 
    XMVECTOR vecCamPosition = XMVectorSet(0.0f, 0.0f, -20.0f, 0); 
    XMVECTOR vecCamLookAt = XMVectorSet(0, 0, 0, 0); 
    XMVECTOR vecCamUp = XMVectorSet(0, 1, 0, 0); 
    matView = XMMatrixLookAtLH(vecCamPosition, vecCamLookAt, vecCamUp); 
} 

// called 2nd 
void Game::SetUpMatProjection() 
{ 
    matProjection = XMMatrixPerspectiveFovLH(
     XMConvertToRadians(45),          // the field of view 
     windowWidth/windowHeight, // aspect ratio 
     1,               // the near view-plane 
     100);              // the far view-plan 
} 

и вот подлый взгляд на мое обновление и делают методы:

// called 3rd 
void Game::Update() 
{ 
    world->Update(); 
    worldRotation = XMMatrixRotationY(world->rotation); 

    player->Update(); 
    XMMATRIX matTranslate = XMMatrixTranslation(player->x, player->y, 0.0f); 
    //XMMATRIX matTranslate = XMMatrixTranslation(0.0f, 0.0f, 1.0f); 
    matWorld[ 0 ] = matTranslate; 
} 

// called 4th 
void Game::Render() 
{ 
    // set our new render target object as the active render target 
    d3dDeviceContext->OMSetRenderTargets(1, rendertarget.GetAddressOf(), zbuffer.Get()); 

    // clear the back buffer to a deep blue 
    float color[ 4 ] = { 0.0f, 0.2f, 0.4f, 1.0f }; 
    d3dDeviceContext->ClearRenderTargetView(rendertarget.Get(), color); 
    d3dDeviceContext->ClearDepthStencilView(zbuffer.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); // clear the depth buffer 

     CBUFFER cBuffer; 
     cBuffer.DiffuseVector = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f); 
     cBuffer.DiffuseColor = XMVectorSet(0.5f, 0.5f, 0.5f, 1.0f); 
     cBuffer.AmbientColor = XMVectorSet(0.2f, 0.2f, 0.2f, 1.0f); 
     //cBuffer.Final = worldRotation * matWorld[ 0 ] * matView * matProjection; 
     cBuffer.Final = worldRotation * matWorld[ 0 ] * matView * matProjection; 
     cBuffer.Rotation = XMMatrixRotationY(world->rotation); 

     // calculate the view transformation 
     SetUpViewTransformations(); 
     SetUpMatProjection(); 

      //matFinal[ 0 ] = matWorld[0] * matView * matProjection; 

      UINT stride = sizeof(VERTEX); 
      UINT offset = 0; 

       d3dDeviceContext->PSSetShaderResources(0, 1, player->texture.GetAddressOf()); // Set up texture 
       d3dDeviceContext->IASetVertexBuffers(0, 1, player->vertexbuffer.GetAddressOf(), &stride, &offset); // Set up vertex buffer 
       d3dDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // How the vertices be drawn 
       d3dDeviceContext->IASetIndexBuffer(player->indexbuffer.Get(), DXGI_FORMAT_R16_UINT, 0); // Set up index buffer 
       d3dDeviceContext->UpdateSubresource(constantbuffer.Get(), 0, 0, &cBuffer, 0, 0); // set the new values for the constant buffer 

       d3dDeviceContext->OMSetBlendState(blendstate.Get(), 0, 0xffffffff); // DONT FORGET IF YOU DISABLE THIS AND YOU WANT COLOUR, * BY Color.a!!! 
       d3dDeviceContext->DrawIndexed(ARRAYSIZE(player->indices), 0, 0); // draw 

    swapchain->Present(1, 0); 
} 

Просто уточнить, если я делаю свои вершины используйте 2 и 1, что соответствует моему изображению 128 x 64 .. Я получаю нормальное изображение размера .. и все же в 0,0,0 это не размер 1: 1 ... wadduuuppp buddyyyy

{ -2.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f }, // side 1 
    { 2.0f, -1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f }, 
    { -2.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f }, 
    { 2.0f, 2.0f, 0.0f,  0.0f, 0.0f, -1.0f, 1.0f, 1.0f } 

Желаемый результат 2 Teh макс:

enter image description here

Прохладный картина не так: D?

Комментарий помощь:

enter image description here

+0

Не контрпродуктивно визуализировать в 3D, а преобразовать его обратно, чтобы не было масштабирования? Не могли бы вы просто сделать его 2D в первую очередь? – BWG

+0

У меня есть 3D-вращения, идущие по 2-м символам ... Немного похоже на бумагу Марио :) (а также это только начало игры ...) ... На данный момент я установил Вершины 2.0f и 1.0f по отношению к 128/2 составляет 64 ... К сожалению, текстура по-прежнему масштабируется, как крыса, но это лучше, чем ничего. – Jimmyt1988

+1

Хм. Не могли бы вы опубликовать скриншот симптомов? Кроме того, вы можете повернуть с орфографической проекцией. Вся перспективная проекция делает меньше объектов меньше, что в данном случае не похоже на то, что вы хотите. – BWG

ответ

0

Я не familliar с непосредственным х, но, насколько я могу видеть вещи с вашим изображением, которое экранные координаты являются [-1 ... +1] на х и у. Таким образом, общая длина на обеих осях равна 2, а ваше изображение масштабируется раз 2. Попробуйте рассмотреть этот масштаб в матрице камеры.

Смежные вопросы