Я создаю игру, в которой будут 2D-изображения внутри 3D-мира.Как преобразовать координаты мира в координаты экрана
Первоначально я начал с того, что не заботился о том, чтобы мои изображения были растянуты на квадрат, в то время как я узнал больше о том, как работает игровая механика ... но настало время, чтобы мои текстуры отображались в правильном соотношении и ... размере ,
Только боковое примечание, я играл с орфографическими левыми проекциями, но я заметил, что вы не можете делать 3D в этом ... (я думаю, это имеет смысл ... но я мог ошибаться, я пробовал это и когда Я повернул свой образ, он прошел все натянуто и weirdosss).
природа моей игры заключается в следующем:
В изображении написано -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 макс:
Прохладный картина не так: D?
Комментарий помощь:
Не контрпродуктивно визуализировать в 3D, а преобразовать его обратно, чтобы не было масштабирования? Не могли бы вы просто сделать его 2D в первую очередь? – BWG
У меня есть 3D-вращения, идущие по 2-м символам ... Немного похоже на бумагу Марио :) (а также это только начало игры ...) ... На данный момент я установил Вершины 2.0f и 1.0f по отношению к 128/2 составляет 64 ... К сожалению, текстура по-прежнему масштабируется, как крыса, но это лучше, чем ничего. – Jimmyt1988
Хм. Не могли бы вы опубликовать скриншот симптомов? Кроме того, вы можете повернуть с орфографической проекцией. Вся перспективная проекция делает меньше объектов меньше, что в данном случае не похоже на то, что вы хотите. – BWG