Trasfondo: siendo un programador ingenuo de Chukchi, pensé: "Python es tan multiplataforma, escribiré un juguete para mi hijo, lo ejecutaré en una tableta, lo dejaré jugar". Como resultado, me tomó dos semanas intentar encontrar una solución para pasar de PyOpenGL + pygame a kivy, ya que no encontré un ejemplo claro de uso de OpenGL con kivy. Quizás mi experiencia ayude a alguien a ahorrar tiempo.
Descargo de responsabilidad:
No insto a nadie a desarrollar aplicaciones en python con gráficos 3D para Android. Ésta no es la opción más inteligente. Pero si realmente lo desea, puede seguir leyendo.
Kivy tiene una solución Mesh nativa incorporada que puede hacer gráficos en 3D. Los ejemplos tampoco son tan simples. Preferí OpenGL desnudo.
Quizás descubrí América tratando de encontrar India. Espero que los camaradas más experimentados corrijan y agreguen.
Antes de comenzar a trabajar con gráficos 3D en kivy, debe leer sobre la biblioteca en general y sobre su instalación (por ejemplo, los manuales recomiendan usar un entorno virtual).
¿Cuál es el problema? Los desarrolladores de kivy ocultan astutamente la descripción de las funciones de OpenGL en su sitio web oficial . La única pregunta es cómo hacer que funcione.
, PyOpenGL+pygame kivy OpenGL :
from OpenGL.GL import *
from OpenGL.GL.shaders import *
:
from kivy.graphics.opengl import *
: PyOpenGL numpy , kivy tobytes(). kivy glPixelStorei glTexImage2D glTexStorage2D glTexSubImage2D. 2 ( in, out ) :
#ifdef GL_ES
precision highp float;
#endif
- - . PyOpenGL+pygame :
#:
import pygame
from pygame.locals import *
def init():
pygame.init()
pygame.display.set_mode((Width, Height), HWSURFACE | OPENGL | DOUBLEBUF)
''' , PyOpenGL '''
def main():
init()
while True:
''' '''
pygame.display.flip()
kivy App, , Widget. , Window, kivy . Window - WindowBase.
:
#:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.base import EventLoop
from kivy.clock import Clock
def init():
''' , OpenGL '''
init()
class CustomWidget(Widget):
def __init__(self, **kwargs):
super(CustomWidget, self).__init__(**kwargs)
def update_glsl(self, nap):
''' '''
Window.flip()
class MainApp(App):
def build(self):
root = CustomWidget()
EventLoop.ensure_window()
return root
def on_start(self):
Clock.schedule_interval(self.root.update_glsl, 40 ** -1) # FPS
if __name__ == '__main__':
MainApp().run()
( OpenGL), . , Window flip(), . WindowBase. , , MainApp:
def passFunc(W):
pass
class MainApp(App):
def build(self):
root = CustomWidget()
EventLoop.ensure_window()
# :
Window.on_flip = lambda W = Window: passFunc(W)
return root
? , apk- . , (. , , ):
spec- .
- ? . - . FPS 51 15 25. :
Mi hijo, mientras tanto, se negó a hacer mi papel, bueno, al menos mira con interés. Los juegos planos para un niño de dos años resultan más adecuados. Para esto empezó todo: