运行Ursina游戏引擎时触发AssertionError:!mat.is_nan()的原因是什么
问题原因
- 你遇到的
AssertionError: !mat.is_nan()是Ursina底层依赖的Panda3D渲染引擎抛出的错误,含义是渲染变换矩阵计算时出现了非数值(NaN),不属于底层引擎的核心Bug,是内置SmoothFollow组件的适配问题。 - 触发原因有两个:
- 你创建的50个链式跟随的
Entity初始位置全部默认为(0,0,0),前一个实体还未完成第一帧的位置计算,就被后一个实体绑定为跟随目标,链式累加后出现计算溢出。 SmoothFollow默认的跟随参数没有适配大量实体链式绑定的场景,多帧延迟叠加后生成了无效的变换矩阵。
- 你创建的50个链式跟随的
解决方法
方案1:调整初始化参数
给每个实体设置错开的初始坐标,同时给SmoothFollow显式指定speed参数即可解决,修改后可运行代码如下:
from ursina import * # 把app初始化移到update函数前面,避免组件绑定时序问题 app = Ursina() def update(): global dy player.y += dy if abs(player.y)>= 3: dy = -dy player = Entity(model='quad', scale=1, x = -4.5, texture = 'dragon_head.png') e = [None]*50 dy =.08 # 给第一个跟随点设置初始x坐标,和玩家位置对齐 e[0] = Entity(model='circle', scale = .2, color = color.green, x=-4.2) e[0].add_script(SmoothFollow(target = player, offset=(.3, 0, 0), speed=10)) for i in range(1,50): # 每个点初始x坐标依次错开,避免初始位置重合 e[i] = Entity(model='circle', scale = .2, color = color.green, x=-4.2 + i*0.2) e[i].add_script(SmoothFollow(target = e[i-1], offset=(.2, 0, 0), speed=10)) app.run()
方案2:自定义跟随逻辑
如果修改参数后仍然报错,可以弃用内置SmoothFollow组件,自己写逐帧跟随逻辑,可控性更高:
from ursina import * app = Ursina() follow_smooth = 0.1 # 跟随平滑度,数值越小越平滑 def update(): global dy player.y += dy if abs(player.y)>= 3: dy = -dy # 逐帧更新每个点的位置 e[0].x += (player.x + 0.3 - e[0].x) * follow_smooth e[0].y += (player.y - e[0].y) * follow_smooth for i in range(1,50): e[i].x += (e[i-1].x + 0.2 - e[i].x) * follow_smooth e[i].y += (e[i-1].y - e[i].y) * follow_smooth player = Entity(model='quad', scale=1, x = -4.5, texture = 'dragon_head.png') e = [None]*50 dy =.08 for i in range(0,50): e[i] = Entity(model='circle', scale = .2, color = color.green, x=-4.2 + i*0.2) app.run()
内容的提问来源于stack exchange,提问作者Charbel Massoud
相关产品推荐
相关产品推荐

