Games101 作业8 质点弹簧系统
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 质点弹簧系统的更多相关文章
- Day4作业:蛋疼CRM系统
先上流程图,还得27寸4K显示器,画图各种爽: ReadMe: 运行程序前的提示: 1.抱歉,你得装prettytable模块...... 2.还得抱歉,如果shell中运行,最好把字体调得小点,表格 ...
- 团队作业3--需求改进&系统
需求改进&系统设计 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 这个作业的目标 需求改进&系统设计 目录 需求改进&系统设计 需求&原型改进 针对课堂 ...
- C++ 大作业 超市收银系统
#include<iostream> #include<fstream> #include<string> #include<iomanip> #inc ...
- python第三十五天-----作业完成--学校选课系统
选课系统:角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含, ...
- GAMES101作业2
作业任务: 填写并调用函数 rasterize_triangle(const Triangle& t). 即实现光栅化 该函数的内部工作流程如下: 创建三角形的 2 维 bounding bo ...
- 《OD学hadoop》第一周0625 LINUX作业一:Linux系统基本命令(一)
1. 1) vim /etc/udev/rules.d/-persistent-net.rules vi /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE= ...
- Java课后作业之石家庄地铁系统PSP表格20190403
PSP2.1 Personal Software Process Stages Time Planning 计划 36 hours · Estimate · 估计这个任务需要多少时间 36 hours ...
- 【python之路34】面向对象作业之学生选课系统
一.需求: 1.可以注册管理员账号,管理员账号可以创建老师和课程 2.学生可以注册和登陆,学生可以从课程列表选课,可以进行上课登记查看 二.代码 1.文件目录 bin 存放可执行文件 config 存 ...
- Java Web之网上购物系统(注册、登录、浏览商品、添加购物车)
眼看就要期末了,我的专业课也迎来了第二次的期末作业---------<网上购物系统>.虽然老师的意图是在锻炼我们后台的能力,但是想着还是不利用网上的模板,准备自己写,以来别人写的静态页看不 ...
- 解析大型.NET ERP系统 企业信息化实施人员工具箱
1 第一次实施会议 当签订合同之后,软件公司与客户约定好会议时间,双方召开第一次实施会议,确定实施的小组人员名单,项目实施周期,培训计划表,实施主计划,系统预备主文件数据准备,软件公司技术支持联系方式 ...
随机推荐
- 微信支付APIV3私钥与证书配置
1.加载商户私钥(privateKey:私钥字符串) 这个私钥是下载证书的的:apiclient_key.pem 2.转换下单时的证书 文档:https://github.com/wechatpay- ...
- 2024年Apache DolphinScheduler RoadMap:引领开源调度系统的未来
非常欢迎大家来到Apache DolphinScheduler社区!随着开源技术在全球范围内的快速发展,社区的贡献者 "同仁" 一直致力于构建一个强大而活跃的开源调度系统社区,为用 ...
- 利用标准IO函数接口实现文件拷贝
把本地磁盘的文件A中的数据完整的拷贝到另一个文本B中,如果文本B不存在则创建,要求文本A的名称和文本B的名称通过命令行传递,并进行验证是否正确. /************************** ...
- 03-canvas线条属性
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- Fluent Editor:一个基于 Quill 2.0 的富文本编辑器,功能强大、开箱即用!
你好,我是 Kagol,个人公众号:前端开源星球. 今年4月份,听到 Quill 2.0 正式发布的消息,我心情非常激动,立马体验了下,并写了一篇文章. 重回铁王座!时隔5年!Quill 2.0 终于 ...
- k8s pvc扩容
#查看是否支持扩容 $ kubectl get sc ** -o yaml ··· allowVolumeExpansion: true #拥有该字段表示允许动态扩容 ··· #找到需要扩容的pvc ...
- LaTeX 常用引用标签前缀
引用对象 标签前缀 Chapter ch Section sec Subsection sec Appendix app Figure fig Table tab List item itm Equa ...
- .NET 8.0 前后分离快速开发框架
前言 大家好,推荐一个.NET 8.0 为核心,结合前端 Vue 框架,实现了前后端完全分离的设计理念.它不仅提供了强大的基础功能支持,如权限管理.代码生成器等,还通过采用主流技术和最佳实践,显著降低 ...
- Pointer Event Api-整合鼠标事件、触摸和触控笔事件
Pointer Events API 是Hmtl5的事件规范之一,它主要目的是用来将鼠标(Mouse).触摸(touch)和触控笔(pen)三种事件整合为统一的API. Pointer Event P ...
- webpack笔记-webpack初识与构建工具发展(一)
为什么需要构建工具? 转换 ES6 语法 转换 JSX CSS 前缀补全/预处理器 压缩混淆 图片压缩 前端构建演变之路 ant + YUI Tool grunt gulp.fis3 webpack. ...