这是太极图形第一季的大作业
做这个东西主要是因为对物理引擎比较感兴趣,正好学了sph,再加上自己以前写过的小玩意,就尝试把他们结合起来,可能物理上并不太正确,但是效果还可以接受。 对于sph部分,由于自己实现的时候遇到了许多的障碍,所以最终还是借用不少了助教sph的写法。 参考资料,百度随便看了看,找了一点点灵感,比如对于边界粒子设置权重,其他的都是摸索着写的
论坛gif是随便搭的一个样例,实际操作的自由度还是比较高的
结构嘛。。。 对于python我习惯于把代码都写在一个文件里了,简单描述一下,第一大部分是sph的计算,第二大部分是耦合进来的圆形,第三大部分是弹簧质点系统,之后有不少函数是对于粒子的增删改,最后一大部分是交互的部分,由于我希望把它做的完善一些,更像个沙盒,所以交互代码写了不少
-README.MD
-xixi.py
p:暂停开关
鼠标左键按住:可以吸引一个被选择的圆形
ctrl+鼠标左键点击:添加一个不连接弹簧的圆形
shift+左键点击:选择一个圆形,之后可以拉动它,或者改变固定状态
鼠标右键点击:添加一个自动链接弹簧的圆形(链接距离,弹簧长度可调)
ctrl+鼠标右键点击:添加一个固定位置的,自动连接弹簧的圆形,
shift+C:之后生成的圆形半径增大(除了轮子上的圆)
ctrl+C:之后生成的圆形半径减小
shift+E:之后单独生成的圆形弹簧的长度增大
ctrl+E:之后单独生成的圆形弹簧的长度减小
shift+D:之后单独生成的圆形弹簧的探测距离增大
ctrl+D:之后单独生成的圆形弹簧的探测距离减小
F:切换被选择的圆的固定状态,可以将活动的圆形设置为固定,将固定的圆设置为可活动
H:在鼠标的位置,生成一个由圆组成的弹性体矩形,参数可调
shift+W:弹性矩形宽度增加
ctrl+W:弹性矩形宽度减小
shift+S:弹性矩形高度增加
ctrl+S:弹性矩形高度减小
M+鼠标右键:生成一个构造好的弹性轮子(参数可调)
N:让上一个生成的轮子开始转动
shift+X:轮子中,圆的链接距离增大,轮子架子变大
ctrl+X:轮子中,圆的链接距离减小,轮子架子变小
shift+0:轮子上的圆形,半径增大
ctrl+0:轮子上的圆形,半径减小
按住J+鼠标右键:在屏幕上点击两点,生成一个首尾被固定的圆形链子(参数可调)
shift+T:链子粒度增大
ctrl+T:链子粒度减小
shift+G:链子的弹簧半径比增大,等于硬度减小
ctrl+G:链子的弹簧半径比减小,等于硬度增大
R:清除所有的圆形,包括弹性物体
O:生成一个液体矩形(参数可调)
shift+W:液体矩形宽度增加
ctrl+W:液体矩形宽度减小
shift+S:液体矩形高度增加
ctrl+S:液体矩形高度减小
ctrl+1:打开或关闭一号水龙头
按住1+鼠标右键:在屏幕上点击两点,设置水龙头姿态和流速
ctrl+2:打开或关闭二号水龙头
按住2+鼠标右键:在屏幕上点击两点,设置水龙头姿态和流速
按住L+鼠标右键:在屏幕上点击两点,画出一条固定的边界,粒子构成的线
按住V+鼠标右键:将一定范围内作为边界的粒子变为流体,起到擦除画线的作用
shift+V:橡皮擦的半径增大
ctrl+V:橡皮擦的半径减小
B:所有作为边界的粒子变为流体
ctrl+B:上一个画出来的线变为流体
Y:切换之后添加的液体为重力向下,或者反重力的液体
Z:删除上一个圆形
ctrl+Z:开始清除流体粒子
shift+Z:删除上一个用边界粒子画出来的线
操作技巧: 对于第一次运行,可以查看main函数末尾,有一段被注释的画线代码,第一次玩可以解开注释看看弹簧是怎么构造的,但是弹簧一多,会严重拖累性能
Ctrl左键放一个圆形,按住shift左键去点击它,可以选中,之后鼠标左键可以吸引它,可以在一堆圆中选择想要的那个。
m加右键放一个轮子,轮子的中心点可以被选中,然后解除固定,也可以通过右键往轮子上加新的结构。
L加右键画边界,画得不好可以shift+z撤销
普通z可以撤销上一个圆
多次按z可以去除弹性矩形或者轮子
o键放水最好不要与其他东西重合,否则会崩出来很多高速粒子
水龙头不用关闭即可,可以重复更新姿态
对于橡皮擦功能的用法,可以画一条长线,然后用橡皮擦开孔,扣出想要的形状
直接运行xixi.py即可