9. Rysowanie, animacje i podstawy grafiki 3D

Podobne dokumenty
ANDROID. OpenGL ES 1.0. Tomasz Dzieniak

grafika 2D i animacja obsługa rotacji i elementy 3D-OpenGL w Androidzie

Grafika trójwymiarowa

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusz Mikoda

Programowanie Urządzeń Mobilnych. Laboratorium nr 11, 12

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 7 Wykorzystanie układu LinearLayout

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Podstawowe elementy GUI - zadania

Języki i metody programowania Java. Wykład 2 (część 2)

Wstęp do JUNG. Omówione elementy wykorzystane w Edge Color Project

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Android pierwsza aplikacja

Współbieżność w środowisku Java

Fragmenty są wspierane od Androida 1.6

STWORZENIE PRZYKŁADOWEJ

Systemy operacyjne na platformach mobilnych

II Tworzenie klasy Prostokąt dziedziczącej z klasy wątku

Życie aktywności Nawigując przez aplikacje poszczególne Aktywności przechodzą pomiędzy stanami. Dla przykładu gdy aktywność uruchamia się po raz

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

akademia androida Sensory część V Mobile Applications Developers

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 8 Wykorzystanie układu RelativeLayout

Podstawowe elementy GUI - zadania

Janusz Ganczarski. OpenGL Pierwszy program

Enkapsulacja, dziedziczenie, polimorfizm

INSTRUKCJA DO ĆWICZENIA 13. Animacja wielowątkowa w aplikacjach JME. Gra logistyczna.

Technologie i usługi internetowe cz. 2

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

akademia androida Http i AsyncTask część VII

Programowanie obiektowe

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

PROJEKTOWANIE ABSTRAKCYJNEJ KLASY FIGURA PRZECHOWUJĄCEJ WSPÓLNE CECHY OBIEKTÓW GRAFICZNYCH

TEMAT : KLASY DZIEDZICZENIE

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

Programowanie obiektowe

Programowanie urządzeń mobilnych. dr inż. Juliusz Mikoda

Programowanie obiektowe

Wysokopoziomowy silnik gier dla urządzeń mobilnych z systemem Android

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Podstawy Języka Java

Zaawansowany kurs języka Python

akademia androida Service, BroadcastReceiver, ContentProvider część IV

RESTful Android. Na co zwrócić uwagę przy tworzeniu aplikacji klienckich REST na Androidzie

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Laboratorium Systemów Mobilnych. Wykład 1

Mobilne aplikacje multimedialne

Wykorzystanie map i geolokalizacji

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

PHP 5 język obiektowy

STWORZENIE MOBILNEJ APLIKACJI,

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Programowanie obiektowe

GRAFIKA. Rodzaje grafiki i odpowiadające im edytory

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Tworzenie i wykorzystanie usług

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Grafika i komunikacja człowiek komputer Laboratorium. Część 3: Tekst, czcionki, kolory

Język Java część 2 (przykładowa aplikacja)

PyGame Gra w Ponga. Spis treści

Zaawansowane aplikacje WWW - laboratorium

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Podstawy Processingu. Diana Domańska. Uniwersytet Śląski

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Aplikacje w Javie- wykład 11 Wątki-podstawy

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Zaawansowane aplikacje internetowe

Programowanie w JAVA Lab. 5 - Wątki. 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 7 x ) xy, 8,8

Multimedia JAVA. Historia

Wprowadzenie do QT OpenGL

[Android] Podstawy programowania

Programowanie Urządzeń Mobilnych. Laboratorium nr 9,10

Programowanie - instrukcje sterujące

Kurs programowania. Wykład 6. Wojciech Macyna. 7 kwietnia 2016

3.4. Opis konfiguracji layoutów.

Rysowanie prostych obiektów graficznych przy użyciu biblioteki AWT (Abstract Window Toolkit)

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Aplikacje RMI

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Powiadomienia w systemie Android

Aplikacje internetowe i rozproszone - laboratorium

Rysowanie punktów na powierzchni graficznej

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Klasy i obiekty cz II

Kontenery i komponenty graficzne

Szybkie tworzenie grafiki w GcIde

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Mechanizm dziedziczenia

Wykład 7: Pakiety i Interfejsy

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Transkrypt:

9. Rysowanie, animacje i podstawy grafiki 3D 171 <scale android:duration= 2000 android:startoffset= 2000 android:fromxscale= 1 android:fromyscale= 1 android:pivotx= 50% android:pivoty= 50% android:toxscale= 3 android:toyscale= 3 /> <translate android:startoffset= 6000 android:duration= 2000 android:fromxdelta= 0 android:toxdelta= -100 /> <alpha android:fromalpha= 1.0 android:startoffset= 8000 android:toalpha= 0.0 android:duration= 1000 android:repeatmode= reverse android:repeatcount= infinite /> </set> 9.5. Podstawy grafiki 3D Tworzenie grafiki 3D w urządzeniach z systemem Android jest możliwe dzięki zastosowaniu modułu OpenGL ES. OpenGL ES jest podzbiorem standardu OpenGL dostosowanym do urządzeń z systemem Android. Podstawowym sposobem korzystania z OpenGL ES jest zastosowanie następujących klas: GLSurfaceView, GLSurfaceView.Renderer. Klasa GLSurfaceView obsługuje uruchomienie niezbędnych bibliotek i zarządza wątkami związanymi z rysowaniem. Jej zastosowanie pozwala także na synchronizację cyklu życia klasy z cyklem życia Aktywności, w której została zastosowana. Klasa GLSurfaceView.Renderer zarządza procesem rysowania i umożliwia programiście definiowanie własnych implementacji elementów grafiki. Zastosowanie klas Open GL ES jest dużym ułatwieniem dla programisty, ponieważ umożliwia: łatwą implementację wyświetlania grafiki; łatwą integrację z cyklem życia Aktywności;

172 Android w praktyce. Projektowanie aplikacji odciążenie od obowiązku ręcznego zarządzania wątkami związanymi z wyświetlaniem grafiki; odciążenie od obowiązku ręcznego zarządzania bibliotekami OpenGL ES. W pierwszej kolejności przedstawiony został przykład zastosowania prostej aplikacji z wykorzystaniem klas GLSurfaceView oraz GLSurfaceView.Renderer. Przykład ten koncentruje się na odpowiednim sposobie wkomponowania tych obiektów do własnej aplikacji, aby w prawidłowy sposób z nią współdziałały. W efekcie aplikacja wyświetli szare tło na całym ekranie (gl.glclearcolor (0.5f, 0.5f, 0.5f, 1.0f);). package com.example.openglszkielet; import java.nio.bytebuffer; import java.nio.byteorder; import java.nio.floatbuffer; import java.nio.shortbuffer; import java.util.random; import javax.microedition.khronos.egl.eglconfig; import javax.microedition.khronos.opengles.gl10; import android.opengl.glsurfaceview; import android.os.bundle; import android.app.activity; import android.view.menu; public class MainActivity extends Activity { private GLSurfaceView glview; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // Utworzenie powierzchni do rysowania glview = new GLSurfaceView(this); // Utworzenie obiektu zarządzającego rysowaniem, glview.setrenderer(new ClearRenderer()); // Ustawienie utworzonej powierzchni jako interfejsu // Aktywności setcontentview(glview); protected void onpause() {

9. Rysowanie, animacje i podstawy grafiki 3D 173 //Synchronizacja cyklu Aktywności z cyklem //powierzchni rysowania super.onpause(); glview.onpause(); protected void onresume() { //Synchronizacja cyklu Aktywności z cyklem //powierzchni rysowania super.onresume(); glview.onresume(); class ClearRenderer implements GLSurfaceView.Renderer { public void onsurfacechanged(gl10 gl, int w, int h) { //Ustawienie wielkości obszaru rysowania na cały ekran gl.glviewport(0, 0, w, h); public void ondrawframe(gl10 gl) { //Metoda wywoływana non stop (wywoływana co każdą ramkę) //Działa tylko wtedy, gdy działa aktywność gl.glclear(gl10.gl_color_buffer_bit GL10.GL_DEPTH_BUFFER_BIT); //Ustawienie koloru tła na szary bez przezroczystości gl.glclearcolor(0.5f, 0.5f, 0.5f, 1.0f); public void onsurfacecreated(gl10 arg0, EGLConfig arg1) { // Operacje wykonywane w momencie utworzenia obszaru // rysowania W metodach Aktywności onpause() i onresume() zaimplementowano synchronizację w taki sposób, aby wątek związany z grafiką był wstrzymywany

174 Android w praktyce. Projektowanie aplikacji i wznawiany w przypadku zatrzymania lub wznowienia działania Aktywności. Takie rozwiązanie przede wszystkim oszczędza zasoby urządzenia. W metodzie onsurfacecreated należy zaimplementować elementy wymagane przy pierwszym tworzeniu powierzchni przeznaczonej do rysowania grafiki. W metodzie onsurfacechanged() należy zaimplementować elementy związane ze zmianą wielkości obszaru wyświetlania. Przykładowo, metoda umożliwia uzyskanie odpowiedniej reakcji na zmianę obszaru rysowania w momencie zmiany orientacji ekranu urządzenia. Istotną metodą umożliwiającą programiście implementację własnej funkcjonalności jest metoda ondrawframe(). Wywoływana jest ona cyklicznie (ramka obrazu) i umożliwia wprowadzanie zmian w obszarze rysowania. Dotychczasowe działania nie umożliwiały wprowadzenia interakcji z użytkownikiem. Aby prawidłowo zaimplementować zdarzenia związane z interakcją z użytkownikiem, należy zdefiniować własną klasę korzystającą z klasy GLSurfaceView z implementacją metod obsługujących odpowiednie zdarzenia. W kolejnym przykładzie przedstawiono interakcję polegającą na odczytywaniu współrzędnych miejsca, w którym użytkownik dotknął ekranu. Odczytane współrzędne w dodanej metodzie ontouchevent() wykorzystywane są następnie do ustawienia nasycenia poszczególnych barw RGB składających się na kolor tła. Ponieważ nasycenie danego koloru reprezentowane jest przez wartości z przedziału od 0 do 1, wartości składowych obliczono zgodnie ze wzorem: r = event.getx() / getwidth(), g = event.gety() / getheight(), b = 1- event.getx() / getwidth(). Obliczone wartości przekazywane są do obiektu typu GLSurfaceView.Renderer, który odpowiedzialny jest za rysowanie tła, z wykorzystaniem dodanej metody setcolor(). Pełny kod aplikacji wygląda następująco: package com.example.openglinterakcja; import javax.microedition.khronos.egl.eglconfig; import javax.microedition.khronos.opengles.gl10; import android.app.activity; import android.content.context; import android.opengl.glsurfaceview; import android.os.bundle; import android.view.motionevent; public class MainActivity extends Activity { private GLSurfaceView glview;

9. Rysowanie, animacje i podstawy grafiki 3D 175 protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); glview = new MojeGLSurfaceView(this); setcontentview(glview); protected void onpause() { super.onpause(); glview.onpause(); protected void onresume() { super.onresume(); glview.onresume(); // Rozszerzenie klasy GLSurfaceView // Dodanie metody ontouchevent class MojeGLSurfaceView extends GLSurfaceView { MojRenderer renderer; public MojeGLSurfaceView(Context context) { super(context); renderer = new MojRenderer(); setrenderer(renderer); public boolean ontouchevent(final MotionEvent event) { queueevent(new Runnable(){ public void run() { renderer.setcolor( event.getx() / getwidth(), event.gety() / getheight(), 1- event.getx() / getwidth()); ); return true;

176 Android w praktyce. Projektowanie aplikacji // Rozszerzenie klasy GLSurfaceView.Renderer // Dodanie metody setcolor umożliwiającej // zmianę kolorów powierzchni do rysowania class MojRenderer implements GLSurfaceView.Renderer { private float red; private float green; private float blue; public void onsurfacecreated(gl10 gl, EGLConfig config) { public void onsurfacechanged(gl10 gl, int w, int h) { gl.glviewport(0, 0, w, h); public void ondrawframe(gl10 gl) { gl.glclearcolor(red, green, blue, 1.0f); gl.glclear(gl10.gl_color_buffer_bit GL10.GL_DEPTH_BUFFER_BIT); public void setcolor(float r, float g, float b) { red = r; green = g; blue = b; Kolejny przykład prezentuje sposób rysowania trójkąta (figura płaska) z możliwością zobrazowania obrotów przestrzennych. W przykładzie zaimplementowano także interakcję polegającą na zmianie kąta ustawienia figury przez dotknięcie ekranu w wybranym miejscu. W dalszej części znajduje się pełny kod z dodatkowymi komentarzami. Schemat implementacji jest identyczny do zastosowanego we wcześniejszym przykładzie. Dodana została klasa Trojkat() opisująca właściwości graficzne figury z metodami jej rysowania. W metodach obiektu Renderer wprowadzono odpowiednie instrukcje umożliwiające prawidłowe wyświetlanie trójkąta. Szczegółowe omówienie wszystkich instrukcji wykracza poza ramy publikacji. package com.example.opengltrojkat; import java.nio.bytebuffer;

9. Rysowanie, animacje i podstawy grafiki 3D 177... public class MainActivity extends Activity { private GLSurfaceView glview; protected void oncreate(bundle savedinstancestate) { // j.w. protected void onpause() { // j.w. protected void onresume() { // j.w. // Rozszerzenie klasy GLSurfaceView // Dodanie metody ontouchevent class MojeGLSurfaceView extends GLSurfaceView { MojRenderer renderer; public MojeGLSurfaceView(Context context) { super(context); renderer = new MojRenderer(); setrenderer(renderer); public boolean ontouchevent(final MotionEvent event) { queueevent(new Runnable(){ public void run() { // Na podstawie współrzędnej X miejsca dotknięcia // ekranu wyznaczany jest kąt ustawienia trójkąta renderer.ustawkat(event.getx()); ); return true;

178 Android w praktyce. Projektowanie aplikacji // Rozszerzenie klasy GLSurfaceView.Renderer // Dodanie metody setcolor umożliwiającej // zmianę kolorów powierzchni do rysowania class MojRenderer implements GLSurfaceView.Renderer { private Trojkat tr = new Trojkat(); private float kat = 100f; private float zmiana = -1f; public void onsurfacecreated(gl10 gl, EGLConfig config) { // Ustalenie koloru tła gl.glclearcolor(0.5f, 0.5f, 0.5f, 1f); gl.glhint(gl10.gl_perspective_correction_hint, GL10.GL_NICEST); gl.glenable(gl10.gl_depth_test); public void onsurfacechanged(gl10 gl, int w, int h) { gl.glviewport(0, 0, w, h); float wsp = (float)w / h; gl.glmatrixmode(gl10.gl_projection); gl.glloadidentity(); gl.glfrustumf(-wsp, wsp, -1.0f, 1.0f, 1.0f, 10.0f); public void ondrawframe(gl10 gl) { gl.glclear(gl10.gl_color_buffer_bit GL10.GL_DEPTH_BUFFER_BIT); gl.glmatrixmode(gl10.gl_modelview); gl.glloadidentity(); gl.gltranslatef(0.0f, 0.0f, -4.0f); gl.glrotatef(kat, 1.0f, 1.0f, 1.0f); tr.draw(gl); if (kat <0 ) zmiana = 1f; if (kat > 100 ) zmiana = -1f; kat += zmiana; public void UstawKat(float k) { // Ustawienie wartości aktualnego kąta kat = k;

9. Rysowanie, animacje i podstawy grafiki 3D 179 // Definicja trójkąta public class Trojkat { // Zmienne buforów dla danych trójkąta private FloatBuffer wierzcholkibuffer = null; private ShortBuffer indeksybuffer = null; private FloatBuffer kolorybuffer = null; // Definicja wierzchołków trójkąta // Lewy dolny, prawy dolny, górny private float wierzcholkilist[] = { -1.0f,-1.0f,0.0f, 1.0f,-1.0f,0.0f, 0.0f, 1.0f,0.0f ; // Numery indeksów wierzchołków private short indeksylist[] = { 0,1,2 ; // Kolory wierzchołków private float kolorylist[] = { 1.0f, 1.0f, 1.0f, 1.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f ; public Trojkat(){ // Bufor wierzchołków ByteBuffer wbuffer = ByteBuffer.allocateDirect (wierzcholkilist.length * 4); wbuffer.order(byteorder.nativeorder()); wierzcholkibuffer = wbuffer.asfloatbuffer(); wierzcholkibuffer.put(wierzcholkilist); wierzcholkibuffer.position(0); // Bufor indeksów wierzchołków ByteBuffer ibuffer = ByteBuffer.allocateDirect (indeksylist.length * 2); ibuffer.order(byteorder.nativeorder()); indeksybuffer = ibuffer.asshortbuffer(); indeksybuffer.put(indeksylist); indeksybuffer.position(0); // Bufor kolorów wierzchołków ByteBuffer cbuffer = ByteBuffer.allocateDirect (kolorylist.length * 4);

180 Android w praktyce. Projektowanie aplikacji cbuffer.order(byteorder.nativeorder()); kolorybuffer = cbuffer.asfloatbuffer(); kolorybuffer.put(kolorylist); kolorybuffer.position(0); public void draw(gl10 gl){ // Rysowanie trójkąta gl.glenableclientstate(gl10.gl_vertex_array); gl.glenableclientstate(gl10.gl_color_array); gl.glcolorpointer(4, GL10.GL_FLOAT, 0, this.kolorybuffer); gl.glvertexpointer(3, GL10.GL_FLOAT, 0, this.wierzcholkibuffer); // Właściwe rysowanie gl.gldrawelements(gl10.gl_triangles, 3, GL10.GL_UNSIGNED_SHORT, this.indeksybuffer); gl.gldisableclientstate(gl10.gl_vertex_array); gl.gldisableclientstate(gl10.gl_color_array); Rysunek 72. Obroty przestrzenne figury z wykorzystaniem OpenGL ES