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

3D Ursina游戏中如何实现实体光照效果?

Ursina引擎实体光照效果实现指南

基础光照组件说明

Ursina内置了三类常用光照,无需额外引入依赖即可直接调用:

  • DirectionalLight:平行光,适合模拟太阳光,是FPS游戏最常用的全局主光类型
  • PointLight:点光源,适合模拟灯泡、爆炸火光这类向四周发散的局域光源
  • SpotLight:聚光灯,适合模拟手电筒、战术射灯这类有定向照射范围的光源

具体实现步骤

首先完成基础的Ursina项目初始化:

from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController

app = Ursina()
# 初始化第一人称控制器
player = FirstPersonController()

1. 添加全局环境光(推荐配置)

环境光用于给所有场景实体提供基础亮度,避免阴影区域完全死黑:

AmbientLight(
    color=color.rgb(100,100,100), 
    intensity=0.3 # 强度范围0-1,可根据场景风格调整
)

2. 配置场景主光源

以FPS常用的太阳光平行光为例:

DirectionalLight(
    parent=scene,
    position=(0, 15, 0), # 光源高空位置
    rotation=(45, 60, 0), # 照射角度,斜向下模拟阳光角度
    intensity=1.3, # 光照强度
    color=color.rgb(255, 245, 230), # 暖白色太阳光
    cast_shadow=True, # 开启光照阴影
    shadow_resolution=2048 # 阴影清晰度,数值越高性能消耗越大
)

如果需要实现手电筒功能,可将聚光灯绑定到玩家相机:

flashlight = SpotLight(
    parent=camera,
    position=(0, -0.2, 0), # 调整到视角下方贴合握持位置
    range=25, # 最远照射距离
    angle=35, # 照射锥角,角度越大照射范围越宽
    intensity=2.1,
    color=color.white,
    cast_shadow=True
)
# 按F键切换手电筒开关
def input(key):
    if key == 'f':
        flashlight.enabled = not flashlight.enabled

3. 给实体开启光照接收

默认Ursina实体已开启光照接收,如果是自定义材质实体可手动配置参数:

# 示例地面实体配置
ground = Entity(
    model='plane',
    texture='grass',
    scale=64,
    receive_light=True, # 开启接收光照
    cast_shadow=True # 开启实体投射阴影
)

# 示例第一人称武器配置
gun = Entity(
    parent=camera,
    model='ak47',
    texture='ak47_tex',
    position=(0.6, -0.3, 1.2),
    receive_light=True,
    light_strength=0.9 # 单独调整该实体接收光照的强度,避免过曝
)

常见效果调整方案

  • 阴影过于模糊:调大光源的shadow_resolution参数,最高可设为4096
  • 远处物体不显示阴影:调大平行光的shadow_distance参数
  • 光照叠加后实体颜色失真:调低光源intensity参数,或调整实体材质的color属性平衡色调

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:36:08