Yerçekimi Birlikteki belirli bir nesneye nasıl değiştirilir?


14

Birlik'te iki kürem var. Biri 1000x, diğeri 1x boyutunda. Bu yüzden daha küçük kürenin daha büyük küreye çekilmesini istiyorum. Peki nasıl yaparım. Katı cisim kullanarak yerçekimi ile aşağıya inebileceğini biliyorum. Ama yer çekim açısını büyük küreye doğru nasıl değiştirebilirim?

Yanıtlar:


19

Unity fizik motorundaki yerçekimi yalnızca bir yöne gider ve Düzenle-> Proje Ayarları menüsündeki Fizik menüsünde kontrol edilir.

resim açıklamasını buraya girin

Bundan başka bir şey yapmak istiyorsanız, kendi yerçekiminizi uygulamanız gerekir.

Temel olarak, ağırlık merkezi olmasını istediğiniz nesneye bir küre çarpıştırıcı ekleyebilirsiniz. Çarpıştırıcı, nesnelerin o nesnenin çekiminden etkilenmesini istediğiniz tüm alanı kapsamalıdır. Bir nesne bu "etki alanı" ile çarpıştığında, ona bir kuvvet uygularsınız. Etki alanı içinde olduğu sürece ona bir kuvvet uygulamaya devam edersiniz.

Kullandığınız yerçekimi sabiti sizin tarafınızdan değiştirilebilir, ancak gerçek dünyada hesaplamalar için kullanılan standart sabittir:

F = Gm1m2 / r2

Yazıldığından:

Kuvvet = Yerçekimi sabiti * nesne 1 kütlesi * nesne 2 kütlesi / iki nesne arasındaki mesafe.

Yerçekimi sabiti 9.81 değildir. Bu, yer yüzeyinde yer çekiminin neden olduğu ivme.


1

Yerçekimi denklemine başvurmaya gerek yoktur. Kütle ne olursa olsun yerçekimi nedeniyle hızlanma sabittir, bu yüzden tek yapmanız gereken küçük nesnelerinizi her bir kareye büyük nesneye doğru hızlandırmaktır.

Kod şöyle görünecektir:

public void FixedUpdate()
{
    rigidbody.velocity += gravitationalAcceleration * Time.fixedTime * (largeObject.transform.position - transform.position);
}

1

Aslında şu anda yerçekimine dayalı bir oyun üzerinde çalışıyorum: basitçe, oyuncunuzu eliptik yörüngeler ve sapan etkisi ile hareket ettirmek için yıldızlar yerleştiriyorsunuz. Yerçekimini devre dışı bıraktım ve bu kodu kullandım:

using UnityEngine;
using System.Collections;

public class PlanetGrav : MonoBehaviour {

    //Declare Variables:

//Strength of attraction from your sphere (obviously, it can be any type of game-object)
    public float StrengthOfAttraction;

//Obviously, you won't be using planets, so change this variable to whatever you want
    GameObject planet;

    //Initialise code:
    void Start () 
    {
        //Again, you can change the tag to whatever you want.
        planet = GameObject.FindGameObjectWithTag("Planet");
    }

    //Use FixedUpdate because we are controlling the orbit with physics
    void FixedUpdate () {
        //Declare Variables:

    //magsqr will be the offset squared between the object and the planet
        float magsqr;

        //offset is the distance to the planet
        Vector3 offset;

        //get offset between each planet and the player
        offset = planet.transform.position - transform.position;

            //My game is 2D, so  I set the offset on the Z axis to 0
            offset.z = 0;

            //Offset Squared:
            magsqr = offset.sqrMagnitude;

            //Check distance is more than 0 to prevent division by 0
            if (magsqr > 0.0001f)
            {
//Create the gravity- make it realistic through division by the "magsqr" variable

rigidbody2D.AddForce((StrengthOfAttraction * offset.normalized / magsqr) * rigidbody2D.mass);
            }
        }
    }
}

PS Başlangıçta tüm gezegenlerden oluşan bir dizi aracılığıyla döngü oluşturulmuştur: bu düzenlenmiştir ve bu nedenle tam olarak doğru olmayabilir. Yine de iyi olmalı.


0

Zero-G merkezli benzer bir proje üzerinde çalışıyorum; tüm oyun nesnelerine hacim, yoğunluk, kütle, enerji ve iletkenliklerine göre hem yerçekimi hem de elektromanyetik kuvvet üretmek ve bunlara tepki vermek için ihtiyacım var. Komut dosyası oluşturma konusunda nispeten yeniyim, ancak yukarıdaki komut dosyasında bir 3D alanda benim için çalışmasını sağlamak için birkaç değişiklik yaptım (yerçekimi açısından ... neredeyse ...):

using UnityEngine;
using System.Collections;

public class DynamicWeightAnalysis : MonoBehaviour {

//Declare Variables:
//BBB adding volume calculations
//NOPE
//BBB adding density (...does nothing yet...)
public float density;

//BBB NOPE!

//Strength of attraction from your game-object, ideally this will be derived from a calculation involving the objects volume and density, but for now it's entered from the inspector)
public float RelativeWeight;

//BBB Here, we name our target object (s)
GameObject blockALPHA;

//Initialise code:
void Start () 
{
    //BBB here, we define our target object by searching for its tag (setup in editor)
    blockALPHA = GameObject.FindGameObjectWithTag("Block ALPHA");
}

//Use FixedUpdate because we are controlling the orbit with physics
void FixedUpdate () {
    //Declare Variables:

    //magsqr will be the offset squared between the object and the planet
    float magsqr;

    //offset is the distance to the planet
    Vector3 offset;

    //get offset between each planet and the player
    offset = blockALPHA.transform.position - transform.position;

    //Offset Squared:
    magsqr = offset.sqrMagnitude;

    //Check distance is more than 1 to prevent division by 0 (because my blocks are all 1x1x1 so, any closer than 1 and they'd be intersecting)
    if (magsqr > 1f)
    {
        //Create the gravity- make it realistic through division by the "magsqr" variable

        GetComponent<Rigidbody>().AddForce((RelativeWeight * offset.normalized / magsqr) * GetComponent<Rigidbody>().mass);
    }
}
}

Gördüğünüz gibi, hala üzerinde çalışıyorum, temelde şu ana kadar tüm eklemelerim "BBB" ile açıklamalı, henüz istediğim gibi çalışmıyor. Ama dururken, "blok ALPHA" nesnelerimin diğer "blok ALPHA" nesneleriyle yerçekimsel olarak 3 boyutlu olarak oldukça tahmin edilebilir bir şekilde etkileşmesine izin verir. (iki veya daha fazla blok yerleştirirken, sonuncusu her zaman "çekicidir" ve bir çarpışma meydana gelene kadar sabit kalacaktır. üzerinde çalışıyorum ... yardım takdir edilecektir :)) Umarım bu yardımcı olur ..


1
Bir soru sormak istiyorsanız, lütfen soru olarak gönderin, cevabınıza gömmeyin.

benim kötü, ona dikkat ettiğiniz için teşekkürler, bir daha olmayacak :)
Vinny Gerçek Sert Mürekkep Vince

0

Bir gezegen çarpıştırıcısı olan gezegene / büyük küreye sahip olun, ona bir çocuk verin. Şimdi, gezegen ya gezegen ya da statik kozmik nesne olarak etiketlenmeli ve çocuk etki alanı olarak etiketlenmelidir. Şimdi küçük nesnenin katı bir gövdesi ve isTrigger ile bir küresi olmalı.

Gezegene bir enter / enterstay tetiği olan bir senaryo koyun, eğer bir etki alanı ise, buna doğru çekilmelidir.

Yoksa başka türlü yapabilirsiniz. Ancak her durumda bu muhtemelen daha iyi olacaktır çünkü yerçekimsel çekimi gezegenden gezegene farklılaştırmak istersiniz.


-2

Başkalarının söyledikleri, birlik üzerindeki çekim sadece belirli bir yöne doğrudur, bu yüzden bunun yerine yerçekimini tamamen devre dışı bırakmalı ve küçük küreyi büyük olana doğru hareket ettiren bir kuvvet yazmalısınız.


-3

Belirli bir düzlem için yerçekimini değiştirmek istiyorsanız, bu komut dosyasını düzleme iliştirilmiş kullanabilirsiniz.

using UnityEngine;

public class ChangeGavityToThisObject : MonoBehaviour
{

    private Quaternion rot;
    private Vector3 gravityValue;

    void Start()
    { 
        gravityValue = Physics.gravity;      
    }

    void Update()
    {
        rot = GetComponent<Transform>().rotation;
        Physics.gravity = rot * gravityValue;
    }
}

GetComponent Update, çünkü oyunda bu uçağı döndürme imkanı yapmak istiyorum.


1
Bu, küresel çekimin yönünü değiştirir. Sadece bir nesne için değil.
Philipp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.