Yanıtlar:
Duvarın normal vektörünü biliyorsanız ve nesne için gelen bir yönünüz varsa, istediğiniz şey bir vektörün düzlem boyunca yansımasıdır .
Eğer n bir normalize vektör olup, v ise , gelen yönü, o zaman ne istediğiniz olduğu - (2 ( n · v ) n - v ). Eksi işareti, bir nesnenin hızı tersine çevrileceği için yansıma formülünün aslında yönü tersine çevirmediğini açıklar.
Bu cevap bir açı değil, vektör matematiği açısından verilir, çünkü bir açı kullanmak için açık bir nedeniniz yoksa bu genellikle tercih edilir. Açılardan bahsetmeniz gerekiyorsa, yansıma açısının insidans açısına eşit olduğunu unutmayın. Açı normalden ölçülürse, giden açı gelen açının olumsuzlamasıdır; açı duvardan ölçülürse, gelen açının tamamlayıcısıdır.
Bir 2D veya 3D oyun olduğunu belirtmediniz. Ancak bu bir 2D oyun ve duvarlarınızın yatay veya dikey olması garanti ediliyorsa ve sadece nesneyi onlardan atlamak istiyorsanız, yansımalarla uğraşmaktan çok daha kolay bir yol var.
Dikey bir duvara çarparken nesnenin hızının X bileşenini veya yatay bir duvara çarparken nesnenin hızının Y bileşenini basitçe ortadan kaldırın. Misal:
if( /* hit vertical wall */ )
{
object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
object.velocity.y *= -1;
}
Ancak, açıyı bilmeyi gerçekten önemsiyorsanız, genel olarak, yansıma açısı, insidans açısı ile aynıdır. Bu açı, duvarın normaline göre ölçülür. İşte bunu netleştirmesi gereken bir resim:
Bunu rastgele duvarlar için ele almanız gerektiğinde, bir vektörü nasıl yansıtacağınıza bakmanız gerekir. Duvarın normal ve insidans vektörünü alan ve yansıyan vektörü sizin için döndüren küçük bir formül. İşte XNA'nın kullandığı formül:
public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
return vector - 2 * Vector3.Dot(vector, normal) * normal;
}
2D için şunları yapabilirsiniz:
public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
return vector - 2 * Vector2.Dot(vector, normal) * normal;
}
if it's a 2D game and your walls are guaranteed to be horizontal or vertical
doğru değildir. Cevabın ikinci kısmı doğru uygulamayı onaylıyor. IMHO, parçaların sırası tersine çevrilmeli, önce genel çözüm ve enfazda sunulurken, sağ açılı çözüm istisnai durum için basitleştirme olarak sunulmaktadır.
Bu sadece bir vektörü duvarların normal vektörü boyunca yansıtmakla ilgilidir.