Rabu, 15 Juli 2015

Vektor Pantul

Pagi hari yang  mendung, hujan deras mulai dari tadi subuh, sekarang matahari masih malas bersinar...tetapi urusan nge-blog tetep jalan sob.

Update 1 Jan 2016




Selamat pagi sobat-sobit dan rekan-rekan sekalian, pada kesempatan kali ini ogut akan membahas vektor lagi, ya vektor lagi, tidak bosan-bosan ogut akan bercerita tentang vektor, karena beliau inilah yang amat sangat berjasa membantu jika rekan-rekan asyik membuat program game.

Vektor yang akan ogut bahas dikasih nama vektor pantul biar mudah mengingatnya. Vektor pantul diperlukan untuk game yang menggunakan efek animasi memantul seperti game bola sodok (billiard) dan game pinball.

Walaupun efek animasi seperti ini tergolong rumit tetapi dengan menggunakan vektor efek ini menjadi sangat mudah untuk dibuat.


Teori Vektor Pantul
Di gambar di bawah terlihat sebuah bola yang bergerak menuju tembok, setelah bola menabrak tembok maka bola akan memantul dengan arah menjauh dari tembok.


Bila digambarkan maka vektor gerakan bola akan menjadi seperti berikut.


Penting!
Sudut datang (”®˚) selalu sama dengan sudut pantul.

Untuk mencari vektor pantul diperlukan dua buah vektor bantu yaitu vektor a(tembok) dan vektor tl(tegak lurus).


Setelah vektor bantu ditentukan, langkah pertama untuk mencari vektor pantul adalah memproyeksikan vektor datang ke vektor a.


Langkah kedua proyeksikan vektor datang ke vektor tl.


Dan langkah terakhir untuk menentukan vektor pantul adalah membalik arah vektor proyeksi2 lalu menggabungkannya dengan vektor proyeksi1.


Dengan menggunakan langkah-langkah di atas maka vektor pantul dapat dicari sehingga arah bola yang memantul dapat ditentukan posisinya.

Program implementasi vektor pantul yang ogut sertakan adalah program peluru bumerang, bumerang akan memantul jika menabrak tembok.

Berikut koding program yang harus Anda perhatikan untuk membuat program vektor pantul.

Tentukan nilai awal untuk objek.

    Public Sub SettingNilaiAwal()
        'fighter
        Fighter.Ax = 420 : Fighter.Ay = 120
        Fighter.Bx = 580 : Fighter.By = 120
        Fighter.Cx = 580 : Fighter.Cy = 280
        Fighter.Dx = 420 : Fighter.Dy = 280

        Fighter.d_X = 25
        Fighter.d_Y = 25
        Fighter.Index_Tekstur = 1

        Indeks_Tekstur_Fighter = 1
        Delay_Tekstur_Fighter = 1
        Plus_Indeks_Tekstur_Fighter = True

        '=================================
        'cos 45 = 0.7071, sin 45 = 0.7071
        'buat 8 buah vektor fighter dengan
        'menggunakan aturan trigonometri
        '=================================
        'arah utara
        Vektor_Fighter(0).i = 0 : Vektor_Fighter(0).j = Fighter.d_Y
        'arah timur laut
        Vektor_Fighter(1).i = Fighter.d_X * 0.7071
        Vektor_Fighter(1).j = Fighter.d_Y * 0.7071
        'arah timur
        Vektor_Fighter(2).i = Fighter.d_X : Vektor_Fighter(2).j = 0
        'arah tenggara
        Vektor_Fighter(3).i = Fighter.d_X * 0.7071
        Vektor_Fighter(3).j = -Fighter.d_Y * 0.7071
        'arah selatan
        Vektor_Fighter(4).i = 0 : Vektor_Fighter(4).j = -Fighter.d_Y
        'arah barat daya
        Vektor_Fighter(5).i = -Fighter.d_X * 0.7071
        Vektor_Fighter(5).j = -Fighter.d_Y * 0.7071
        'arah barat
        Vektor_Fighter(6).i = -Fighter.d_X : Vektor_Fighter(6).j = 0
        'arah barat laut
        Vektor_Fighter(7).i = -Fighter.d_X * 0.7071
        Vektor_Fighter(7).j = Fighter.d_Y * 0.7071

        Dim i As Integer
        Counter_Delay_Bumerang = 99
        'Bumerang
        For i = 0 To 98
            Bumerang(i).GO_Active = False
        Next

        'Tembok(0) mendatar bawah
        Tembok(0).Ax = -GlControl1.Width + 10
        Tembok(0).Ay = -GlControl1.Height + 60
        Tembok(0).Bx = Tembok(0).Ax + 1200
        Tembok(0).By = Tembok(0).Ay
        Tembok(0).Cx = Tembok(0).Bx
        Tembok(0).Cy = Tembok(0).By - 50
        Tembok(0).Dx = Tembok(0).Ax
        Tembok(0).Dy = Tembok(0).Cy
        'vektor bantu a
        Tembok(0).VektorA.i = Tembok(0).Bx - Tembok(0).Ax
        Tembok(0).VektorA.j = Tembok(0).By - Tembok(0).Ay
        Tembok(0).VektorB.i = Tembok(0).Dx - Tembok(0).Ax
        Tembok(0).VektorB.j = Tembok(0).Dy - Tembok(0).Ay
        'vektor bantu tegak lurus
        Tembok(0).VektorTL.i = 0
        Tembok(0).VektorTL.j = 1

        'Tembok(1) tegak kiri
        Tembok(1).Ax = -GlControl1.Width + 70
        Tembok(1).Ay = -GlControl1.Height + 200
        Tembok(1).Bx = Tembok(1).Ax
        Tembok(1).By = Tembok(1).Ay + 800
        Tembok(1).Cx = Tembok(1).Bx - 50
        Tembok(1).Cy = Tembok(1).By
        Tembok(1).Dx = Tembok(1).Cx
        Tembok(1).Dy = Tembok(1).Ay
        'vektor bantu a
        Tembok(1).VektorA.i = Tembok(1).Bx - Tembok(1).Ax
        Tembok(1).VektorA.j = Tembok(1).By - Tembok(1).Ay
        Tembok(1).VektorB.i = Tembok(1).Dx - Tembok(1).Ax
        Tembok(1).VektorB.j = Tembok(1).Dy - Tembok(1).Ay
        'vaktor bantu tegak lurus
        Tembok(1).VektorTL.i = 1
        Tembok(1).VektorTL.j = 0

        'area tembak
        Area_Tembak_Xmin = -GlControl1.Width
        Area_Tembak_Xmax = GlControl1.Width
        Area_Tembak_Ymin = -GlControl1.Height
        Area_Tembak_Ymax = GlControl1.Height

        'create vektorA
        VektorA.i = Area_Tembak_Xmax - Area_Tembak_Xmin
        VektorA.j = 0
        'create vektorB
        VektorB.i = 0
        VektorB.j = Area_Tembak_Ymax - Area_Tembak_Ymin

        LVektorA = Panjang_Vektor(VektorA)
        LVektorB = Panjang_Vektor(VektorB)

        '======================
        'nilai awal untuk bonus
        '======================
        'Bonus(0)
        Bonus(0).Ax = 25 : Bonus(0).Ay = 225
        Bonus(0).Bx = 175 : Bonus(0).By = 225
        Bonus(0).Cx = 175 : Bonus(0).Cy = 375
        Bonus(0).Dx = 25 : Bonus(0).Dy = 375
        Bonus(0).Hit_Status = False
        'Bonus(1)
        Bonus(1).Ax = -375 : Bonus(1).Ay = -175
        Bonus(1).Bx = -225 : Bonus(1).By = -175
        Bonus(1).Cx = -225 : Bonus(1).Cy = -25
        Bonus(1).Dx = -375 : Bonus(1).Dy = -25
        Bonus(1).Hit_Status = False

        'create VektorBonusA
        VektorBonusA.i = Bonus(0).Bx - Bonus(0).Ax
        VektorBonusA.j = 0
        'create VektorBonusB
        VektorBonusB.i = 0
        VektorBonusB.j = Bonus(0).Dy - Bonus(0).Ay

        LVektorBonusA = Panjang_Vektor(VektorBonusA)
        LVektorBonusB = Panjang_Vektor(VektorBonusB)
    End Sub

Mengisi peluru Bumerang jika user menekan tombol ‘F’.

    Private Sub Tekan_Keyboard()
        ...
        ...
        ...
        '====================================
        'tombol 'f' untuk rapid fire bumerang
        '====================================
        If (GetKeyState(Keys.F) And &H1000) Then
            If Counter_Delay_Bumerang >= 10 Then
                Reload_Bumerang()
                Sound1.Play()
                Counter_Delay_Bumerang = 0
            Else
                Counter_Delay_Bumerang = Counter_Delay_Bumerang + 1
            End If
        End If
    End Sub

    Private Sub Reload_Bumerang()
        Dim i, j As Integer

        For j = 1 To 2
            For i = 0 To 98
                If Bumerang(i).GO_Active = False Then
                    Bumerang(i).GO_Active = True
                    'isi koordinat bumerang
                    Bumerang(i).Ax = Fighter.Ax - 50
                    Bumerang(i).Ay = ((Fighter.Dy - Fighter.Ay) / 2) + Fighter.Ay - 25
                    Bumerang(i).Bx = Bumerang(i).Ax + 50
                    Bumerang(i).By = Bumerang(i).Ay
                    Bumerang(i).Cx = Bumerang(i).Bx
                    Bumerang(i).Cy = Bumerang(i).By + 50
                    Bumerang(i).Dx = Bumerang(i).Ax
                    Bumerang(i).Dy = Bumerang(i).Cy
                    'setting vektor bumerang
                    If j = 1 Then
                        Bumerang(i).Vektor.i = -16.9037
                        Bumerang(i).Vektor.j = 4.5293
                    End If
                    If j = 2 Then
                        Bumerang(i).Vektor.i = -16.9037
                        Bumerang(i).Vektor.j = -4.5293
                    End If

                    i = 99
                End If
            Next
        Next
    End Sub

Deteksi tabrakan antara Bonus dan Bumerang serta Tembok dengan Bumerang.

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

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

                '===========================================
                'periksa apakah bumerang di area game screen
                '===========================================
                'hitung titik pusat bumerang
                Titik_Pusat_Poligon(Bumerang(i), CenterX_Bumerang, CenterY_Bumerang)
                'create vektor Bumerang
                VektorBumerang = Create_Vektor(-GlControl1.Width, -GlControl1.Height, CenterX_Bumerang, CenterY_Bumerang)
                'hitung skala proyeksi
                SkalaPro1 = Dot_Product(VektorBumerang, VektorA) / (LVektorA * LVektorA)
                SkalaPro2 = Dot_Product(VektorBumerang, VektorB) / (LVektorB * LVektorB)

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

                    '============================================
                    'Bumerang berada di dalam area game screen,
                    'proses deteksi tabrakan dengan bonus dimulai
                    '============================================

                    For j = 0 To 1
                        'create vektor bumerang
                        VektorBumerang = Create_Vektor(Bonus(j).Ax, Bonus(j).Ay, CenterX_Bumerang, CenterY_Bumerang)
                        'hitung skala proyeksi
                        SkalaPro1 = Dot_Product(VektorBumerang, VektorBonusA) / (LVektorBonusA * LVektorBonusA)
                        SkalaPro2 = Dot_Product(VektorBumerang, VektorBonusB) / (LVektorBonusB * LVektorBonusB)

                        If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
                            '========================
                            'tabrakan antara bumerang
                            'dengan bonus terjadi
                            '========================
                            Bumerang(i).GO_Active = False
                            Bonus(j).Hit_Status = True
                            Sound2.Play()
                        Else
                            '==============================
                            'proses deteksi tabrakan antara
                            'bumerang dan tembok
                            '==============================

                            'create vektor bumerang
                            VektorBumerang = Create_Vektor(Tembok(j).Ax, Tembok(j).Ay, CenterX_Bumerang, CenterY_Bumerang)
                            'hitung skala proyeksi
                            SkalaPro1 = Dot_Product(VektorBumerang, Tembok(j).VektorA) / (Panjang_Vektor(Tembok(j).VektorA) * Panjang_Vektor(Tembok(j).VektorA))
                            SkalaPro2 = Dot_Product(VektorBumerang, Tembok(j).VektorB) / (Panjang_Vektor(Tembok(j).VektorB) * Panjang_Vektor(Tembok(j).VektorB))

                            If (SkalaPro1 >= 0 And SkalaPro1 <= 1 And SkalaPro2 >= 0 And SkalaPro2 <= 1) Then
                                '========================
                                'tabrakan antara bumerang
                                'dengan tembok terjadi
                                '========================

                                'menghitung vektor Pantul
                                Dim VPantul As Vektor_Properties
                                Dim VProyeksi1 As Vektor_Properties
                                Dim VProyeksi2 As Vektor_Properties

                                'hitung proyeksi antara
                                'vektor bumerang(vektor datang)
                                'dengan vektor A(tembok)
                                VProyeksi1 = Proyeksi_Vektor(Bumerang(i).Vektor, Tembok(j).VektorA)

                                'hitung proyeksi antara
                                'vektor bumerang(vektor datang)
                                'dengan vektor TL
                                VProyeksi2 = Proyeksi_Vektor(Bumerang(i).Vektor, Tembok(j).VektorTL)
                                'invers VProyeksi2
                                VProyeksi2.i = -1 * VProyeksi2.i
                                VProyeksi2.j = -1 * VProyeksi2.j

                                'hitung vektor pantul
                                VPantul.i = VProyeksi1.i + VProyeksi2.i
                                VPantul.j = VProyeksi1.j + VProyeksi2.j

                                '==========================
                                'isi vektor bumerang dengan
                                'vektor pantul
                                '==========================
                                Bumerang(i).Vektor.i = VPantul.i
                                Bumerang(i).Vektor.j = VPantul.j
                            End If
                        End If
                    Next
                Else
                    '==========================
                    'non aktifkan bumerang yang
                    'tidak di dalam game screen
                    '==========================
                    Bumerang(i).GO_Active = False

                End If
            End If

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

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

                GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One)
                'BMP
                GL.BindTexture(TextureTarget.Texture2D, BumerangBMP)
                GL.Begin(BeginMode.Quads)
                GL.TexCoord2(0.0, 0.0) : GL.Vertex2(Bumerang(i).Ax, Bumerang(i).Ay)
                GL.TexCoord2(1.0, 0.0) : GL.Vertex2(Bumerang(i).Bx, Bumerang(i).By)
                GL.TexCoord2(1.0, 1.0) : GL.Vertex2(Bumerang(i).Cx, Bumerang(i).Cy)
                GL.TexCoord2(0.0, 1.0) : GL.Vertex2(Bumerang(i).Dx, Bumerang(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(Bumerang(i).Ax, Bumerang(i).Ay)
                    GL.Vertex2(Bumerang(i).Bx, Bumerang(i).By)
                    GL.Vertex2(Bumerang(i).Cx, Bumerang(i).Cy)
                    GL.Vertex2(Bumerang(i).Dx, Bumerang(i).Dy)
                    GL.End()
                End If

                'rotasi bumerang
                Rotasi(Bumerang(i).Ax, Bumerang(i).Ay, CenterX_Bumerang, CenterY_Bumerang, 30.5)
                Rotasi(Bumerang(i).Bx, Bumerang(i).By, CenterX_Bumerang, CenterY_Bumerang, 30.5)
                Rotasi(Bumerang(i).Cx, Bumerang(i).Cy, CenterX_Bumerang, CenterY_Bumerang, 30.5)
                Rotasi(Bumerang(i).Dx, Bumerang(i).Dy, CenterX_Bumerang, CenterY_Bumerang, 30.5)

                'translasi bumerang dengan vektor-nya
                Bumerang(i).Ax = Bumerang(i).Ax + Bumerang(i).Vektor.i
                Bumerang(i).Bx = Bumerang(i).Bx + Bumerang(i).Vektor.i
                Bumerang(i).Cx = Bumerang(i).Cx + Bumerang(i).Vektor.i
                Bumerang(i).Dx = Bumerang(i).Dx + Bumerang(i).Vektor.i

                Bumerang(i).Ay = Bumerang(i).Ay + Bumerang(i).Vektor.j
                Bumerang(i).By = Bumerang(i).By + Bumerang(i).Vektor.j
                Bumerang(i).Cy = Bumerang(i).Cy + Bumerang(i).Vektor.j
                Bumerang(i).Dy = Bumerang(i).Dy + Bumerang(i).Vektor.j
            End If
        Next
    End Sub

Update 1 Jan 2016

Contoh lain matematika vektor yang sangat berguna untuk pemrograman game, Sudut VektorMembuat Missile  dan Tanjakan Turunan.







Ok rekan-rekan sekalian, selesai sudah bacaan tentang vektor pantul dan sekali lagi sang vektor membuktikan dirinya emang berkualitas untuk menyelesaikan permasalahan di game programming.

Salam matematika vektor


Heriady
heriady.yoh@gmail.com




Artikel terkait

Mendeteksi Posisi dengan Vektor Proyeksi

Animasi dengan Translasi dan Rotasi

Deteksi Tabrakan dengan Proyeksi Vektor

Vektor R2