1 前言

质点弹簧系统的模拟仿真,其实非常简单,核心就是牛顿第二定律 \(F = ma\), 以及一些数值积分,所要做的无非就是对每一个质点计算附加的力,力是矢量,速度是矢量,加速度也是矢量。

计算出力后,算出加速度,利用一个很小的时间,更新一下位置就好根据位置进行渲染。

下一个循环将力清零,开始重新计算合力。

显示欧拉和半隐式欧拉其实就是计算速度和位置的顺序变了一下,显示欧拉效果奇差无比,半隐式欧拉效果却非常好。至于Verlet Intergration是根据半隐式欧拉推导来的,比较难理解的是它需要做一些约束。

2 基础数据结构

核心的数据就是,位置,质量,速度,力。

struct Mass {
Mass(Vector2D position, float mass, bool pinned)
: start_position(position), position(position), last_position(position),
mass(mass), pinned(pinned) {} float mass;
bool pinned; Vector2D start_position;
Vector2D position; // explicit Verlet integration Vector2D last_position; // explicit Euler integration Vector2D velocity;
Vector2D forces;
};

3 欧拉

核心的差距就是先更新速度还是先更新位置。

// explicit Euler
m->position = m->position + m->velocity * delta_t;
m->velocity = m->velocity + acc * delta_t;
// semi-implicit Euler
m->velocity = m->velocity + acc * delta_t;
m->position = m->position + m->velocity * delta_t;

4 Verlet Integration

这个就是从semi-implicit Euler里推导出来的。

Vector2D temp_position = m->position;
// t + 1 t
m->position = m->position + (m->position - m->last_position) + acc * delta_t * delta_t; // t-1 t
m->last_position = temp_position;

4.1 Constraints

Constraints的基础模型就是棍子小球模型,需要注意的是先处理小球再根据小球位置处理棍子长度。

			Vector2D vec_now = s->m2->position - s->m1->position;
// if length_now bigger than rest we need to plus at m1 minus at m2
float length = (s->m2->position - s->m1->position).norm(); float diff = length - s->rest_length; // Althougth this will not matian the length, but it's a very quick approach!
// eg : (if only one of them two are pinned, the other will just + or - half-diff)
// if(!s->m1->pinned) s->m1->position += vec_now.unit() * diff * 0.5;
// if(!s->m2->pinned) s->m2->position -= vec_now.unit() * diff * 0.5; if(!s->m1->pinned && !s->m2->pinned){
s->m1->position += vec_now.unit() * diff * 0.5;
s->m2->position -= vec_now.unit() * diff * 0.5;
}else if(s->m1->pinned && !s->m2->pinned){
// for just one pinned, the other will be shrink or extended the full diff
s->m2->position -= vec_now.unit() * diff;
}else if(!s->m1->pinned && s->m2->pinned){
s->m1->position += vec_now.unit() * diff;
}

Verlet Integration pikuma from youtube. https://www.youtube.com/watch?v=-GWTDhOQU6M

物理动画仿真渲染:http://datagenetics.com/blog/july22018/index.html

  • Tips: 忽然发现 Verlet Integration 的实现出了问题,核心的算法没有问题,但是关于多个弹簧链接起来更新算法有些问题,和一个弹簧的模型不太一样。

    会发现只有一个固定点,后面弹簧的长度更新会影响到前一个已经更新弹簧的位置。所以为了修正这种bug,我们可以把固定点进行传递。
伪代码:
首端固定
弹簧1:更新位置。
弹簧1:尾端(下一个弹簧2的首端)固定。//阻止下一个弹簧更新的影响
弹簧2:更新位置
弹簧2:尾端(下一个弹簧3的首端)固定。首端固定解除(恢复原样)。
...

Games101 作业8 质点弹簧系统的更多相关文章

  1. Day4作业:蛋疼CRM系统

    先上流程图,还得27寸4K显示器,画图各种爽: ReadMe: 运行程序前的提示: 1.抱歉,你得装prettytable模块...... 2.还得抱歉,如果shell中运行,最好把字体调得小点,表格 ...

  2. 团队作业3--需求改进&系统

    需求改进&系统设计 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 这个作业的目标 需求改进&系统设计 目录 需求改进&系统设计 需求&原型改进 针对课堂 ...

  3. C++ 大作业 超市收银系统

    #include<iostream> #include<fstream> #include<string> #include<iomanip> #inc ...

  4. python第三十五天-----作业完成--学校选课系统

    选课系统:角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含, ...

  5. GAMES101作业2

    作业任务: 填写并调用函数 rasterize_triangle(const Triangle& t). 即实现光栅化 该函数的内部工作流程如下: 创建三角形的 2 维 bounding bo ...

  6. 《OD学hadoop》第一周0625 LINUX作业一:Linux系统基本命令(一)

    1. 1) vim /etc/udev/rules.d/-persistent-net.rules vi /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE= ...

  7. Java课后作业之石家庄地铁系统PSP表格20190403

    PSP2.1 Personal Software Process Stages Time Planning 计划 36 hours · Estimate · 估计这个任务需要多少时间 36 hours ...

  8. 【python之路34】面向对象作业之学生选课系统

    一.需求: 1.可以注册管理员账号,管理员账号可以创建老师和课程 2.学生可以注册和登陆,学生可以从课程列表选课,可以进行上课登记查看 二.代码 1.文件目录 bin 存放可执行文件 config 存 ...

  9. Java Web之网上购物系统(注册、登录、浏览商品、添加购物车)

    眼看就要期末了,我的专业课也迎来了第二次的期末作业---------<网上购物系统>.虽然老师的意图是在锻炼我们后台的能力,但是想着还是不利用网上的模板,准备自己写,以来别人写的静态页看不 ...

  10. 解析大型.NET ERP系统 企业信息化实施人员工具箱

    1 第一次实施会议 当签订合同之后,软件公司与客户约定好会议时间,双方召开第一次实施会议,确定实施的小组人员名单,项目实施周期,培训计划表,实施主计划,系统预备主文件数据准备,软件公司技术支持联系方式 ...

随机推荐

  1. 在vscode中通过修改launch.json文件为项目添加启动参数——在launch.json文件中修改args变量

    以前一直在使用pycharm,不管怎么说毕竟国内外的Python编程者大部分都更支持pycharm,并且认为pycharm是Python语言编程中最好用的编辑器,但是随着国内编程人员一茬一茬的兴起很多 ...

  2. 突破单点瓶颈、挑战海量离线任务,Apache Dolphinscheduler在生鲜电商领域的落地实践

    ​ 点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler 精彩回顾 近期,食行生鲜的数据平台工程师单葛尧在社区线上 ...

  3. Visual Studio C++ 安装以及使用教程

    官网下载网址 https://visualstudio.microsoft.com/zh-hans/ Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (micr ...

  4. Win32 滚动条控件

    1.创建控件 HWND hScrollBar = ::CreateWindow( WC_SCROLLBAR,                           //控件类名 NULL,        ...

  5. hass安装tileboard详细

    首先下载tileboard https://github.com/resoai/TileBoard/releases/download/v2.10.2/TileBoard.zip 下载之后前往hass ...

  6. 使用 setenv 配置文件管理 Tomcat 的自定义环境变量

    1.背景描述 有时候,我们会在 catalina.bat 或 catalina.sh 文件中,自定义一些环境变量,例如额外指定 JDK 路径或设置 JVM 参数. 实际上,直接在 catalina.b ...

  7. 调用微信红包接口,本地可以服务器不可以。 请求被中止: 未能创建 SSL/TLS 安全通道

    微信红包的地址接口地址是: https://api.mch.weixin.qq.com/pay/micropay 当时造成这个不能用的原因是:我把服务器从windows server 2008升级到w ...

  8. 游戏AI行为决策——Behavior Tree(行为树)

    游戏AI行为决策--行为树 前言 行为树,是目前游戏中应用较为广泛的一种行为决策模型.这离不开它成熟的可视化编辑工具,例如Unity商城中的「Behaviour Designer」,甚至是虚幻引擎也自 ...

  9. IP地址集中管控:从分配规划、现网管理到合规性监测、准入控制全周期监管

    当前,网络已成为企业必不可少的资源,企业网络系统也在不断扩展,IP地址数量不断增长,随之而来的是IP地址管理问题凸显.如何高效集中地管理网络中的IP地址,IP如何有效划分,成为影响企业网络可用性和质量 ...

  10. 树莓派2 CentOS7.9 安装配置笔记

    1. 镜像下载与安装 http://isoredirect.centos.org/altarch/7/isos/armhfp/找到https://mirrors.tuna.tsinghua.edu.c ...