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
相关产品推荐
相关产品推荐

