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

时间:2015-01-24 07:22:04

标签: rotation scaling sdl-2

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

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

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

3 个答案:

答案 0 :(得分:2)

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

var appscope = function() {
    var that = this;

    function col(c) {
        var self = this;
        this.view = ko.observable(false);
        // *** Not subscribing here
    }
    var myModel = function(data) {
        var viewSub;                                        // ***
        var self = this;
        self.viewdata = ko.observableArray(data);
        self.target=ko.observable(null);
        var c = new col([]);                                // ***
        self.target(c);                                     // ***
        subScribeCol(c);                                    // ***
        self.target.subscribe(function(newCol) {            // ***
            viewSub.dispose();                              // ***
            subcribeCol();                                  // ***
        });                                                 // ***
        self.updateCol = function() {
            console.log("updatecol called")
        };
        function subscribeCol(c) {
            viewSub = c.view.subscribe(function(newValue) { // ***
                self.updateCol();                           // ***
            });                                             // ***
        }
    };
    return {
        myModel: myModel
    };
}();
(function(appscope) {
    var vm = new appscope.myModel([mydata]);
    ko.applyBindings(vm);
})(appscope);

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

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

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

罗尼

答案 1 :(得分:2)

这个问题是四年前提出的,但我仍然面临这个问题。因此,如果有人经过,这是我的答案。

Lignum关于SDL版本控制的假设是错误的。实际上,我正在使用SDL 2.0.9,这个问题仍然很重要。正如Ronnie所指出的,只有在不保留长宽比的情况下才会出现此问题(在Lignum代码示例中,当沿x和y轴的比例因子相等时,长宽比得以保留)。

恐怕唯一的解决方案是避免SDL_RenderSetScale并在SDL_RenderCopyEx中手动缩放目标矩形的坐标。

答案 2 :(得分: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这一事实,该功能在转动时应该牢记这一点。