Contexto: sendo um programador Chukchi ingênuo, pensei: "python é tão multiplataforma, vou escrever um brinquedo para meu filho, executá-lo em um tablet, deixá-lo brincar." Como resultado, demorou duas semanas para tentar encontrar uma solução para passar do PyOpenGL + pygame para o kivy, já que não encontrei um exemplo claro de como usar o OpenGL com o kivy. Talvez minha experiência ajude alguém a economizar tempo.
Isenção de responsabilidade:
Não exorto ninguém a desenvolver aplicativos em python com gráficos 3D para Android. Esta não é a opção mais inteligente. Mas se você realmente quiser, pode continuar lendo.
Kivy tem uma solução Mesh embutida que pode fazer gráficos 3D. Os exemplos também não são tão simples. Eu preferia OpenGL vazio.
Talvez eu tenha descoberto a América tentando encontrar a Índia. Espero que camaradas mais experientes corrijam e acrescentem.
Antes de começar a trabalhar com gráficos 3D no kivy, você deve ler sobre a biblioteca em geral e sobre sua instalação (por exemplo, os manuais recomendam o uso de um ambiente virtual).
Qual é o problema? Os desenvolvedores do kivy escondem astutamente a descrição das funções do OpenGL em seu site oficial . A única questão é como fazer funcionar.
, 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. :
Meu filho, por sua vez, recusou-se a desempenhar meu papel, bem, pelo menos ele parece interessado. Jogos empatados para uma criança de dois anos revelam-se mais adequados. Foi para isso que tudo começou:
Estilo Chopped Snake - Algumas capturas de tela da etapa de depuração como um tributo a Jackie Chan: