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

如何在MonoGame(C#)中旋转向量光源模拟日光效果?

在MonoGame中通过旋转向量模拟日光效果的实现方案

要实现围绕物体旋转光源模拟日光,核心是通过矩阵旋转变换更新光源的前向向量,以下是具体可行的实现步骤:

1. 核心逻辑梳理

日光模拟通常围绕物体的垂直Y轴旋转(对应现实中地球自转的太阳轨迹),通过随时间递增的旋转角度,对初始光源向量进行持续变换,得到动态的光源方向。

2. 基础旋转实现代码

先定义初始光源方向、旋转速度,再在Update方法中随时间计算旋转后的向量:

// 初始光源前向方向(你提供的示例向量)
private Vector3 _initialLightDir = new Vector3(-0.7f, -1f, -0.5f);
// 旋转速度(弧度/秒,数值越小旋转越慢,可按需调整)
private float _rotateSpeed = 0.2f;
// 存储当前旋转后的光源方向
private Vector3 _currentLightDir;

protected override void Update(GameTime gameTime)
{
    // 计算从游戏启动到现在的累计旋转角度
    float totalRotation = (float)gameTime.TotalGameTime.TotalSeconds * _rotateSpeed;
    
    // 创建绕Y轴的旋转矩阵
    Matrix rotateMatrix = Matrix.CreateRotationY(totalRotation);
    
    // 将初始向量应用旋转变换,得到当前光源方向
    _currentLightDir = Vector3.Transform(_initialLightDir, rotateMatrix);
    
    // 必须归一化:多次旋转变换可能导致向量长度变化,影响光照强度
    _currentLightDir.Normalize();

    base.Update(gameTime);
}

3. 进阶:模拟真实日光的高度变化

如果要模拟日出到日落的太阳高度变化,可以同时添加绕X轴的仰角旋转,让光源不仅绕Y轴水平旋转,还能周期性上下移动:

protected override void Update(GameTime gameTime)
{
    float time = (float)gameTime.TotalGameTime.TotalSeconds;
    // 绕Y轴的水平旋转角度
    float yRotation = time * _rotateSpeed;
    // 绕X轴的仰角:用正弦函数模拟周期性的高度变化(范围可调整)
    float xRotation = (float)Math.Sin(time * 0.1f) * MathHelper.PiOver4;

    // 先创建仰角旋转矩阵,再创建水平旋转矩阵
    Matrix elevationMatrix = Matrix.CreateRotationX(xRotation);
    Matrix rotationMatrix = Matrix.CreateRotationY(yRotation);

    // 先应用仰角变换,再应用水平旋转
    Vector3 tempDir = Vector3.Transform(_initialLightDir, elevationMatrix);
    _currentLightDir = Vector3.Transform(tempDir, rotationMatrix);
    _currentLightDir.Normalize();

    base.Update(gameTime);
}

4. 应用到光照系统

将计算好的_currentLightDir传入你的着色器或光照Effect中,比如使用BasicEffect时:

// 假设你已初始化BasicEffect实例
_basicEffect.Parameters["LightDirection"].SetValue(_currentLightDir);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:00:06