Desenhar objetos na tela é um recurso bastante básico do OpenGL, mas você pode fazer isso com outros
Classes do framework gráfico do Android, incluindo Canvas
e
objetos Drawable
. O OpenGL ES fornece recursos adicionais para
mover e transformar objetos desenhados em três dimensões ou de outras maneiras únicas para criar
experiências do usuário interessantes.
Nesta lição, você aprenderá a adicionar movimentos e dar mais um passo para usar o OpenGL ES a uma forma com rotação.
Girar uma forma
Girar um objeto de desenho com o OpenGL ES 2.0 é relativamente simples. No renderizador, crie outra matriz de transformação (uma matriz de rotação) e combiná-la com sua projeção e matrizes de transformação de visualização da câmera:
Kotlin
private val rotationMatrix = FloatArray(16) override fun onDrawFrame(gl: GL10) { val scratch = FloatArray(16) ... // Create a rotation transformation for the triangle val time = SystemClock.uptimeMillis() % 4000L val angle = 0.090f * time.toInt() Matrix.setRotateM(rotationMatrix, 0, angle, 0f, 0f, -1.0f) // Combine the rotation matrix with the projection and camera view // Note that the vPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0) // Draw triangle mTriangle.draw(scratch) }
Java
private float[] rotationMatrix = new float[16]; @Override public void onDrawFrame(GL10 gl) { float[] scratch = new float[16]; ... // Create a rotation transformation for the triangle long time = SystemClock.uptimeMillis() % 4000L; float angle = 0.090f * ((int) time); Matrix.setRotateM(rotationMatrix, 0, angle, 0, 0, -1.0f); // Combine the rotation matrix with the projection and camera view // Note that the vPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0); // Draw triangle mTriangle.draw(scratch); }
Se o triângulo não girar depois de fazer essas alterações, certifique-se de inserir um comentário no
GLSurfaceView.RENDERMODE_WHEN_DIRTY
conforme descrito na próxima seção.
Ativar renderização contínua
Se você tiver seguido o código de exemplo nesta aula até aqui,
marque como comentário a linha que define o modo de renderização somente desenhando quando estiver sujo; caso contrário, o OpenGL
gira a forma em apenas um incremento e aguarda uma chamada para requestRender()
do contêiner GLSurfaceView
:
Kotlin
class MyGLSurfaceView(context: Context) : GLSurfaceView(context) { init { ... // Render the view only when there is a change in the drawing data. // To allow the triangle to rotate automatically, this line is commented out: // renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY } }
Java
public class MyGLSurfaceView(Context context) extends GLSurfaceView { ... // Render the view only when there is a change in the drawing data. // To allow the triangle to rotate automatically, this line is commented out: //setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); }
A menos que haja objetos que mudam sem interação do usuário, geralmente é uma boa ideia ter isso ativada. Você precisa remover a marca de comentário do código, porque a próxima lição torna essa chamada aplicável. mais uma vez.