Qonquerly' Alıntı:
Kesinlikle planet'den kastım buydu.Peki UE4'ün tool larını kullanmanın bir yolu varmı üzerini doldurmak için yada maya bonus tool tarzı eklentiler?
Bildiğim kadarıyla yok.
Qonquerly' Alıntı:
Bİrde Planet için tutorial varmı marketplace de dynamic gravity bulabildim sadece oda tutorial içermiyor ve nasıl aratmam lazım.
Ben olsaydım böyle bir uygulamada gezegeni çevreleyen (çekim alanını temsilen) bir trigger yerleştirir ve trigger ile overlap olan tüm Actor'lere tek yönlü kütle çekim kanunu uygulardım. Kütle çekim kanunu; kütleleri sırasıyla
m1,
m2 ve aralarındaki uzaklık
d kadar olan iki kütlenin birbirine uyguladıkları çekim kuvvetini tanımlar ve Newton fiziğinde aşağıdaki formül ile hesaplanır.
G kütle çekimi sabitidir ve değeri
6.67408 × 10^-11 m^3 kg-1 s^-2
F = (G x m1 x m2) / d^2
Bu senaryoda gezegen pozisyonu(merkez noktası)
Pg, Actor'ün bulunduğu pozisyon
Pa, gezegenin kütlesi
Mg, Actor'ün kütlesi
Ma olmak üzere:
Gezegen ile Actor arasındaki uzaklık;
d = |Pg-Pa|
G yerçekimi sabiti diğer birimler baz alınarak
UE4 birimlerine dönüştürülmelidir, ancak; böyle bile elde edilen sonuç gerçekçi olacaktır ki kütle çekimini o kadar gerçekçi simüle etmek istemeyiz. Aksi halde bir cismin gezegen etrafında dönmesi yada gezegenin onu çekmesi aylar sürebilir. Bu yüzden
G sabitini birkaç test yaparak kendiniz belirlemelisiniz. Aşağı yukarı 1e-2 ile 1e-1 arasında bir değer uygun olacaktır.
m1 ve
m2 değerleri zaten
UE4 içinde
Physics Simulation'ı aktifleştirilmiş tüm
Meshler için büyüklüğüne göre bir değer vererek atanır. Ancak burada da bu büyüklükleri kendiniz vermek isteyebilirsiniz.
Çekim kuvveti tek yönlü olmalı yani sadece
Actore uygulanmalıdır. Tabi gezegenler arası çekim...vb gibi detaylara girmek istemiyorsanız ve ayrıca uygulanan kuvvet gezegenin merkezine doğru yönlenmiş ve yukarıdaki formülle belirtilmiş
Fin uzunluğu(büyüklüğü) kadar olmalıdır.
Bu durumda kuvvetin uygulanması
Actorün Tick fonksiyonunda tanımlanırsa(Planet tarafında da yazılabilir, sadece yön değişir) C++ kodu aşağı yukarı şu şekilde olmalıdır:
Kod:
ATestActor::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
const float G = ?; // Yerçekimi sabiti test edilerek belirlenebilir.
// Actor ile kesişen tüm PlanetActor'ler için...
TArray<AActor*> OverlappingPlanets;
MeshComponent->GetOverlappingActors(OverlappingPlanets, APlanetActor::StaticClass());
for (AActor* PlanetActor : OverlappingPlanets)
{
// Planet Actor ile bu Actor arasındaki pozisyon farkı vektörünü hesapla
const FVector DifferenceVector = PlanetActor->GetActorLocation() - GetActorLocation();
// Kuvvetin yönünü hesapla
const FVector ForceDirection = DifferenceVector.GetSafeNormal();
// Skaler mesafeyi hesapla
const float Distance = DifferenceVector.Size();
// Uygulanması gereken kuvveti hesapla
const FVector Force = (ForceDirection * PlanetActor->GetRootComponent()->GetMass() * RootComponent->GetMass()) / (Distance * Distance);
// Hesaplanan kuvveti uygula
RootComponent->AddForce(Force);
}
}
Blueprint nodeları da aşağı yukarı böyle gözükecektir.
Not: Ne C++ ne de Blueprint kodları test edilmemiştir. Hatalar bulunabileceği gibi performans sorunları ortaya çıkarmasa da performans açısından iyileştirilebilirdir.
https://en.wikipedia.org/wiki/Newton's_law_of_universal_gravitation