как преобразовать мировые координаты в экранные координаты

Я создаю игру, которая будет иметь двухмерные картинки в трехмерном мире.

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

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

Суть моей игры такова:

введите описание изображения здесь

На изображении написано от -1,0 до 1,0 … я не смущен, если координаты:

  • topleft = 0,0,0
  • внизу справа = 1920, 1200, 0

Но если это решение, тогда что угодно … (p.s игра в настоящее время не настроена так, что -1,0 и 1,0 слева и справа от экрана. На самом деле, я не уверен, как я собираюсь сделать экран граничит с границами (но это вопрос для другого дня)


Вопрос:

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

Но в основном Я хочу, чтобы вершины содержали размер моего изображения в 1: 1, нерастянутая …

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

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

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 х 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 макс.

введите описание изображения здесь

Классная картина не так ли: D?

Справка по комментариям:

введите описание изображения здесь

2

Решение

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector