Para a matemática real da deformação, isso pode ficar muito complicado, por que você não começa aqui? .
Agora vou falar sobre como você pode aplicar isso, supondo que você já tenha a matemática de como fará suas deformações.
2 maneiras:
1) Em cada quadro, visite todos os vértices no modelo de cilindro e faça o deslocamento de alguma maneira.
2) Desloque os vértices no sombreador de vértice enquanto você está renderizando. O OpenGL ES 2.0 suporta shaders de vértice. Então você está com sorte, de certa forma.
Deseja apenas distorcer o objeto como ele aparece na tela ou deseja distorcer o objeto para que todos os objetos do jogo saibam que ele foi deformado?
Se você distorcer o objeto no sombreador de vértice, isso acontecerá imediatamente antes da exibição / rasterização , portanto, isso significa que nenhum dos objetos do jogo saberá da deformação . Isso é bom se você está simplesmente criando um protetor de tela ou se as deformações são tão pequenas que não afetam a forma colidível do objeto.
Quando você distorce a geometria no sombreador de vértices, os vértices originais do modelo na verdade não se movem (eles apenas parecem se mover ).
Deformação no vertex shader
Não deformado:
Deformado
Isto é do capítulo 6 do tutorial cg , (programa nº 14).
O código shader para produzir essa deformação é algo como
// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;
// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;
// move the vertex
float4 newPosition = position + displacement * displacementDirection ;
// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;
Como você pode ver, isso acontece logo antes da exibição (o vertex shader ocorre na GPU), portanto, o código da CPU praticamente não tem como acessar a posição do vértice transformado (existem maneiras de enviar dados da GPU para a CPU (principalmente por meio de texturas), mas nós não vai lá).