Ursina框架Entity渲染优先级问题求助
Ursina框架中2D Entity渲染优先级问题解决方案
问题背景
创建两个同尺寸的2D 'quad' Entity时,渲染层级不稳定,有时一个覆盖另一个,有时顺序相反,无法固定显示层级。
原代码示例:
from ursina import * app = Ursina() o = Entity(model='quad', scale_x=0.3, scale_y=0.3, collider="box", color=color.red,position=(-0.45,-1.4)) Re_bianco = Entity(model='quad', scale_x=0.3, scale_y=0.3, collider="box", position=(-0.5,-1.4)) app.run()
错误尝试分析
直接调整z轴会导致quad变形,且重叠时仍能看到两个图形,原因是Ursina默认使用透视相机(PerspectiveCamera),透视投影下物体大小会随z轴距离变化,z值越大(离相机越远)物体显示越小,同时透视相机的深度排序可能因精度问题导致重叠区域显示异常。
调整后的错误代码示例:
from ursina import * app = Ursina() o = Entity(model='quad', scale_x=0.3, scale_y=0.3, collider="box", color=color.red,position=(-0.5,-1.4,0)) Re_bianco = Entity(model='quad', scale_x=0.3, scale_y=0.3, collider="box", position=(-0.5,-1.4,1)) app.run()
正确解决方案
方案1:使用render_priority属性(推荐)
Ursina的Entity内置render_priority参数,数值越大,渲染顺序越靠后(即显示在上方),无需调整z轴或相机,不会导致变形。
示例代码:
from ursina import * app = Ursina() # render_priority数值小的先渲染,大的后渲染(覆盖在上方) o = Entity(model='quad', scale_x=0.3, scale_y=0.3, collider="box", color=color.red, position=(-0.5,-1.4), render_priority=1) Re_bianco = Entity(model='quad', scale_x=0.3, scale_y=0.3, collider="box", position=(-0.5,-1.4), render_priority=2) app.run()
此方案中Re_bianco会始终显示在o的上方,层级固定。
方案2:开启正交相机后调整z轴
如果偏好通过z轴控制层级,先开启正交相机(OrthographicCamera),正交投影下物体大小不随z轴变化,仅z轴数值影响渲染层级(z值越小,物体越靠近相机,显示在上方)。
示例代码:
from ursina import * app = Ursina() # 开启正交相机,适配2D场景 camera.orthographic = True camera.fov = 4 # 根据场景需求调整视野范围,避免物体显示异常 # z值0比z值1更靠近相机,所以Re_bianco会覆盖o o = Entity(model='quad', scale_x=0.3, scale_y=0.3, collider="box", color=color.red, position=(-0.5,-1.4, 1)) Re_bianco = Entity(model='quad', scale_x=0.3, scale_y=0.3, collider="box", position=(-0.5,-1.4, 0)) app.run()
内容的提问来源于stack exchange,提问作者Davide Cervati
相关产品推荐
相关产品推荐

