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 第一次实施会议 当签订合同之后,软件公司与客户约定好会议时间,双方召开第一次实施会议,确定实施的小组人员名单,项目实施周期,培训计划表,实施主计划,系统预备主文件数据准备,软件公司技术支持联系方式 ...
随机推荐
- 再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(6) —— Python版本实现的《2048》游戏环境运行性能对比
<2048>游戏在线试玩地址: https://play2048.co/ 如何解决<2048>游戏源于外网的一个讨论帖子,而这个帖子则是讨论如何解决该游戏的最早开始,可谓是&q ...
- Spring AI 更新:支持OpenAI的结构化输出,增强对JSON响应的支持
就在昨晚,Spring AI发了个比较重要的更新.由于最近OpenAI推出了结构化输出的功能,可确保 AI 生成的响应严格遵守预定义的 JSON 模式.此功能显着提高了人工智能生成内容在现实应用中的可 ...
- 【CDQ分治】【模板】三维偏序(陌上花开)
P3810 [模板]三维偏序(陌上花开) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc++.h> using namespace ...
- Linux下简单几步安装AI开发环境-ROS(超有意思)
机缘巧合,接触到了一个开源的项目ROS,只需要根据一口君的操作,就可以很容易搭建一个具有3d效果的开发环境,非常有意思,和大家分享下. 0.什么是ROS ROS(Robot Operating Sys ...
- 【1】Kaggle赛题解读:RSNA 2024 Lumbar Spine Degenerative Classification
赛题名称:RSNA 2024 Lumbar Spine Degenerative Classification 中文:腰椎退行性病变分类 kaggle官网赛题链接:https://www.kaggle ...
- Linux-mknod命令
mknod 创建块设备或者字符设备文件.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 用法: mknod [选项]... 名称 类型 ...
- SSH 免密登录 Windows
安装并启动 OpenSSH 服务器 在开始之前请确保你的远程 Windows 已经安装了 OpenSSH 服务器.若没有安装,请在 设置 > 系统 > 可选功能 > 添加可选功能 中 ...
- APT 使用
使用 Ubuntu 包搜索器 apt 命令 功能 apt install 安装软件包 apt remove 移除软件包 apt purge 移除软件包及配置文件 apt update 刷新存储库索引 ...
- 【Python】之pip安装第三方库失败
一直报错:Could not fetch URL https://pypi.org/simple/pygame/: There was a problem confirming the ssl cer ...
- uni-app 小程序 前置摄像头
在小程序拍照的话,uni.chooseImage()可以直接调取摄像头拍照,而如果要调用前置摄像头,这个api就没有提供了. 在查找官方文档发现,可以通过camera有提供这么一个组件,页面内嵌的区域 ...