Bir ray ile kürenin (sphere) kesişip kesişmediğini bulan fonksiyonu yazın.
Cevap
Ray: P(t) = O + t * D, küre: merkez C, yarıçap r. |P(t) - C|² = r² denklemi t için ikinci dereceden bir denkleme dönüşür. L = O - C dersek ve D normalize ise:
t² + 2 * dot(D, L) * t + (dot(L, L) - r²) = 0
b = dot(D, L), c = dot(L, L) - r² olmak üzere diskriminant b² - c:
< 0: Kesişim yok.= 0: Teğet (tek nokta).> 0: İki nokta;t = -b ± sqrt(b² - c).
// dir normalize edilmiş olmalı
bool RaySphere(Vector3 o, Vector3 dir, Vector3 center, float r, out float t)
{
t = 0f;
Vector3 L = o - center;
float b = Vector3.Dot(dir, L);
float c = Vector3.Dot(L, L) - r * r;
if (c > 0f && b > 0f) return false; // ray dışarıda ve küreden uzaklaşıyor (erken çıkış)
float disc = b * b - c;
if (disc < 0f) return false; // ıska
float s = Mathf.Sqrt(disc);
t = -b - s; // yakın kesişim
if (t < 0f) t = -b + s; // başlangıç küre içindeyse uzak kesişim
return t >= 0f;
}Hit noktası o + dir * t, yüzey normali ise (hit - center).normalized olur.
Kullanım alanları: Mermi-hedef testleri, özel fizik olmadan seçme (picking), görüş hattı kontrolleri, ray tracer yazma ödevleri. Sadece "çarpıyor mu?" sorusu için sqrt'ye gerek yoktur; diskriminantın işaretine bakmak yeterlidir.
İ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.