我有一个Texture类,它允许我加载图像并渲染它们。 它具有以下属性:
private:
SDL_Texture *m_texture; ///The actual texture
int m_width; ///Its width
int m_height; ///Its height
我想创建一种以角度旋转纹理的方法。这就是我所做的:
void Texture::rotation( SDL_Renderer *renderer, float angle )
{
//Target texture to render to
SDL_Texture *target = SDL_CreateTexture( renderer, SDL_PIXELFORMAT_RGBA4444, SDL_TEXTUREACCESS_TARGET, m_width, m_height );
//Set the target texture for rendering
SDL_SetRenderTarget( renderer, target );
//Render m_texture to the target texture with an angle
SDL_RenderCopyEx( renderer, m_texture, NULL, NULL, angle, NULL, SDL_FLIP_NONE );
//Detach the target texture
SDL_SetRenderTarget( renderer, NULL );
//Save texture
SDL_DestroyTexture( m_texture );
m_texture = target;
}
然而,它并不常用:
我不能简单地在渲染时旋转纹理,原因很多,例如碰撞检测和效率。那么,我该怎么做呢?
答案 0 :(得分:2)
至于1),你需要在源上设置alpha混合,在目标纹理上设置(IIRC)。
至于2),考虑源矩形的中心点是原点和四个指向四个顶点的向量。这四个点总是距离中心更远的点,所以如果你确保它们旋转后它们在纹理内,你就是好的。您可以使用以下公式围绕z轴旋转矢量角度a(以弧度表示):
x' = cos(a) * x - sin(a) * y
y' = sin(a) * x + cos(a) * y
其中(x; y)是原始矢量,(x'; y')是旋转矢量。将此变换应用于所有四个向量,然后选择最小和最大x和y值,并且您具有目标纹理的边界。
实际上,由于有两对平行的向量,您可以进一步简化计算:您只需要两个非平行向量,并使用以下公式获得宽度和高度:
w = 2*max(abs(x1', x2'))
h = 2*max(abs(y1', y2'))
这种方法唯一的问题是,如果你现在进一步旋转这个纹理,你会得到一个不断增长的框架。为避免这种情况,您可以记住原始纹理的尺寸,并在任何后续转换中使用它。
来源:lipk