поворот спрайта в 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;
И тогда спрайт имеет нужные координаты и вращается вокруг центра.