问题描述
from objloader import ObjFile
class Renderer(Widget):
def __init__(self,**kwargs):
self.canvas = RenderContext(compute_normal_mat=True)
self.canvas.shader.source = resource_find('simple.glsl')
self.scene = ObjFile(resource_find("monkey.obj"))
super(Renderer,self).__init__(**kwargs)
with self.canvas:
self.cb = Callback(self.setup_gl_context)
Pushmatrix()
self.setup_scene()
PopMatrix()
self.cb = Callback(self.reset_gl_context)
Clock.schedule_interval(self.update_glsl,1 / 60.)
def setup_gl_context(self,*args):
glEnable(GL_DEPTH_TEST)
def reset_gl_context(self,*args):
gldisable(GL_DEPTH_TEST)
def update_glsl(self,delta):
asp = self.width / float(self.height)
proj = Matrix().view_clip(-asp,asp,-1,1,100,1)
self.canvas['projection_mat'] = proj
self.canvas['diffuse_light'] = (1.0,1.0,0.8)
self.canvas['ambient_light'] = (0.1,0.1,0.1)
self.rot.angle += delta * 100
def setup_scene(self):
Color(1,1)
Pushmatrix()
Translate(0,-3)
self.rot = Rotate(1,0)
m = list(self.scene.objects.values())[0]
UpdatenormalMatrix()
self.mesh = Mesh(
vertices=m.vertices,indices=m.indices,fmt=m.vertex_format,mode='triangles',)
PopMatrix()
class RendererApp(App):
def build(self):
return Renderer()
if __name__ == "__main__":
RendererApp().run()
解决方法
您的代码是从 kivy 3dRendereing
示例中复制的,但您没有复制整个示例。该代码需要 objloader.py
文件(以及 monkey.obj
和 simple.glsl
)。将所有这些文件复制到同一个文件夹中,然后代码应该可以工作了。