Bir ray ile düzlemin kesişimini nasıl hesaplarsınız? Mouse ile zemine tıklanan noktayı bulan kodu yazın.
Cevap
Ray: P(t) = O + t * D (O başlangıç, D yön, t ≥ 0). Düzlem: normal n ve düzlem üzerindeki bir nokta P0 ile tanımlanır; düzlemdeki noktalar dot(P - P0, n) = 0 koşulunu sağlar.
Ray denklemini yerine koyunca:
t = dot(P0 - O, n) / dot(D, n)
dot(D, n) ≈ 0ise ray düzleme paraleldir, kesişim yoktur (veya ray düzlemin içindedir).t < 0ise kesişim ray'in arkasındadır.
bool RayPlane(Vector3 origin, Vector3 dir, Vector3 planePoint, Vector3 normal, out Vector3 hit)
{
hit = default;
float denom = Vector3.Dot(dir, normal);
if (Mathf.Abs(denom) < 1e-6f) return false; // paralel
float t = Vector3.Dot(planePoint - origin, normal) / denom;
if (t < 0f) return false; // arkada
hit = origin + dir * t;
return true;
}
// Kullanım: top-down oyunda mouse'un zemindeki karşılığı (collider gerekmez)
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (RayPlane(ray.origin, ray.direction, Vector3.zero, Vector3.up, out Vector3 p))
aimTarget.position = p;
}Unity'de aynı iş Plane yapısıyla yapılabilir: new Plane(Vector3.up, 0).Raycast(ray, out float enter).
Neden fizik raycast yerine? Sonsuz bir zemin düzlemi için matematiksel test collider gerektirmez, çok ucuzdur ve engellerin arkasındaki noktayı da verir (nişan alma için istenen davranış). Engelleri dikkate almak gerektiğinde ise Physics.Raycast kullanılı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.