碰撞块在 3 个块中计算 pi

问题描述 投票:0回答:0

我看到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);
    }
}
unity3d game-physics physics-engine
© www.soinside.com 2019 - 2024. All rights reserved.