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

Ursina引擎无法检测.gltf模型的问题排查求助

解决Ursina加载GLTF模型时的KeyboardInterrupt问题

问题详情

我在Linux Ubuntu系统下用Ursina引擎开发类Minecraft游戏,已将Blockbench导出的dirt_texture.png和block.gltf导入PyCharm,并编写了对应代码,但运行时触发KeyboardInterrupt错误,无法识别.gltf模型。尝试.obj、.json格式模型也无效,gltf文件在PyCharm中无语法错误,求助解决方法。

代码示例

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController

app = Ursina()

class Voxel(Button):
    def __init__(self, position = (0, 0, 0)):
        super().__init__(
            parent = scene,
            position = position,
            model = 'block.gltf',
            origin_y = 0.5,
            texture = 'dirt_texture.png',
            color = color.white)

    def input(self, key):
        if self.hovered:
            if key == 'right mouse down':
                voxel = Voxel(position = self.position + mouse.normal)
            if key == 'left mouse down':
                destroy(self)

for z in range(20):
    for x in range(20):
        voxel = Voxel(position = (x,0,z))
player = FirstPersonController()

app.run()

报错信息

:prc(warning): Invalid integer value for ConfigVariable win-size: 840.0
:prc(warning): Invalid integer value for ConfigVariable win-size: 1344.0
Known pipe types:
  glxGraphicsPipe
(4 aux display modules not yet loaded.)
:device(warning): /dev/input/event12 is not readable, some features will be unavailable.
Traceback (most recent call last):
  File "/home/alex2012/PycharmProjects/Minecraft/main.py", line 4, in <module>
    app = Ursina()
  File "/home/alex2012/PycharmProjects/Minecraft/venv/lib/python3.6/site-packages/ursina/main.py", line 51, in __init__
    camera.set_up()
  File "/home/alex2012/PycharmProjects/Minecraft/venv/lib/python3.6/site-packages/ursina/camera.py", line 74, in set_up
    self.overlay = Entity(parent=self.ui, model='quad', scale=99, color=color.clear, eternal=True, z=-99)
  File "/home/alex2012/PycharmProjects/Minecraft/venv/lib/python3.6/site-packages/ursina/entity.py", line 114, in __init__
    setattr(self, key, kwargs[key])
  File "/home/alex2012/PycharmProjects/Minecraft/venv/lib/python3.6/site-packages/ursina/entity.py", line 210, in __setattr__
    m = load_model(value, application.asset_folder)
  File "/home/alex2012/PycharmProjects/Minecraft/venv/lib/python3.6/site-packages/ursina/mesh_importer.py", line 42, in load_model
    for filename in path.glob(f'**/{name}{filetype}'):
  File "/usr/lib/python3.6/pathlib.py", line 1100, in glob
    for p in selector.select_from(self):
  File "/usr/lib/python3.6/pathlib.py", line 559, in _select_from
    for starting_point in self._iterate_directories(parent_path, is_dir, scandir):
  File "/usr/lib/python3.6/pathlib.py", line 549, in _iterate_directories
    for p in self._iterate_directories(path, is_dir, scandir):
  File "/usr/lib/python3.6/pathlib.py", line 549, in _iterate_directories
    for p in self._iterate_directories(path, is_dir, scandir):
  File "/usr/lib/python3.6/pathlib.py", line 549, in _iterate_directories
    for p in self._iterate_directories(path, is_dir, scandir):
  [Previous line repeated 4 more times]
  File "/usr/lib/python3.6/pathlib.py", line 545, in _iterate_directories
    entries = list(scandir(parent_path))
KeyboardInterrupt

GLTF文件内容

{"asset":{"version":"2.0","generator":"Blockbench 4.5.2 glTF exporter"},"scenes":[{"nodes":[1],"name":"blockbench_export"}],"scene":0,"nodes":[{"name":"cube","mesh":0},{"children":[0]}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":288,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":576,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":768,"byteLength":72,"target":34963}],"buffers":[{"byteLength":840,"uri":"data:application/octet-stream;base64,AAAAPwAAgD8AAAA/AAAAPwAAgD8AAAC/AAAAPwAAAAAAAAA/AAAAPwAAAAAAAAC/AAAAvwAAgD8AAAC/AAAAvwAAgD8AAAA/AAAAvwAAAAAAAAC/AAAAvwAAAAAAAAA/AAAAvwAAgD8AAAC/AAAAPwAAgD8AAAC/AAAAvwAAgD8AAAA/AAAAPwAAgD8AAAA/AAAAvwAAAAAAAAA/AAAAPwAAAAAAAAA/AAAAvwAAAAAAAAC/AAAAPwAAAAAAAAC/AAAAvwAAgD8AAAA/AAAAPwAAgD8AAAA/AAAAvwAAAAAAAAA/AAAAPwAAAAAAAAA/AAAAPwAAgD8AAAC/AAAAvwAAgD8AAAC/AAAAPwAAAAAAAAC/AAAAvwAAAAAAAAC/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAgD8AAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAAAAAAAAgD8AAAAAAAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUA"}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[0.5,1,0.5],"min":[-0.5,0,-0.5],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"max":[1,1,1],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"max":[1,1],"min":[0,0],"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"}],"materials":[{"pbrMetallicRoughness":{"metallicFactor":0,"roughnessFactor":1},"alphaMode":"MASK","alphaCutoff":0.05,"doubleSided":true}],"meshes":[{"primitives":[{"mode":4,"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3,"material":0}]}]}

解决方法

  • 确认资源路径正确性
    Ursina默认从项目根目录的assets文件夹加载资源,把block.gltf和dirt_texture.png放到assets文件夹下,或者在代码里指定相对路径,比如model='./block.gltf'。

  • 升级Python与Ursina版本
    当前使用的Python3.6版本过旧,Ursina对Python3.8+兼容性更好。先升级Python到3.8或更高版本,再执行命令更新Ursina:

    pip install --upgrade ursina
    
  • 验证基础代码可用性
    先将模型替换为Ursina自带的cube,测试代码是否能正常运行。如果自带模型没问题,再替换回自定义GLTF模型,排除代码其他逻辑的问题。

  • 调整Blockbench导出设置
    导出GLTF时选择glTF 2.0格式,勾选“嵌入缓冲区”选项,避免外部依赖。同时将导出缩放设为1.0,匹配Ursina的单位体系。

  • 限制资源搜索目录
    报错显示pathlib递归遍历目录时卡住,可能是项目目录文件过多或存在循环符号链接。初始化Ursina时指定资源文件夹,缩小搜索范围:

    app = Ursina(asset_folder='./')  # 指定当前目录为资源根目录
    

内容的提问来源于stack exchange,提问作者AlexRanza1234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:40:19