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

Ursina坐标系无法处理大坐标值问题及UI定制方案

Ursina UI适配任意坐标值的解决方案

问题根源

Ursina默认UI系统的坐标要么是归一化坐标(范围-1到1,对应屏幕边缘到边缘),要么是基于屏幕像素的坐标,当你输入(-11176.87,87646,987654)这种远超屏幕可视范围的数值时,UI元素会被渲染到屏幕外,自然无法看到。


具体解决方法

1. 手动坐标映射(通用方案)

写一个简单的映射函数,将任意范围的原始坐标转换为Ursina UI能识别的可视范围坐标。

示例代码:

from ursina import *

def normalize_coord(raw_val, raw_min, raw_max, target_min, target_max):
    """将原始值从[raw_min, raw_max]映射到[target_min, target_max]"""
    return ((raw_val - raw_min) / (raw_max - raw_min)) * (target_max - target_min) + target_min

# 假设你的轨道坐标x范围是-20000~20000,y范围是0~1000000
# 映射到Ursina的归一化坐标(-1到1,对应屏幕全屏)
raw_x, raw_y, raw_z = (-11176.87, 87646, 987654)
ui_x = normalize_coord(raw_x, -20000, 20000, -1, 1)
ui_y = normalize_coord(raw_y, 0, 1000000, -1, 1)

# 创建UI文本显示坐标
Text(
    text=f"轨道坐标: ({raw_x:.2f}, {raw_y:.0f}, {raw_z:.0f})",
    position=(ui_x, ui_y),
    origin=(0,0)
)

app.run()

2. 3D场景下用WorldSpaceUI跟随物体

如果是实时轨道模拟的3D场景,直接使用WorldSpaceUI让UI绑定到3D实体上,同时调整相机参数确保能看到目标区域:

from ursina import *

app = Ursina()

# 创建轨道上的目标实体
orbit_entity = Entity(
    model='sphere',
    color=color.blue,
    position=(-11176.87, 87646, 987654)
)

# 创建跟随实体的UI,调整scale适配大场景
WorldSpaceUI(
    parent=orbit_entity,
    text=f"坐标: {orbit_entity.position}",
    scale=1500,  # 根据场景大小调整缩放
    origin=(0,0)
)

# 调整相机位置与视角,确保能捕捉到目标
camera.position = orbit_entity.position + Vec3(0, 0, 60000)
camera.look_at(orbit_entity)

app.run()

3. 动态适配未知坐标范围

如果你的轨道坐标范围不固定,可以实时计算所有坐标的极值,再动态映射:

from ursina import *

# 模拟轨道坐标列表
orbit_coords = [
    (-11176.87, 87646, 987654),
    (12345.67, 98765, 654321),
    (-54321.12, 45678, 1234567)
]

# 计算坐标极值
min_x = min(coord[0] for coord in orbit_coords)
max_x = max(coord[0] for coord in orbit_coords)
min_y = min(coord[1] for coord in orbit_coords)
max_y = max(coord[1] for coord in orbit_coords)

# 批量创建UI元素
for idx, coord in enumerate(orbit_coords):
    ui_x = normalize_coord(coord[0], min_x, max_x, -0.9, 0.9)  # 留边距避免超出屏幕
    ui_y = normalize_coord(coord[1], min_y, max_y, -0.9, 0.9)
    Text(
        text=f"轨道{idx+1}: {coord}",
        position=(ui_x, ui_y - idx*0.1),  # 垂直排列
        origin=(0,0)
    )

app.run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:07:33