渲染时如何使SDL2 0,0定位窗口的中心?

帧缓冲区

我们正在“移植/更新”一个使用SDL进行渲染的旧项目,并且我们正在更改代码以使用矩阵转换等。

主要问题是SDL坐标系位于左上角(0,0),我们希望它成为窗口的中心。

我们使用它来渲染:

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);
Magnum::Vector2i winSize;
SDL_GetWindowSize(window, &winSize.x(), &winSize.y());
SDL_RenderDrawPointF(renderer, mvpMatrix.translation().x() + (winSize.x() /2), mvpMatrix.translation().y() + (winSize.y() /2));

这是我们尝试过的并且似乎可以“起作用”的方法,因为当我们在mvpMatrix.translation()中具有正确的世界位置时,我们使用(winSize / 2)偏移了该位置,以使SDL可以将其呈现到屏幕的中心。

我们对该解决方案不满意,我们不确定该解决方案是否适用于所有情况。还有另一种方法可以使它起作用吗?修改投影矩阵?

帧缓冲区

我们结束了这一转换:

(重要提示:我们也在这里反转了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());

我不会接受这个答案,看看这里是否可以改善!

(编辑)封装它并在ProjectionMatrix中设置转换,如@keltar在评论中所述

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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SDL2:调整窗口大小时如何保持宽高比

来自分类Dev

如何在MacOS上使用SDL2创建窗口

来自分类Dev

SDL2:如何引发窗口(在呼叫终端的顶部)

来自分类Dev

如何通过触摸获取imageview的中心坐标(x,y)(0,0)

来自分类Dev

如何设置中心和半径 = 1 的默认值 Point(0,0)?

来自分类Dev

SDL2 窗口是透明的

来自分类Dev

如何保持窗口打开:ShellExecuteW(0,0,“ powershell.exe”,“ ..”,“ ..”,SW_SHOW)?

来自分类Dev

如何保持窗口打开:ShellExecuteW(0,0,“ powershell.exe”,“ ..”,“ ..”,SW_SHOW)?

来自分类Dev

SDL2缺少窗口栏的窗口

来自分类Dev

如何使用python生成均匀分布在以(0,0)为中心的40 * 40矩形区域上的随机点?

来自分类Dev

调整SDL2窗口大小?

来自分类Dev

更改SDL2窗口的背景?

来自分类Dev

调整SDL2窗口的大小?

来自分类Dev

SDL2多窗口焦点

来自分类Dev

SDL2中的全局窗口

来自分类Dev

SDL2窗口不显示

来自分类Dev

SDL2 OpenGL 窗口立即关闭

来自分类Dev

无法从窗口获取 SDL2 事件

来自分类Dev

初始化bgfx时遇到问题(使用sdl2窗口)

来自分类Dev

尝试打开SDL2窗口时,与D-Bus相关的运行时崩溃

来自分类Dev

如何从(0,0)坐标移动面板

来自分类Dev

将SKSpriteNode定位在0,0?

来自分类Dev

尝试渲染SDL_Texture时出现C ++ SDL2错误:无效的纹理

来自分类Dev

尝试渲染SDL_Texture时出现C ++ SDL2错误:无效的纹理

来自分类Dev

SDL2窗口大小大于应有的大小

来自分类Dev

SDL2窗口在调整大小时变黑

来自分类Dev

SDL2调整窗口大小+鼠标位置

来自分类Dev

带有SDL2和Lisp的多个图形窗口?

来自分类Dev

在GHCI中创建一个SDL2窗口

Related 相关文章

热门标签

归档