Bir vektörün başka bir vektör üzerine izdüşümü (projection) nasıl hesaplanır? Oyunda nerede kullanılır?
Cevap
a vektörünün b üzerindeki izdüşümü, a'nın b doğrultusundaki bileşenidir:
proj_b(a) = (dot(a, b) / dot(b, b)) * b
b birim vektörse (normalize edilmişse) bu dot(a, b) * b olur. Dot product'ın kendisi ise bu bileşenin işaretli uzunluğunu verir.
Dik bileşen: a - proj_b(a). Bir düzlem üzerine izdüşüm ise normali n olan düzlem için a - dot(a, n) * n şeklindedir.
Vector3 Project(Vector3 a, Vector3 b) => Vector3.Dot(a, b) / Vector3.Dot(b, b) * b;
// Duvar boyunca kayma (wall sliding): hızın duvar normaline dik kısmını tut
Vector3 Slide(Vector3 velocity, Vector3 wallNormal)
{
return velocity - Vector3.Dot(velocity, wallNormal) * wallNormal;
// Unity: Vector3.ProjectOnPlane(velocity, wallNormal)
}Oyundaki kullanımları:
- Duvar veya rampa boyunca kayma: Hızın yüzey normalindeki bileşenini çıkarmak.
- Eğimli zeminde hareket: Input yönünü zemin düzlemine izdüşürmek.
- Bir noktanın doğru üzerindeki en yakın noktası: Ray ve segment testleri, ip/ray çarpışmaları.
- İleri hız hesaplama: Araç hızının araç yönündeki bileşeni (
dot(velocity, forward)). - Kamera: Bir hedefin kamera ekseni üzerindeki derinliği.
Unity'de Vector3.Project ve Vector3.ProjectOnPlane, Unreal'da FVector::ProjectOnTo ve FVector::VectorPlaneProject hazırdır.
İlgili Oyun Matematiği soruları
- Vektörlerde dot product ve cross product oyunlarda ne için kullanılır?
- AABB ve sphere çarpışma testleri matematiksel olarak nasıl yapılır? Hangisi ne zaman tercih edilir?
- Transform matrisleri nedir? Local space ile world space arasında nasıl dönüşüm yapılır?
- Quaternion ile Euler açıları arasındaki fark nedir? Gimbal lock nedir?
- Lerp ve Slerp nedir? Lerp'ü Update içinde yanlış kullanmak neden sorun yaratır?
- Vektör normalize etmek ne demektir? Çapraz harekette neden gereklidir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.