使用kivy渲染3D模型出现黑屏问题求助
问题:Kivy渲染3D模型黑屏,无法显示自制OBJ模型
已解决的崩溃问题及修改步骤
- 添加缺失的
default.glsl文件(从GitHub获取) - 添加缺失的
empty.png文件修复崩溃 - 修改
objloader.py中的代码段:
原代码:
if not material.map: material.map = Image(folder + '/empty.png').texture material.texture_ratio = 0.0 mesh = Mesh(geometry, material) return mesh
修改后代码:
if not material.map: empty_path = os.path.join(folder, 'empty.png') if os.path.exists(empty_path): try: img = Image(empty_path) material.map = img.texture except Exception as e: Logger.warning(f"WaveObject: Could not load texture '{empty_path}': {e}") material.map = None else: Logger.warning(f"WaveObject: 'empty.png' not found at '{empty_path}'") material.map = None material.texture_ratio = 0.0 mesh = Mesh(geometry, material) return mesh
当前状态
程序不再崩溃,但运行后仅显示黑屏,仅右键放置红点、左键移除红点的鼠标功能正常。
包含调试代码的主文件
import os os.environ['KIVY_IMAGE'] = 'pil' from kivy.core.image import Image from kivy.app import App from kivy.core.window import Window from kivy.uix.widget import Widget from kivy3 import Scene, Renderer from kivy3.loaders import OBJLoader from kivy3 import PerspectiveCamera from kivy.graphics.context_instructions import Scale class MainWidget(Widget): def __init__(self, **kwargs): super().__init__(**kwargs) # Create a scene and load the 3D model self.scene = Scene() loader = OBJLoader() obj = loader.load('C:/Users/chris/OneDrive/Documents/St.lucia_Cultural_Heritage_Project/assets/St_Lucia_Map_Final_2.obj') self.scene.add(obj) # Optional debugging: print model info print("OBJ model loaded:", obj) if hasattr(obj, 'pos'): print("Model position:", obj.pos) if hasattr(obj, 'scale'): print("Model scale:", obj.scale) if hasattr(obj, 'geometry'): print(f"Geometry has {len(obj.geometry.vertices)} vertices") obj.pos = (0,0,0) self.scene.add(obj) # Set up the camera self.camera = PerspectiveCamera(75, 1, 1, 1000) self.camera.pos = (0, 0, -10) # Adjust position as necessary self.camera.aspect = self.width/float(self.height) if self.height != 0 else 1 print("Camera position:", self.camera.pos) print("Camera aspect ratio:", self.camera.aspect) # Set up the renderer self.renderer = Renderer() self.renderer.camera = self.camera self.renderer.scene = self.scene self.renderer.size = Window.size print("Renderer size:", self.renderer.size) self.add_widget(self.renderer) # Print renderer and scene info print("Renderer size:", self.renderer.size) print("Scene children count:", len(self.scene.objects) if hasattr(self.scene, 'objects') else 'n/a') # Ensure the renderer resizes with the window Window.bind(on_resize=self.on_window_resize) print("Initial setup complete") def on_window_resize(self, window, width, height): self.renderer.size = (width, height) if height != 0: self.camera.aspect = width / float(height) else: self.camera.aspect = 1 print(f"Window resized: size=({width}, {height}), camera aspect={self.camera.aspect}") class StLucia3DApp(App): def build(self): return MainWidget() if __name__ == '__main__': StLucia3DApp().run()
需求
- 成功显示自制的3D模型
- 实现用户点击地图区域时缩放并展示信息及多媒体
- 后续将该应用集成到Django网站中
内容的提问来源于stack exchange,提问作者Rupert Fletcher
相关产品推荐
相关产品推荐

