我看到3B1B视频计算pi的碰撞块 所以我很好奇如果3个方块相撞,会发生什么?如果块的数量扩展到 n,碰撞会发生什么情况?
我以为两个方块的动能之和是常数,所以在三个方块中可以得出一个圆方程,所以可以得出一个球方程。但是我还是不知道会发生什么
我复制了一个 project 3B1B video in unity 并使块数为 3 但碰撞并没有停止
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BlockRigidbody : MonoBehaviour
{
public float mass;
public float velocityX;
// Start is called before the first frame update
void Start()
{
}
void Update()
{
}
// Update is called once per frame
public void UpdateMotion()
{
transform.Translate(new Vector3(velocityX * 0.00001f, 0, 0));
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CollisionManager : MonoBehaviour
{
public Text collision21Text, collision10Text, collisionwallText, block0Text, block1Text;
public RectTransform block1TextRect, block2TextRect, block0TextRect;
public int collisionswall, collisions21, collisions10;
public BlockRigidbody blockRbody1, blockRbody2, blockRbody0;
public AudioSource bonkSource;
public AudioClip bonkClip;
public Transform block1Transform, block2Transform, block0Transform, wallTransform;
// Start is called before the first frame update
void Start()
{
block0Text.text = blockRbody0.mass + " kg";
block1Text.text = blockRbody1.mass + " kg";
}
// Update is called once per frame
void Update()
{
for (int i = 0; i < 1000; i++)
{
blockRbody0.UpdateMotion();
blockRbody1.UpdateMotion();
blockRbody2.UpdateMotion();
block0TextRect.anchoredPosition = new Vector2(block0Transform.transform.position.x * 108f, -56);
block1TextRect.anchoredPosition = new Vector2(block1Transform.transform.position.x * 108f, -56);
block2TextRect.anchoredPosition = new Vector2(block2Transform.transform.position.x * 108f, -56);
UpdateCollision();
}
collisionwallText.text = "# Collisions wall m2: " + collisionswall;
collision21Text.text = "# Collisions m2 m1: " + collisions21;
collision10Text.text = "# Collisions m1 m0: " + collisions10;
}
void UpdateCollision()
{
Vector2 block0Pos = block0Transform.position;
Vector2 block1Pos = block1Transform.position;
Vector2 block2Pos = block2Transform.position;
Vector2 wallPos = wallTransform.position;
if ((wallPos.x + 0.5f > block2Pos.x - 0.5f && wallPos.x + 0.5f < block2Pos.x + 0.5f) || (wallPos.x - 0.5f < block2Pos.x + 0.5f && wallPos.x + 0.5f > block2Pos.x - 0.5f)) OnHitWall();
if ((block1Pos.x + 0.5f > block2Pos.x - 0.5f && block1Pos.x + 0.5f < block2Pos.x + 0.5f) || (block1Pos.x - 0.5f < block2Pos.x + 0.5f && block1Pos.x + 0.5f > block2Pos.x - 0.5f)) OnHitBlock();
if ((block0Pos.x + 0.5f > block1Pos.x - 0.5f && block0Pos.x + 0.5f < block1Pos.x + 0.5f) || (block0Pos.x - 0.5f < block1Pos.x + 0.5f && block0Pos.x + 0.5f > block1Pos.x - 0.5f)) OnHitBlock1();
}
void OnHitBlock1()
{
collisions10++;
PlayBonkSFX();
Debug.Log("collision between block 0 and block 1");
float m0 = blockRbody0.mass;
float m1 = blockRbody1.mass;
float v0 = blockRbody0.velocityX;
float v1 = blockRbody1.velocityX;
blockRbody0.velocityX = v0 * (m0 - m1) / (m0 + m1) + v1 * 2f * m1 / (m0 + m1);
blockRbody1.velocityX = v1 * (m1 - m0) / (m0 + m1) + v0 * 2f * m0 / (m0 + m1);
blockRbody0.UpdateMotion();
blockRbody1.UpdateMotion();
}
void OnHitBlock()
{
collisions21++;
PlayBonkSFX();
Debug.Log("collision between block 1 and block 2");
float m1 = blockRbody1.mass;
float m2 = blockRbody2.mass;
float v1 = blockRbody1.velocityX;
float v2 = blockRbody2.velocityX;
blockRbody1.velocityX = v1 * (m1 - m2) / (m1 + m2) + v2 * 2f * m2 / (m1 + m2);
blockRbody2.velocityX = v2 * (m2 - m1) / (m1 + m2) + v1 * 2f * m1 / (m1 + m2);
blockRbody1.UpdateMotion();
blockRbody2.UpdateMotion();
}
void OnHitWall()
{
collisionswall++;
PlayBonkSFX();
blockRbody2.velocityX = -blockRbody2.velocityX; // 완전 탄성 충돌
blockRbody2.UpdateMotion();
}
public void PlayBonkSFX()
{
bonkSource.PlayOneShot(bonkClip);
}
}