物理仿真学习笔记 第一篇:绳子(弹簧振子系统,阻尼)
基础:
1.time step:步长(更新频率)
2.spring-Mass System :弹簧振子系统(太远产生拉力, 太近产生排斥力)
3.stiffness:刚度(拉力和排斥力的大小)
4.damping:阻尼(自定义能量衰减系数)
一条绳子是由多个粒子组成,粒子包含:
1.位置 position
2.瞬时速度 velocity
3.所受到的力 force
两个粒子之间有:2.spring-Mass System :弹簧振子系统(太远产生拉力, 太近产生排斥力)
并且模拟现实物理的能量衰减:空气阻力和拉力产生的能量:4.damping:阻尼(自定义能量衰减系数)
整个类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Rope : MonoBehaviour
{public int particleCount = 20;public float particleLength = 0.1f;private List<RopeParticle> ropeParticles = new List<RopeParticle>();private Vector3 gravity = new Vector3(0, -9.81f, 0);public float damping = 0.2f;private void Start(){var pos = new Vector3(particleLength, 0, 0);for (int i = 0; i < particleCount; i++) {var ropeParticle = new RopeParticle(i * pos);ropeParticles.Add(ropeParticle);}}private void FixedUpdate(){for (int i = 1; i < particleCount; i++){var ropeParticle = ropeParticles[i];Vector3 dis = ropeParticles[i -1].position - ropeParticle.position;var offset = dis.magnitude - particleLength;var springForce = offset * dis.normalized * 1000;ropeParticle.force += springForce;ropeParticle.force += gravity;ropeParticle.force -= damping * ropeParticle.velocity;ropeParticles[i - 1].force -= springForce;}for (int i = 1; i < particleCount; i++){var ropeParticle = ropeParticles[i];ropeParticle.velocity += ropeParticle.force * Time.fixedDeltaTime;ropeParticle.position += ropeParticle.velocity * Time.fixedDeltaTime;ropeParticle.force = Vector3.zero;}}private void OnDrawGizmos(){Gizmos.color = Color.yellow;for (int i = 0;i < ropeParticles.Count; i++){if(i == 0) { continue; }Gizmos.DrawSphere(ropeParticles[i].position, 0.05f);Gizmos.DrawLine(ropeParticles[i - 1].position, ropeParticles[i].position);}}
}public class RopeParticle
{public Vector3 position;public Vector3 velocity;public Vector3 force;public RopeParticle(Vector3 position){this.position = position;}
}
效果:

