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

Ursina恐怖游戏中PointLight定位与亮度调节问题求助

Ursina手电筒灯光问题解决方案:跟随玩家+亮度调节

一、原PointLight配置的核心错误

你的代码里有几个关键问题导致灯光不显示:

  • parent=camera.ui:camera.ui是2D UI层级的父节点,3D灯光必须挂载到camera或玩家实体上,才能在3D世界中生效
  • color = color.rgba(100, 2, 100, 0):alpha通道设为0会让灯光完全透明,改为255才能正常显示;另外颜色偏紫,建议改成暖白色更符合手电筒效果
  • rotation = (0, 184, 0):PointLight是点光源,向四周均匀发光,没有照射方向属性,rotation设置完全无效
  • 固定position:硬编码的位置不会跟随玩家,需设置为相机/玩家的相对位置

二、实现灯光跟随玩家的两种方法

方法1:直接挂载父节点(无需update函数,推荐)

将灯光的parent设为相机或玩家实体,灯光会自动同步位置和朝向:

# 用SpotLight实现手电筒聚光效果(比PointLight更适合)
flashlight = SpotLight(
    parent=camera,
    position=(0, 0, -1),  # 相机前方1单位的位置,贴合手电筒握持感
    color=color.rgba(255,255,220,255),
    intensity=3,
    shadows=True,
    angle=25,  # 聚光角度,数值越小光线越集中
    distance=20  # 光照有效距离
)

# 如果坚持用PointLight(仅做跟随点光源,无定向效果)
point_light = PointLight(
    parent=camera,
    position=(0,0,-2),
    color=color.white,
    intensity=2,
    shadows=True
)

方法2:用update函数动态同步(适合需要额外逻辑的场景)

如果需要自定义偏移或动态调整逻辑,在update函数中同步灯光位置和朝向:

from ursina import *

player = FirstPersonController(position=(0,0,0))
flashlight = SpotLight(color=color.white, shadows=True)

def update():
    # 将灯光位置设为玩家前方1单位
    flashlight.position = player.position + player.forward * 1
    # 让灯光朝向玩家前方10单位的点,实现定向照射
    flashlight.look_at(player.position + player.forward * 10)

三、调节灯光亮度

所有灯光类型(PointLight/SpotLight/DirectionalLight)都通过intensity属性调节亮度,默认值为1,数值越大亮度越高:

# 例:将手电筒亮度设为默认的3倍
flashlight.intensity = 3

四、完整可运行代码示例

from ursina import *

app = Ursina()

# 创建第一人称玩家
player = FirstPersonController(
    model='cube',
    color=color.gray,
    position=(0, 0, 0),
    speed=5
)

# 场景环境(用于测试光照效果)
ground = Entity(model='plane', scale=30, color=color.dark_gray, texture='white_cube', texture_scale=(30,30))
walls = [
    Entity(model='cube', position=(10,0,0), scale=(1,3,30), color=color.gray),
    Entity(model='cube', position=(-10,0,0), scale=(1,3,30), color=color.gray),
    Entity(model='cube', position=(0,0,10), scale=(20,3,1), color=color.gray),
]

# 手电筒聚光灯
flashlight = SpotLight(
    parent=camera,
    position=(0, 0, -1),
    color=color.rgba(255,255,220,255),
    intensity=3,
    shadows=True,
    angle=25,
    distance=20
)

app.run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:20:21