You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:17:17