作业八

要求

本次作业基本要求是三选一

  1. 简单粒子制作

    按参考资源要求,制作一个粒子系统,参考资源

    使用 3.3 节介绍,用代码控制使之在不同场景下效果不一样

  2. 完善官方的“汽车尾气”模拟

    使用官方资源资源 Vehicle 的 car, 使用 Smoke 粒子系统模拟启动发动、运行、故障等场景效果

  3. 参考 http://i-remember.fr/en 这类网站,使用粒子流编程控制制作一些效果, 如“粒子光环”

本次作业,我们选择第三个题目进行完成。

代码部分

  1. 我们要首先定义一个新的结构CirclePosition,用以记录每个粒子的当前半径、角度和时间,其中时间是做游离运动需要的
public class CirclePosition
{
    public float radius = 0f, angle = 0f, time = 0f;

    public CirclePosition(float radius, float angle, float time)
    {
        this.radius = radius;
        this.angle = angle;
        this.time = time;
    }
}
  1. 然后我们需要预设粒子系统和粒子活动的一些系数,包括粒子的数量、大小、半径、旋转方向等等变量,并使用我们之前定义好的CirclePosition保存每个粒子对应的属性:
public int count = 10000;                                               // number of particles
public bool clockwise = true;                                           // towards
public float size = 0.03f;                                              // size of particles
public float minRadius = 5.0f;                                          // min radius
public float maxRadius = 12.0f;                                         // max radius
public float speed = 2f;                                                // speed
public float maxRadiusChange = 0.02f;                                   // range
private NormalDistribution normalGenerator = new NormalDistribution();  // generator
public Color startColor = Color.blue;                                   // color
  1. 执行初始化设置,粒子活动由编程控制,我们将粒子各个属性进行预设,包括初始速度设置成0,设置初始大小、最大粒子数量等等:
void Start()
{
    particleArr = new ParticleSystem.Particle[count];
    circle = new CirclePosition[count];

    particleSys = this.GetComponent<ParticleSystem>();
    var main = particleSys.main;
    main.startSpeed = 0;
    main.startSize = size;          
    main.loop = false;
    main.maxParticles = count;      
    particleSys.Emit(count);             
    particleSys.GetParticles(particleArr);

    RandomlySpread();                   // init position 
}
  1. RandomlySpread函数中,我们将所有的粒子随机分布在圆圈轨道上,这里要使用极坐标法生成符合高斯分布的伪随机数,所以我们先定义一个NormalDistribution的类:
public class NormalDistribution
{
    // The polar method
    private bool _hasDeviate;
    private double _storedDeviate;
    private readonly Random _random;

    public NormalDistribution(Random random = null)
    {
        _random = random ?? new Random();
    }

    public double NextGaussian(double mu = 0, double sigma = 1)
    {
        if (sigma <= 0)
            throw new ArgumentOutOfRangeException("sigma", "Must be greater than zero.");

        if (_hasDeviate)
        {
            _hasDeviate = false;
            return _storedDeviate * sigma + mu;
        }

        double v1, v2, rSquared;
        do
        {
            v1 = 2 * _random.NextDouble() - 1;          // two random values between -1.0 and 1.0
            v2 = 2 * _random.NextDouble() - 1;
            rSquared = v1 * v1 + v2 * v2;
        } while (rSquared >= 1 || rSquared == 0);       // ensure within the unit circle

        var polar = Math.Sqrt(-2 * Math.Log(rSquared) / rSquared);  // calculate polar tranformation for each deviate
        _storedDeviate = v2 * polar;
        _hasDeviate = true;
        return v1 * polar * sigma + mu;
    }
}
  1. 使用刚才的类,利用高斯分布生成半径,均值为midRadius,标准差为0.7
float midRadius = (maxRadius + minRadius) / 2;
float radius = (float)normalGenerator.NextGaussian(midRadius, 0.7);

其他的参数我们也利用随机数的方式进行生成:

float angle = Random.Range(0.0f, 360.0f);
float theta = angle / 180 * Mathf.PI;
float time = Random.Range(0.0f, 360.0f);
float radiusChange = Random.Range(0.0f, maxRadiusChange);

材质和效果

设置好代码之后,我们还需要添加一些初始的颜色,形状等属性

  • 粒子光圈的参数设置

    主要是设置粒子多少、大小、初始颜色等刚才我们写成public的属性值:
    在这里插入图片描述

  • 然后针对粒子系统面板的属性进行设置:
    在这里插入图片描述
    粒子的发射设置:
    在这里插入图片描述
    粒子的形状设置:
    在这里插入图片描述
    粒子的渲染设置:
    在这里插入图片描述
    最后,我们还需要调整摄像机的属性,为了能够清楚地看到粒子效果,我们需要将摄影机模式改成Solid Color并调整背景颜色为黑色,适当调整Y值和旋转之后,如下所示:
    在这里插入图片描述

效果展示

最终我们看到的粒子效果如下所示:
在这里插入图片描述

一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
GAMES101作业8是一个计算机图形学课程的作业项目。根据引用中提供的信息,该作业涉及到源代码和GitHub链接,供有兴趣的朋友自行尝试。而引用中给出了Rope类的一个成员函数simulateVerlet的实现代码,该函数用于模拟绳子的Verlet算法。该算法通过更新质点的位置和速度来模拟绳子的运动。具体的实现细节可以参考引用中的代码。 另外,根据引用中的说明,这个作业可能存在一些问题,因为作业PDF中的内容不完整。但是作者在终端运行了一些代码来安装必要的库。所以在尝试运行作业前,建议先确保所需的库已经安装好。 总的来说,GAMES101作业8是一个涉及计算机图形学的作业项目,具体的内容和实现可以参考引用和引用[2]中的信息和代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【GAMES101】作业8 显式/半隐式欧拉与Verlet方法模拟绳子运动(含GIF)](https://blog.youkuaiyun.com/ycrsw/article/details/124565133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [GAMES101作业(08)- 质点弹簧系统(编译坑)](https://blog.youkuaiyun.com/weixin_43399489/article/details/122002171)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值