SDL_RenderSetScale错误地应用于SDL2中的旋转位图(2.0.3)

问题描述 投票:4回答:3

SDL_RenderSetScale将相应地缩放坐标,直到与SDL_RenderCopyEx一起使用旋转。 SDL似乎应用缩放预旋转​​,因此旋转纹理的宽高比是错误的。例如,旋转90度的纹理将使x和y缩放反转。我试图计算一个公式来抵消这种缩放,但结果不是很好。

我还注意到,使用SDL_RenderDrawLine绘制的直线根据缩放绘制了不同的厚​​度,但仍然按照每个屏幕像素绘制对角线。

有没有其他人有这个问题?还有另一种方法来获得理想的结果吗?有没有计划修复SDL2所以缩放效果始终如一?

rotation scaling sdl-2
3个回答
2
投票

唉,不是。使用不同的宽度和高度缩放因子,问题变得明显。尝试:

SDL_RenderSetScale(renderer, 4.0f, 2.0f);
SDL_Rect rect = { 16, 16, 128, 128 };
SDL_RenderCopyEx(renderer, tex, NULL, &rect, 90.0, NULL, SDL_FLIP_NONE);

......你会看到问题所在。

您可能希望原始的方形纹理现在是一个宽矩形,但它是一个高大的矩形。

在旋转之前应用缩放 - 而我个人希望在旋转之后应用缩放,因为SDL_RenderSetScale()的整个点似乎是允许选择独立坐标系,但是如果两者的宽高比如此坐标系不一样,任何旋转的纹理都会显示错误。

罗尼


2
投票

这问题已在四年前提出,但我仍然面临这个问题。所以,如果有人过来,这是我的答案。

Lignum关于SDL版本控制的假设是错误的。实际上,我正在使用SDL 2.0.9,这个问题仍然有用。正如Ronnie指出的那样,只有当未保留纵横比时才会出现此问题(在Lignum代码示例中,纵横比保持不变,因为沿x和y轴的比例因子相等)。

我担心的唯一解决方案是简单地避免使用SDL_RenderSetScale并在SDL_RenderCopyEx中手动缩放目标矩形的坐标。


1
投票

使用此代码,我担心我无法重现此问题:

SDL_RenderSetScale(renderer, 4.0f, 4.0f);

SDL_Rect rect = { 16, 16, 128, 128 };
SDL_RenderCopyEx(renderer, tex, NULL, &rect, 90.0, NULL, SDL_FLIP_NONE);

这完全没问题,图像旋转了90°,缩放了4倍。由于这是在我的回复前2年询问,我认为这可能是SDL 2.0.3中的一个错误,因为我是使用SDL 2.0.5。

无论如何,这应该发生在最新版本上,并非所有的希望都会丢失。使用SDL_RenderSetScale的另一种方法是简单地将目标矩形的宽度和高度乘以所需的比例,根据我的经验,这也适用。考虑到你将矩形直接传递到SDL_RenderCopyEx这一事实,该功能在转动时应该牢记这一点。

© www.soinside.com 2019 - 2024. All rights reserved.