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.

  1. Vektörlerde dot product ve cross product oyunlarda ne için kullanılır?OrtaOyun MatematiğiGame Dev
  2. AABB ve sphere çarpışma testleri matematiksel olarak nasıl yapılır? Hangisi ne zaman tercih edilir?OrtaOyun MatematiğiGame Dev
  3. Transform matrisleri nedir? Local space ile world space arasında nasıl dönüşüm yapılır?OrtaOyun MatematiğiGame Dev
  4. Quaternion ile Euler açıları arasındaki fark nedir? Gimbal lock nedir?ZorOyun MatematiğiGame Dev
  5. Lerp ve Slerp nedir? Lerp'ü Update içinde yanlış kullanmak neden sorun yaratır?OrtaOyun MatematiğiGame Dev
  6. Vektör normalize etmek ne demektir? Çapraz harekette neden gereklidir?KolayOyun MatematiğiGame Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle