leonscottkfm

Unreal MVP
31 May 2015
1,538
5
219
63
28
(34) İstanbul Avrupa
store.steampowered.com
Bir türlü anlayamadığım olay. Absolute locationu hiç kullanmadım tam olarak ne işe yarar bilmiyorum. Relativeyi de fazla kullanmam. Bir tek World Location kullandım bir de Actor Location var. Actor Location bunlardan ayrı bir şey değil bunların içerisinden bir şey herhalde.

Absolute , World , Relative , Actor Location farkı nedir ?
 
Absolute bende hiç kullanmıyorum açıkçası ancak asseti/objeyi 0,0,0 fixliyor, ne anlamı var bilemiyorum. 

World Location ;

Screenshot_1.png


Görebileceğin üzere bu BP world olarak 0,0,100 de ve merkez noktası billboard. yani level üzerindeki lokasyonun world location oluyor.

Local Location ;

Screenshot_2.png


Aynı BP yine world lokasyon olarak 0,0,100 de ancak bu sefer içindeki küp lokal lokasyon olarak 0,100,50 de yani kendi içinde lokasyonunu değiştirmiş oluyoruz. Aynı kübün world lokasyonunu almaya kalkarsak 0,100,150 de olur.

Actor Location ;

Screenshot_3.png


Aynı BP yi construction script üzerinden actor location attığımızda içindeki hiçbirşeyin lokal lokasyonunu değiştirmeksizin BP nin merkez noktasını ki burası için billboard oluyor world lokasyonunu ayarlayabilirsin. Bu benim ne işime yarayacak dersen, 


Screenshot_4.png

Screenshot_5.png


Bu benim prototip oyunlardan biri, uçak sağ/sol/orta 3 hat üzerinde gidebilmesine rağmen aslında Pawn merkezi yani billboard ( bu arada billboard sadece editor üzerinde kolay görmem için başka bir anlamı yok) sabit şekilde Set Actor Location ile spline ı takip ediyor, sağ sol hareketleri tamamen lokal lokasyon üzerinden yapılıyor. 

Güzel bir örnek denebilir, umarım net anlatabilmişimdir. Kolay gelsin.
 
Yukarda çok güzel anlatılmış. Ben bir de olayı fizik dersi gibi anlatayım. Relative dediği şey görecelilik. Diyelim bir arayabla 100 km hızla gidiyorsun. Yandaki araba da 110km hızla gidiyor. Bu diğer arabanın world speed i 110km, bize göre relative speed i 10km. Çünkü biz onu 110 la değil 10 km hızla yavaş gidiyormuş gibi görürüz.

World location ve relative location da böyle. World location o aktörün ya da nesnenin Level üzerindeki gerçek yeridir. O nesnenin üzerinde birşey spawn etmek istersen Get World Location dersen tam üstünde spawn edersin.

Relative location aktörün kökünde yani kendisinde olamaz, ancak o aktörün içindeki nesnelerde olur ve o nesnenin aktöre göre yerini söyler. Yani get actor relative location diye bir node yok. Get actor location var bu da gerçek world locationdur. Ama o aktörde bir static mesh varsa onun get relative location dediğin zaman sana getirdiği şey aslında aktörün köküne göre konumudur ve formülü aslında şudur: (mesh için)Get world location -Get actor location= (mesh için) get relative location.

Diyelim ki aktörün gerçek konumu X:100, Y:55, Z:0 olsun. Sen gidip mesh için Set relative location X:0,Y0;Z:99 dersen o statik meshin gerçek world location u X:100, Y:55, Z:99 olur.

100,55,99(mesh world location) - 100,55,0(gerçek actor location) = 0,0,99(mesh relative location).

Diyelim ki sen bu statik mesh üzerinde birşey spawn etmek istedin. Spawn lokasyonu için (mesh için)get relative location dersen dünya üzerinde 0,0,99 noktası üzerinde birşey spawn edersin o da alakasız bir yer mesh'e göre. Get world location demen gerekiyor.

Birşey spawn edeceksen, uzaklık vektör hesaplamaları yapacaksan farklı aktörler arasında her zaman world location kullanılır. Eğer bir aktör içinde yeni bir nesne ekleyeceksen ve nesnenin nereye ekleneceğini hesaplamayı kolaylaştırmak istiyorsan relative location kullanırsın.
 
Herkes açıklamış zaten bende bir örnek vererek yardımcı olayım.
Platform oyunlarında hep gördüğün bir platform düşün yukarı aşağı gidip geliyor. Buna bir "asansör" diyelim. Aşağıdayken üzerine biniyorsun yukarıdayken başka yüksek bir şeyin üstüne atlayabiliyorsun.
Ancak bu asansörü de istediğin yere taşıyabilmek istiyorsun. Yani asansörün kendisi de oda içerisinde istediğin yere götürülebiliyor. 
Asansör platformu üzerinde de bir dokunma duyarlı mayın sürekli gezip seni patlatmaya çalışıyor. Platform üzerindeyken ondan sağa sola kaçmak zorundasın.

Tüm bu sistemi yapmak için bir asansör BP yaparsın. Bir scenecomponent parent yani en üst hiyerarşi yaparsın. Bir platform şeklini de staticmesh ile onun altına koyarsın. Static meshin yukarı aşağı sürekli inip çıkması gerekecek. Bunun için sinüs fonksiyonunu kullanarak parent i olan scenecomponent a göre "Relative Location" da Z koordinatını aşağı yukarı salınmasını sağlarsın. Bu durumda "Relative Location" üzerinde çalışman gerekir çünkü platform yukarı aşağı RootComponent olan SceneComponent a göreceli olarak yukarı aşağı inecek.
Asansörünü oraya buraya taşınmasını ise AbsoluteLocation a göre yapabilirsin. Onun toplam bir BP olarak bir parent i yok. Göreceli değil. XY ekseni üzerinde oda içerisinde gezebilir. Bu gezmesi platformun yukarı aşağı inmesi hesaplamalarını asla değiştirmez. Çünkü hatırlarsan platformun yukarı aşağı inmesi asansöre göre "Relative Location" yani göreceli lokasyon.

Peki bu durumda platform üzerinde dolaşan sensörlü mayını nasıl yapacağız. Onu da BP içerisinde mesh component ın altına koyduğumuzda "Relative Location" olarak X ve Y de dolanmasını sağlarsak, Platforma yani meshcomponent a göreceli olarak sağa sola ileri geri hareket verdiğimizde sistem çalışıyor olur.

Bu sistemde maynın platfromun yukarı aşağı inmesinden haberi yok, platfromunda asansörün sağa sola götürülmesinden haberi yok. Çünki bunlar tüm hesaplarını hiyerarşide ki bir üstlerinden göreceli olarak hesaplıyorlar. 

Mayının son patladığı yerde yeni bir mayın daha spawn etmek istesek. 

Mayının lokasyonu ile sürekli göreceli olarak yani "Relative Location" olarak ilgileniyorduk. Böylece platform yukarı aşağı Z de inip çıkıyormuş ya da asansör odayı X ve Y ekseni üzerinde dolanıyormuş bizi ilgilendirmiyordu. Ancak şimdi o lokasyonda yeni bir mayın spawn etmemiz gerekiyor.  Patladığı "Relative Location"  değerini "Absolute Location" değerine çevirip SpawnActor nodu uygulayabiliriz. Çünkü bizim o hesaplarımız göreceli lokasyona göre idi ancak SpawnActor bizden Absolute yani "Tüm levelin 0 0 0 merkez noktasını göre olan koordinatını"  istiyor. Bu yüzden hemen GetWorldTransform ile ya da Relative i Absolute a çevirerek SpawnActor a veririz.

Matematiksel olarak arka planda yapılan hesap şöyle oluyor mayının "Absolute Location" bulmak. (Eğer hazır nod lar fonksiyonlar olmasaydı böyle bulurduk)  
MayınAbsoluteLocation =    AsansorAbsoluteLocation + PlatformRelativeLocation + MayınRelativeLocation  (Vektör matematiği)

Sonuç: Koordinat hesaplamalarında, Rotasyon hesaplamalarında bize her türlü kolaylığı sağlayan bir sistem. Gerçekten ihtiyacın olduğunda öğrenebileceğin bir konu.

Not: Absolute ve World location genel olarak aynı şeyi ifade eder. Relative ise yukarıda açıkladığım gibi parente yani altında bulunduğu diğer objeye göre göreceli yeri ifade eder.

Not2: Bir BP nin RootComponent ı için RelativeLocation ile WorldLocation hepsi aynı şeydir (Çünkü yukarıda anlattığım gibi onun parenti yoktur. Bu yüzden onun relative de world değeri de levelin 0 0 0  ına göre hesaplanır.). Ama altındaki componentlar için RelativeLocation RootComponent a göre göreceli olan değerlerdir. Yani değişir.