Latar belakang: sebagai programmer Chukchi yang naif, saya berpikir: "python sangat lintas platform, saya akan menulis mainan untuk anak saya, menjalankannya di tablet, biarkan bermain." Akibatnya, butuh dua minggu untuk mencoba menemukan solusi untuk pindah dari PyOpenGL + pygame ke kivy, karena saya tidak menemukan contoh yang jelas untuk menggunakan OpenGL dengan kivy. Mungkin pengalaman saya akan membantu seseorang menghemat waktu.
Penolakan:
Saya tidak menyarankan siapa pun untuk mengembangkan aplikasi dengan python dengan grafik 3D untuk android. Ini bukan pilihan paling cerdas. Tetapi jika Anda benar-benar ingin, maka Anda dapat terus membaca.
Kivy memiliki solusi Mesh bawaan yang dapat melakukan grafik 3D. Contohnya juga tidak sesederhana itu. Saya lebih suka OpenGL telanjang.
Mungkin saya menemukan Amerika mencoba menemukan India. Saya berharap kawan-kawan yang lebih berpengalaman akan mengoreksi dan menambah.
Sebelum Anda mulai bekerja dengan grafik 3D di kivy, Anda harus membaca tentang library secara umum dan tentang instalasinya (misalnya, manual merekomendasikan penggunaan lingkungan virtual).
Apa masalahnya? Para pengembang kivy dengan licik menyembunyikan deskripsi fungsi OpenGL di situs resmi mereka . Satu-satunya pertanyaan adalah bagaimana membuatnya bekerja.
, 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. :
Putra saya, sementara itu, menolak untuk memainkan peran saya, yah, setidaknya dia terlihat penuh minat. Game yang digambar datar untuk anak berusia dua tahun ternyata lebih cocok. Untuk inilah semuanya dimulai:
Chopped Snake Style - Beberapa tangkapan layar dari langkah debug sebagai penghargaan untuk Jackie Chan: