unity 3d:rigidbody.AddForce(forceDirection.normalized * force)移动对象远离父级和关节

时间:2015-02-25 10:33:03

标签: c# unity3d physics-engine

所以,这对我来说似乎很奇怪。我对Unity来说比较新,所以我确信这是我误解了一些东西。

我正在组建一个VSEPR教程模块。 VSEPR是电子相互排斥并形成原子形状(几何)的模型。

我通过制作(在这种情况下)4个杆(圆柱基元)并使用刚体来模拟这个.AddForce对所有这些都施加相等的力。只要力量相等,这就可以很好地工作。在下面的图像中,您会看到杆在109.47度处非常均匀(实际上您可以"看到"它们的附着物,两个孤对和两个电子键......棒被遮挡在原子壳中。)

(BTW原子的外壳只是一个球体原始 - 画得很漂亮。)

然而,在现实世界中,孤独的对实际上施加了更多的力...所以当我向模型添加这个额外的力量...而不是仅仅推动其他电子棒更远一点,它推动了原子壳外的整个4键结构。

这个事实的原因奇怪的是......两件事。

  1. 所有棒都是贝壳的孩子......所以我认为这使得它们与壳相比有些不动(即如果它们移动,壳会与它们一起移动......这样就可以了)。

  2. 我有一个ConfiguableJoint将杆固定在原子壳(0,0,0)的中心。 x / y / z-motion设置为固定。我认为这应该保持杆不可靠地连接到壳的0,0,0中心......但我猜不是。

  3. 兴趣点:

    • 杆只相互推动,通过附加在一根杆上的脚本向相邻杆施加力。它们不会将AddForce添加到原子shell或其他任何东西。

    enter image description here enter image description here enter image description here enter image description here

    CODE:

    void RepulseLike() {
    
        if (control.disableRepulsionForce) { return; }  // No force when dragging
    
        //////////////////// DETERMINE IF FORCE APPLIED //////////////////////////////
        // Scroll through each Collider that this.BondStick bumps
        foreach (Collider found in Physics.OverlapSphere(transform.position, (1f))) {
    
            // Don't repel self
            if (found == this.collider) { continue; }
    
            // Check for charged particle
            if (found.gameObject.tag.IndexOf("Charge") < 0) { continue; }// No match "charge", not a charged particle   
    
    
            /////////////// APPLY FORCE ///////////////
            // F = k(q1*q2/r^2)
            // where 
            // k = Culombs constant which in this instance is represented by repulseChargeFactor
            // r = distance
            // q1 and q2 are the signed magnitudes of the charges, in this case -1 for electrons and +1 for protons
    
            // Swap from local to global variable for other methods
            other = found;
    
            /////////////////////////////////
            // Calculate pushPoints for SingleBonds
            forceDirection = (other.transform.position - transform.position) * magnetism; //magnetism = 1
    
            // F = k(q1*q2/distance^2), q1*q2 ia always one in this scenario. k is arbitrary in this scenario
            force = control.repulseChargeFactor * (1 / (Mathf.Pow(distance, 2)));
    
            found.rigidbody.AddForce(forceDirection.normalized * force);// * Time.fixedDeltaTime);
    
        }//Foreach Collider
    
    }//RepulseLike Method
    

2 个答案:

答案 0 :(得分:1)

您可能希望使用球体来表示电子,因此将力施加到它们上并根据此球体重新定向(旋转)杆。

答案 1 :(得分:0)

我想我找到了自己的答案......除非有人建议更好的方法来解决这个问题。

我只是减少了电子棒的质量,增加了球体的质量。我不确定这是不是最好的做法&#34;解决方案或kluge ...所以输入仍然欢迎: - )