Мы закончили делать это преобразование:
(ВАЖНО: здесь мы также инвертировали ось Y)!
Magnum::Vector2 convertHomogenousCoordsToSDL(SDL_Window* window, const Matrix3& MVP, Magnum::Vector2 vertex) {
// get vertex in homogenous coords
vertex = MVP.transformPoint(vertex);
// now convert from homogenous coords 0,0 center and y-axis up to SDL screen coords
Vector2i winSize;
SDL_GetWindowSize(window, &winSize.x(), &winSize.y());
auto winSizeHalf = Vector2(winSize) / 2.f;
auto matrixChangeCoords = Matrix3::translation(winSizeHalf) * Matrix3::scaling({ winSizeHalf.x(), -winSizeHalf.y() });
vertex = matrixChangeCoords.transformPoint(vertex);
return vertex;
}
Теперь мы можем преобразовать любую точку в нашем пространстве в пространство окна SDL, например это:
const auto modelMatrix = (Matrix3::translation(tr.position) * Matrix3::rotation(Magnum::Deg(tr.rotation))) * Matrix3::scaling(tr.scale);
const auto mvpMatrix = viewProjectionMatrix * modelMatrix;
SDL_SetRenderDrawColor(renderer, 0xFF, 0x0, 0x0, 0xFF);
const auto vertexPosition = helpers::convertHomogenousCoordsToSDL(window, mvpMatrix, { 0,0 });
SDL_RenderDrawPointF(renderer, vertexPosition.x(), vertexPosition.y());
Я не приму этот ответ, чтобы посмотреть, можно ли здесь что-то улучшить!
(РЕДАКТИРОВАТЬ). комментарии
Magnum::Vector2i framebufferSize(SDL_Window* window) {
Vector2i winSize;
SDL_GetWindowSize(window, &winSize.x(), &winSize.y());
return winSize;
}
Magnum::Matrix3 projectionMatrixToSDLSpace(SDL_Window* window, const Vector2& cameraSize) {
const Vector2 winSizeHalf = Vector2(framebufferSize(window)) / 2.f;
return Matrix3::translation(winSizeHalf) * Matrix3::scaling({ winSizeHalf.x(), -winSizeHalf.y() }) * Magnum::Matrix3::projection(cameraSize);
}