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 第一次实施会议 当签订合同之后,软件公司与客户约定好会议时间,双方召开第一次实施会议,确定实施的小组人员名单,项目实施周期,培训计划表,实施主计划,系统预备主文件数据准备,软件公司技术支持联系方式 ...
随机推荐
- 国产操作系统——银河麒麟V10 SP1使用小结
前几天看新闻国产操作系统银河麒麟有了新的更新于是上手搞了一个. ========================================================= 该系统自带驱动,其中 ...
- 【转载】 实时调度论文中经常出现的术语 ties broken arbitrary的意思 —— 看伪代码时出现 ties broken arbitrary
看伪代码时突然看到这样的一个Ps标注, ties broken arbitrary, 不明白是啥意思,后来看到下文:https://blog.csdn.net/kangkanglhb88008/ar ...
- springboot项目启动时禁止Redis、数据对象加载
1.背景 2.实现方式 启动类上添加需要排除的自动装配对象 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, H ...
- 由浅深入理解java多线程,java并发,synchronized实现原理及线程锁机制
由浅深入理解java多线程,java并发,synchronized实现原理及线程锁机制 目录 由浅深入理解java多线程,java并发,synchronized实现原理及线程锁机制 一,线程的生命周期 ...
- SMU Summer 2024 Contest Round 8
SMU Summer 2024 Contest Round 8 Product 思路 注意到 \(\prod\limits_{i=1}^NL_i\le10^5\),也就是说 N 不会超过 16,因为 ...
- ARM指令和Thumb指令的区别
ARM处理器的工作状态 https://blog.csdn.net/itismine/article/details/4753701?depth_1-utm_source=distribute.pc_ ...
- 安卓如何设置开机启动某个程序?init.rc给你搞定
一.如何设置开机启动某个程序? 1.需求描述 最近有个项目需要在Android开机启动之后,自动执行一个C语言编写的程序:pengd 该程序运行时需要修改网络ip地址及其他网络操作,所以需要root权 ...
- Docker不同宿主机网络打通
本方式使用docker Swarm集群的方式创建overlay 网络进行打通 背景 因java微服务使用nacos做配置中心,为了解决Nacos服务注册使用Docker容器内网ip问题,使用此方案 前 ...
- AvaloniaChat-v0.0.2:兼容智谱AI 快速使用指南
智谱AI介绍 北京智谱华章科技有限公司(简称"智谱AI")致力于打造新一代认知智能大模型,专注于做大模型的中国创新.公司合作研发了中英双语千亿级超大规模预训练模型GLM-130B, ...
- 甲方扔给两个存在包名与类名均相同的Jar包,要在工程中同时使用怎么办?
你的项目是否曾遇到过有jar包冲突,而这些冲突的jar包又必须同时存在的情况?一般来说,jar 冲突都是因不同的上层依赖项,自身又依赖了相同 jar 包的不同版本所致,解决办法也都是去除其中一个即可. ...