поворот спрайта в opengl с помощью библиотеки cglm

использую cglm для поворота спрайта. я вот щас подумал что надо проекцию ortho менять на позицию спрайта, но пока я не уверен в этом. в общем я поворачиваю спрайт, а он поворачивается вроде как вокруг нижней левой точки. у меня начало координат идет от нижней левой точки. вот код. но здесь ничего такого.

static void menu_render ( ) {
        while ( 1 ) {
                const Uint8 *state = SDL_GetKeyboardState ( NULL );
                if ( state[ SDL_SCANCODE_Q ] ) {
                        SDL_Quit ( );
                        exit ( EXIT_SUCCESS );
                }

                glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
                //actor_render_single ( ac );
                if ( state[ SDL_SCANCODE_A ] ) {
                        sprite_rotate ( sp, (vec3) { 0, 0, 1 }, 1 );
                }
                if ( state[ SDL_SCANCODE_D ] ) {
                        sprite_rotate ( sp, (vec3) { 0, 0, 1 }, -1 );
                }

                sprite_render ( sp );


                SDL_GL_SwapWindow ( cf.window );
                SDL_Delay ( 16 );
        }
}


void menu ( ) {
        glClearColor ( 0x1c / 255.0, 0x1c / 255.0, 0x1c / 255.0, 1.0 );

#if 0
        ac = calloc ( 1, sizeof ( struct actor ) );
        actor_init ( ac );
#endif

        sp = calloc ( 1, sizeof ( struct sprite ) );
        sprite_init ( sp );
        sprite_read_file ( sp, "ssproit_avatar" );
        sprite_transform ( sp, 500, 500 );
        //actor_transform ( ac, 100, 100 );

        SDL_CreateThread ( thread_menu_new, "menu", NULL );

        level = menu_render;


}

также вот шейдер.

#version 300 es
layout ( location = 0 ) in vec2 position;
layout ( location = 1 ) in vec2 texCoord;
uniform mat4 transform;
uniform mat4 ortho;
uniform mat4 rotate;
out vec2 v_tex_coord;
void main ( )
{
        gl_Position = ortho * rotate * transform * vec4 ( position, 0.0, 1.0 );
        v_tex_coord = texCoord;
}

Ответы (1 шт):

Автор решения: xverizex

да. надо матрицу ortho смещать в позицию где должен быть спрайт. а спрайт устанавливать в позицию x: 0 - width; y: 0 - height; а позицию ortho устанавливать в x: pos.x + width / 2; y: pos.y + height / 2;

И тогда спрайт имеет нужные координаты и вращается вокруг центра.

→ Ссылка