Oyun geliştirmede vektörler


19

Programlama ve oyun programlama konusunda yeniyim. Vektörler ve matematik hakkında bir şeyler okudum, ama bir sorum var - vektörleri oyun programlamasında nerede kullanırım? Belki de vektörleri (2D olarak) kullandığınızda basit bir örnek verebilir misiniz?

Örnekler buldum ama çoğunlukla konsolda sayıları çıkardıkları ve anlamadığım büyük örnekler var.


Temel TL; DR Vektörleri, Lineer Cebir konusunun bir parçasıdır ve Matrislere yol açar. Matricies ve Linear Algebra ile imlecinizin altında hangi nesnenin olduğunu görmek için Mayın Tarlası çözücüsünden 3D dünya projeksiyonuna kadar her şeyi yazıyorsunuz. Lineer Cebir, herhangi bir oyun geliştiricisi için Matematiğin en yararlı ve gerekli tek dalıdır. Şimdi öğrenin; pişman olmayacaksın.
Robert Massaioli

Tüm müthiş cevaplar için hepinize teşekkürler! Ama neden böyle bir şey bu eğitimde Vector'ları kullanmıyor ? : zetcode.com/tutorials/javagamestutorial Veya bir geliştiricinin diğer no'yu kullanması?
vqwer

Söylemesi zor, muhtemelen yazar yeni başlayanlar için basit ve temel tutmak istiyordu.
Maik Semder

Aslında yazar onları kullanıyor, class Star burada
Maik Semder

Ayrıca burada olduğu Point2Dkullanılanclass ResizeRectangle
Maik Semder

Yanıtlar:


31

Vektör nedir?

Vektörler, değişen boyuttaki koordinat kümeleridir. Bir vektördeki her koordinat, vektörün bulunduğu alanın o yönünde mutlak bir konumu temsil eder.

  • Bir 1-D vektörü {1} olacaktır . Bu, örneğin, X = 1 konumundaki bir konum olabilir veya t = 1 zamanı olabilir.
  • 2-B vektörü {-4,3} olacaktır . Bu, örneğin X ekseni üzerinde -4 ve Y ekseni üzerinde 3 konumu olabilir. Aynı zamanda X ekseni üzerindeki bir konumdaki (-4 metre) sıcaklık (3 derece) olabilir.
  • 3-B vektör {1,2,3} olacaktır . Bu, X ekseni boyunca boşluk 1'de, 2 Y ekseni üzerinde geri ve Z ekseni üzerinde 3 yukarı konum olabilir. Veya 1 kırmızı, 2 yeşil ve 3 mavi renkte olabilir. Veya bir XY konumu olabilir ( T ( {3} ) bir zamanda {1,2 } ) olabilir.

Her durumda, sorunumuz için vektörlere anlam atadığımızı unutmayın. Oyunlarda geometri için kullanılan vektörleri yaygın olarak görseniz de, onlarla başka bir şey yapamamanızın bir nedeni yoktur.

Neden vektör kullanıyorum?

İlk olarak, asla vektör kullanmanız gerekmez . X ve y'yi veya önem verdiğiniz koordinatları ne şekilde takip ettiğiniz sürece, bir şekilde iyi olursunuz.

Bununla birlikte, vektörleri kullanmanın avantajı, yön ve konum gibi şeyleri düzgün bir şekilde temsil etmeleri ve ayrıca hayatınızı kolaylaştıran, üzerinde tanımlanmış birkaç matematik işlemine sahip olmalarıdır.

Bunların basit bir örneği için nokta ürünü düşünün .

Yukarıdan aşağıya bir oyunda bir radar sisteminiz olduğunu varsayalım. Radar sektöründe görünen her düşman (2D'de biraz pasta şeklinde kama) ekranınızda küçük bir kırmızı nokta almalıdır. Yani, radar bölümünüzde hangi düşmanların olduğunu bulmanız gerekiyor.

Düşmanların bir üçgen içinde olup olmadığını test edebilirsiniz. Ayrıca, düşmanların radar sektörünün iki tarafını tanımlayan uçakların / hatların iki yarım alanının kesişme noktasında olup olmadığını test edebilirsiniz.

Ya da kontrolü yapmak için bir nokta ürün kullanabilirsiniz. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

  1. Radarın ortasından "radarın önüne" doğru giden bir vektör oluşturun. Normalleştirin.
  2. Radarın merkezinden radar görünürlüğünü kontrol etmek istediğimiz nesneye doğru giden bir vektör oluşturun. Normalleştirin.
  3. İki normalize edilmiş vektörün nokta ürününü alın.
  4. Bu ürünün arkosinini alın ve radarın genişliğinin yarısından daha az olup olmadığını kontrol edin. Öyleyse, bir bip çizin.

Bu çok kullanışlıdır ve artık farklı yönlere işaret eden (sadece ileri vektörü değiştiren) ve farklı genişliklere sahip olan (sadece radar genişliği açısını değiştiren) radarlara kolayca sahip olmanıza izin verir - ve bu durumlar için de aynı kodu tekrar kullanabilirsiniz !

Neden başka vektörleri kullanıyorum?

2B'deyseniz, belki de karmaşık efektler ve hareketler (eğirme, ölçekleme vb.) Elde etmenin en iyi yolu bir sahne grafiği kullanmaktır. Bir gezegenin yörüngede dönen bir gemisi var, geminin yörüngede dönen bir uçağı var. Vektör matematiği kullanmadan bunun hesaplanması gerçekten çok çirkin.

Vektör matematiği ile, her birini bir noktaya ve 3x3 dönüşüm matrisine sahip olarak temsil ediyoruz. Gezegen dönüşümünü, gemi dönüşümünü ve gezegenin dönüşümünü kullanır ve drone dönüşümü ve geminin dönüşümünü ve gezegenin dönüşümünü kullanır.

Gezegen hareket ettiğinde, dönüşümünü değiştirirsiniz ve gemi ve drone otomatik olarak "ücretsiz" olarak konumlandırılır. Çok daha temiz kod.

Hala ikna olmadım. Vektörler aynı zamanda neredeyse tüm grafik kütüphaneleri tarafından kullanılan konum, geometri ve hareket için doğal temsildir ve kesinlikle OpenGL ve DirectX'tir. Onları kullanmak zorunda kalmadan kaçmanız muhtemel değildir.

Sonuç Vektörler, geometrik problemleri temiz ve zarif bir şekilde çözen açık kod yazmak için güçlü bir araçtır.


14

Bir 2D örnek ekran koordinatlarıdır, ekrandaki bir pikseli tanımlar ve x- ve y-bileşenine [x, y] sahiptir, yani Sol üst ekran konumu [0, 0]

Başka bir örnek: Sağ ekran kenarlığından sol ekran kenarlığına kaydırılan bir metin düşünün. Şimdi, kayan metnin hızını saniyede piksel olarak tanımlamanız gerekir, yani [-20, 0], metnin saniyede 20 piksel sola kaydırdığı ve yüksekliği asla değiştirmediği anlamına gelir.

Başka bir daha gelişmiş örnek: 800x600, 1024x768 vb. Farklı ekran çözünürlüklerinde çalışması gereken bir 2D oyun hayal edin. Bu, dahili olarak oyun mantığının ayrıştırılması için 0,0 ile 1,0 arasında bir ekran genişliği ve 0,0 ile 1,0 arasında bir yükseklik kullanılarak kolayca yapılabilir. gerçek ekran çözünürlüğünden. Şimdi ekrana çizdiğinizde dahili vektörü çözünürlük vektörü ile çarpıyorsunuz:

screen_pos = internal_pos * screen_ressolution

not, buradaki 3 değişkenin tümü 2D vektörlerdir, x- ve y-bileşenlerine sahiptirler, yani bu internal_pos için [0.5, 0.25]:

[400, 150] = [0.5, 0.25] * [800, 600]

Böylece iç konum [0.5, 0.25] gerçek ekran konumuna [400, 150] dönüştürülür.

Bu temel şeylerdi. Vektörlerin gerçek avantajı, Doğrusal Cebir'de , köşelerinizi (döndürme, ölçeklendirme, ayna vb.) Dönüştürmek için matrisleri kullanabileceğiniz, yani tüm dahili konumunuzu 90 derece döndürmek için kullanabileceğiniz veya ekran y 0'ı ekranın üstünden altına doğru konumlandırın, çünkü kullandığınız üçüncü taraf kitaplığı bu kuralı kullanır.


Vektör, bir tür liste gibi tek boyutlu bir dizi değil mi? Ekran çözünürlüğünden bahsederken, çok boyutlu diziden (her X ve Y ekseni için bir koordinat) bahsetmiyoruz mu? Sadece 'vektörün' bir matrisle karıştırılmadığından emin olmak için. =)
Marcouiller

@Ekran için tam piksel verileri çok boyutlu bir dizi, temel olarak bir bitmap olarak değerlendirilebilir, ancak genişlik ve yükseklik değerleri, diğer bir deyişle çözünürlük, olamaz
Maik Semder

2
Bir vektörün matematik ve programlamada genellikle farklı şekilde ele alındığını unutmayın. Matematiksel olarak konuşursak, bir vektör çok boyutlu bir dizi değildir , ancak bazı temellere göre bileşenleri birlikte böyle bir diziyi tanımlar. Vektörün kendisi koordinat değişmezdir. İşlem screen_pos = internal_pos * screen_resolution, yazdığınız şekilde değişmez bir koordinat değildir , daha uygun şekilde yazılabilir screen_pos = map_to_screen * internal_pos, burada map_to_screendoğrusal bir eşleme (bir matris olarak yazılabilir, bu durumda çapraz bir).
leftaroundabout

6

İşte Wolfire Games blogunda oyun geliştirmede vektörlerin harika bir açıklaması:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/


Bu, şu anda yalnızca bağlantı içeren bir yanıttır. Lütfen, bir okuyucunun bu bağlantıdan toplayabileceğini düşündüğünüz ana noktaların kabaca bir özetini eklemeyi düşünün, böylece bağlantı değişse, koparsa veya gelecekte kullanılamıyor olsa bile yanıt kendi başına durabilir.
DMGregory

1

Vektör, hem değeri hem de yönü olan bir varlıktır. Gerçek dünyadaki vektörlere ve fizik tabanlı oyunlara örnek olarak hız ve momentum verilebilir. Yalnızca değerleri olan, ancak yönü olmayan özellikler skalar olarak adlandırılır ve konum, kütle, yoğunluk vb.

Vektör gibi fiziksel özellikleri taklit eden oyunlar için vektörlere ihtiyaç vardır (belirtildiği gibi - hız, ivme ve benzeri). Vektör hesaplamaları için kullanılan matematiğe doğrusal cebir denir .


Hız bir skaler, hız vektörünün uzunluğu
Maik Semder

Doğru - sabit
Eran Galperin

1
ve konum genellikle vektör olarak kabul edilir, skaler olan uzaklıktır.
Ali1S232

Konum hem skaler (veya skaler topluluğu) hem de eksen başlangıç ​​noktasından işaret eden bir vektör olarak düşünülebilir.
Eran Galperin

1

Bir şeyi temsil etmek için her boyut için bir sayının olduğu her yerde, bu sayıların toplanması bir vektör olarak kabul edilebilir. Konum, hız ve ivme vektörlerin başlıca örnekleridir. Bazı durumlarda bir vektör olarak bakma yönünü temsil etmek de pratik olabilir.

Temel şeyler için bu sayıları vektör olarak kabul edip etmemeniz önemli değildir, ancak herhangi bir fizik yapmak istiyorsanız vektör matematiğine bakmanız gerekir.


Pozisyon bir vektör değil
Eran Galperin

Ne hız, ne skaler, hız bir vektör
Maik Semder

2
@Eran Galperin Bunun matematikçiler arasında oldukça yaygın bir görüş olduğunu biliyorum. Ancak bir nokta ile karşılık gelen pozisyon vektörü arasındaki fark oldukça akademiktir. Ayrım hakkında yaygara yapmak için pratik bir neden yoktur.
aaaaaaaaaaaa

1
Pratik nedenler vardır, 4D homojen koordinatları ve matrisleri ile çalıştığınızda, bu ayrımı yapmanız gerekir . Bu sorunun kapsamı ile ilgili olmasa da.
Maik Semder

@ eBusiness bir "görüş" değil, bu bir gerçektir. Ve ben bir fizikçiyim, matematikçi değil eğitim.
Eran Galperin

0

Çok basit bir şekilde, bir pozisyon veya yönü olan her şey, bir oyunun her yerinde vektörleri kullanıyorlar. Bir vektör bir nokta gibidir

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Ancak aradaki fark gerçekten buna bağlı. Nokta sadece nokta, vektör ise Ok'tur.

eğer varsa

Point2.x = 5;

Point2.y = 10;

Bu konumda demek istediğimi söylüyorsun x 5 ve y 10.

ancak bir vektör beyan ettiğinizde ...

Vector2.x = 5;

Vector2.y = 10; 

Gerçekten söyleyeyim, 0,0 ile x 5 arasında bir ok beyan ediyorum, y 10;

hatta vektörünüzün işaret ettiği noktayı herhangi bir yerden uzayda bir nokta olabilir, örneğin nesnemizi hareket ettirmek için bir nokta ve bir vektör kullanalım. .

point2.x = 10;

point2.y = 15;

şimdi bu noktayı taşımak için bir vektör kullanabilirsiniz, diyelim ki bu noktayı x ekseni 10 birim yukarı taşımak istiyoruz.

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

şimdi nokta vektör okunuzun söylediği yere taşındı.

şimdi nokta

point2.x = 20;

point2.y = 15;

Dikkat edilmesi gereken son bir şey, bazen bir vektörün bir nokta gibi kullanılması ve tam tersi aynı tür verileri tutmaları nedeniyle.


Bir nokta olan bir vektör. Bu, başlangıç ​​noktasından P noktasına bir vektör.
Komünist Ördek

1
@Duck teknik bu vektör position_point gelen origin_point çıkarılarak bulunabilir homojen koordinatlarla atıfta doğru değil, ama bu onları eşit yapmaz konuşma: v = pos - originçokv != pos orijin bir nokta olduğundan{0, 0, 0, 1}
Maik Semder

@Duck: A noktası değil bir vektör ama noktası ve kökeni tanımlamak sadece köken 0 ise çoğu zaman olduğu gibi iyi olarak bir vektör.

@ Öyleyse neden ona P noktanı dedin? LOL
EddieV223
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.