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. 微信支付APIV3私钥与证书配置

    1.加载商户私钥(privateKey:私钥字符串) 这个私钥是下载证书的的:apiclient_key.pem 2.转换下单时的证书 文档:https://github.com/wechatpay- ...

  2. 2024年Apache DolphinScheduler RoadMap:引领开源调度系统的未来

    非常欢迎大家来到Apache DolphinScheduler社区!随着开源技术在全球范围内的快速发展,社区的贡献者 "同仁" 一直致力于构建一个强大而活跃的开源调度系统社区,为用 ...

  3. 利用标准IO函数接口实现文件拷贝

    把本地磁盘的文件A中的数据完整的拷贝到另一个文本B中,如果文本B不存在则创建,要求文本A的名称和文本B的名称通过命令行传递,并进行验证是否正确. /************************** ...

  4. 03-canvas线条属性

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  5. Fluent Editor:一个基于 Quill 2.0 的富文本编辑器,功能强大、开箱即用!

    你好,我是 Kagol,个人公众号:前端开源星球. 今年4月份,听到 Quill 2.0 正式发布的消息,我心情非常激动,立马体验了下,并写了一篇文章. 重回铁王座!时隔5年!Quill 2.0 终于 ...

  6. k8s pvc扩容

    #查看是否支持扩容 $ kubectl get sc ** -o yaml ··· allowVolumeExpansion: true #拥有该字段表示允许动态扩容 ··· #找到需要扩容的pvc ...

  7. LaTeX 常用引用标签前缀

    引用对象 标签前缀 Chapter ch Section sec Subsection sec Appendix app Figure fig Table tab List item itm Equa ...

  8. .NET 8.0 前后分离快速开发框架

    前言 大家好,推荐一个.NET 8.0 为核心,结合前端 Vue 框架,实现了前后端完全分离的设计理念.它不仅提供了强大的基础功能支持,如权限管理.代码生成器等,还通过采用主流技术和最佳实践,显著降低 ...

  9. Pointer Event Api-整合鼠标事件、触摸和触控笔事件

    Pointer Events API 是Hmtl5的事件规范之一,它主要目的是用来将鼠标(Mouse).触摸(touch)和触控笔(pen)三种事件整合为统一的API. Pointer Event P ...

  10. webpack笔记-webpack初识与构建工具发展(一)

    为什么需要构建工具? 转换 ES6 语法 转换 JSX CSS 前缀补全/预处理器 压缩混淆 图片压缩 前端构建演变之路 ant + YUI Tool grunt gulp.fis3 webpack. ...