Rabu, 08 Juli 2015

Deteksi Tabrakan dengan Panjang Vektor / Radius

Dari balik dinding kamarku yang mungil, angin dingin dari benua australia emang mantap...sampai disini juga ikut kebagian.


Pagi rekan-rekan sekalian, jumpa lagi dengan ogut dan kali ini ogut akan membagi cerita tentang deteksi tabrakan yang menggunakan panjang vektor. Panjang vektor sudah pernah dibahas pada artikel sebelumnya jadi ogut akan melewati bagian ini.

Contoh program yang ogut sertakan akan tampak seperti gambar di bawah ini.


Peluru akan terdeteksi menabrak objek jika peluru berada di dalam lingkaran (radius), makanya ogut kasih nama deteksi tabrakan ini dengan nama tabrakan radius supaya mudah diingat.

Untuk menyelesaikan masalah tabrakan radius perhatikanlah gambar di bawah ini.


Peluru yang ditembakan pesawat  akan bergerak sesuai dengan arah yang ditentukan (translasi dengan titik koordinat atau vektor translasi), untuk mendeteksi terjadinya tabrakan cukup menggunakan dua buah vektor yaitu vektor Radius dan vektor peluru. Vektor radius adalah vektor dengan panjang sama dengan jari-jari objek (radius). Vektor peluru adalah vektor yang dibuat dari titik pusat objek ke titik pusat peluru. Cara mencari titik pusat sebuah  objek persegipanjang atau bujursangkar pernah  ogut bahas di artikel ini.

Penting!
Tabrakan akan terjadi jika panjang vektor peluru <= panjang vektor radius. Secara teori deteksi tabrakan radius lebih sederhana dari deteksi tabrakan dengan skala proyeksi vektor. Lalu kenapa tidak pakai saja metode ini untuk mendeteksi setiap tabrakan? Jawabnya sederhana saja rekan-rekan, metode tabrakan yang dipakai tergantung dari game yang Anda buat.

Ok selesai teorinya, sekarang programnya.

Pertama tentukan titik pusat objek bonus lalu tentukan vektor radius. 

    Public Sub SettingNilaiAwal()
        ...
        ...
        ...

        'Titik Pusat Bonus
        Dim TempVektor As Vektor_Properties

        TempVektor = Create_Vektor(Bonus(0).Ax, Bonus(0).Ay, Bonus(0).Cx, Bonus(0).Cy)
        TitikPusatBonus(0).M = (0.5 * TempVektor.i) + Bonus(0).Ax
        TitikPusatBonus(0).N = (0.5 * TempVektor.j) + Bonus(0).Ay

        TempVektor = Create_Vektor(Bonus(1).Ax, Bonus(1).Ay, Bonus(1).Cx, Bonus(1).Cy)
        TitikPusatBonus(1).M = (0.5 * TempVektor.i) + Bonus(1).Ax
        TitikPusatBonus(1).N = (0.5 * TempVektor.j) + Bonus(1).Ay

        'Tentukan Radius Bonus disini
        VektorRadiusBonus(0).i = 0
        VektorRadiusBonus(0).j = 150 'Nilai Radius

        VektorRadiusBonus(1).i = 0
        VektorRadiusBonus(1).j = 80 'Nilai Radius
    End Sub

Lalu cek kondisi tabrakan terjadi atau tidak antara peluru dan objek.

    Private Sub Render_Peluru()
        Dim i As Integer
        Dim SkalaPro1, SkalaPro2 As Single

        For i = 0 To 98
            If Peluru_Fighter(i).GO_Active Then

                '=====================================================
                'periksa apakah peluru di dalam area tembak atau tidak
                '=====================================================
                'hitung titik pusat peluru
                Titik_Pusat_Poligon(Peluru_Fighter(i), CenterX_Peluru, CenterY_Peluru)
                'create vektor peluru
                VektorPeluru = Create_Vektor(Area_Tembak_Xmin, Area_Tembak_Ymin, CenterX_Peluru, CenterY_Peluru)
                'hitung skala proyeksi
                SkalaPro1 = Dot_Product(VektorPeluru, VektorA) / (LVektorA * LVektorA)
                SkalaPro2 = Dot_Product(VektorPeluru, VektorB) / (LVektorB * LVektorB)

                If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then

                    '============================================
                    'peluru berada di area tembak
                    'proses deteksi tabrakan dengan bonus dimulai
                    '============================================
                    For j = 0 To 1
                        'create vektor peluru
                        VektorPeluru = Create_Vektor(TitikPusatBonus(j).M, TitikPusatBonus(j).N, CenterX_Peluru, CenterY_Peluru)

                        'hitung Panjang Vektor Peluru, jika panjang vektor peluru <= vektor Radius maka tabrakan terjadi
                        If Panjang_Vektor(VektorPeluru) <= Panjang_Vektor(VektorRadiusBonus(j)) Then
                            '=====================
                            'peluru menabrak bonus
                            '=====================
                            Peluru_Fighter(i).GO_Active = False
                            Bonus(j).Hit_Status = True
                            Sound2.Play()
                        End If
                    Next
                Else
                    'non aktifkan peluru yang tidak di dalam area tembak
                    Peluru_Fighter(i).GO_Active = False
                End If
            End If

            If Peluru_Fighter(i).GO_Active Then
                GL.Enable(EnableCap.Blend)
                GL.BlendFunc(BlendingFactorSrc.DstColor, BlendingFactorDest.Zero)

                'Mask
                GL.BindTexture(TextureTarget.Texture2D, Peluru_FBMP_Mask)
                GL.Begin(BeginMode.Quads)
                GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Ax, Peluru_Fighter(i).Ay)
                GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Bx, Peluru_Fighter(i).By)
                GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Cx, Peluru_Fighter(i).Cy)
                GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Dx, Peluru_Fighter(i).Dy)
                GL.End()

                GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One)
                'BMP
                GL.BindTexture(TextureTarget.Texture2D, Peluru_FBMP)
                GL.Begin(BeginMode.Quads)
                GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Ax, Peluru_Fighter(i).Ay)
                GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Peluru_Fighter(i).Bx, Peluru_Fighter(i).By)
                GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Cx, Peluru_Fighter(i).Cy)
                GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Peluru_Fighter(i).Dx, Peluru_Fighter(i).Dy)
                GL.End()

                GL.Disable(EnableCap.Blend)

                If CheckBox2.Checked = True Then
                    'warna merah untuk garis
                    GL.BindTexture(TextureTarget.Texture2D, Red)

                    GL.Begin(BeginMode.LineLoop)
                    GL.Vertex2(Peluru_Fighter(i).Ax, Peluru_Fighter(i).Ay)
                    GL.Vertex2(Peluru_Fighter(i).Bx, Peluru_Fighter(i).By)
                    GL.Vertex2(Peluru_Fighter(i).Cx, Peluru_Fighter(i).Cy)
                    GL.Vertex2(Peluru_Fighter(i).Dx, Peluru_Fighter(i).Dy)
                    GL.End()
                End If

                '=================================
                'translasi peluru dengan vektornya
                '=================================
                Peluru_Fighter(i).Ax = Peluru_Fighter(i).Ax + Peluru_Fighter(i).Vektor.i
                Peluru_Fighter(i).Bx = Peluru_Fighter(i).Bx + Peluru_Fighter(i).Vektor.i
                Peluru_Fighter(i).Cx = Peluru_Fighter(i).Cx + Peluru_Fighter(i).Vektor.i
                Peluru_Fighter(i).Dx = Peluru_Fighter(i).Dx + Peluru_Fighter(i).Vektor.i

                Peluru_Fighter(i).Ay = Peluru_Fighter(i).Ay + Peluru_Fighter(i).Vektor.j
                Peluru_Fighter(i).By = Peluru_Fighter(i).By + Peluru_Fighter(i).Vektor.j
                Peluru_Fighter(i).Cy = Peluru_Fighter(i).Cy + Peluru_Fighter(i).Vektor.j
                Peluru_Fighter(i).Dy = Peluru_Fighter(i).Dy + Peluru_Fighter(i).Vektor.j

            End If
        Next
    End Sub

Selesai dah cerita tentang deteksi tabrakan radius, sederhana sekali yah tapi manfaatnya luaaaarrrr biiiiaaaasaaaaa, dan sekali lagi Bang Victor (baca vektor, plesetan dari vektor) membuktikan dirinya emang pantas dikasih jempol, jika bukan karena Bang Victor maka program ini tidak selesai.

Update 2 Jan 2015

Contoh program yang dibuat dengan matematika vektor







Selamat belajar rekan-rekan, salam sukses


Heriady
heriady.yoh@gmail.com




Artikel terkait

Mendeteksi Posisi dengan Vektor Proyeksi

Animasi Game 2D dengan Translasi

Deteksi Tabrakan dengan Proyeksi Vektor

Vektor R2