Imports MTV3D65
Public Class Form1
Dim Tank As TVMesh ' Moving tank
Dim Land As TVLandscape ' Landscape (for mouse picking)
Dim TargetCursor As TVMesh ' Sphere marking target point
Dim TV As TVEngine
Dim IE As TVInputEngine
Dim Scene As TVScene
Dim glb As TVGlobals
Dim Mth As TVMathLibrary
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TV = New TVEngine
TV.Init3DWindowed(Me.Handle.ToInt32)
glb = New TVGlobals
Mth = New TVMathLibrary
Scene = New TVScene
' Create empty landscape
Land = Scene.CreateLandscape
Land.CreateEmptyTerrain(CONST_TV_LANDSCAPE_PRECISION.TV_PRECISION_LOW, 2, 2, -256, 0, -256)
' Create tank mesh
Tank = Scene.CreateMeshBuilder
Tank.CreateTeapot()
Tank.SetScale(10, 10, 10)
' Create cursor mesh
TargetCursor = Scene.CreateMeshBuilder()
TargetCursor.CreateSphere(3)
TargetCursor.SetColor(glb.RGBA(0, 1, 0, 1))
' Create input engine
IE = New TVInputEngine
IE.Initialize()
' Set camera
Scene.SetCamera(50, 150, 50, 0, 0, 0)
' Declare variables
Dim Target As TV_3DVECTOR
Dim Angle As Double
Dim Direction As TV_3DVECTOR
Dim Position As TV_3DVECTOR
Dim MouseX As Integer, MouseY As Integer
Me.Show()
Do While Not IE.IsKeyPressed(CONST_TV_KEY.TV_KEY_ESCAPE)
TV.Clear()
' Move target on mouse click
If (IE.IsMouseButtonPressed(0)) Then
IE.GetMousePosition(MouseX, MouseY)
Dim Coll As TVCollisionResult = Land.MousePick(MouseX, MouseY)
Target = Coll.GetCollisionImpact()
TargetCursor.SetPosition(Target.x, Target.y, Target.z)
End If
' If too far from target, steer tawards target
If Mth.GetDistanceVec3D(Position, Target) > 0.5 Then
' Calculate angle towards target
Dim AngleToTarget As Double = Mth.ATan2(Position.x - Target.x, Position.z - Target.z)
' Calculate relative angle between current angle/direction and desired angle towards target
Dim RelativeAngle As Double = Angle - AngleToTarget
' Make sure angle stays in interval <-pi;pi>
Do While RelativeAngle > Math.PI
RelativeAngle = RelativeAngle - (2.0 * Math.PI)
Loop
Do While RelativeAngle < -Math.PI
RelativeAngle = RelativeAngle + (2.0 * Math.PI)
Loop
' Change current angle according to relative diraection tawards target
If RelativeAngle > 0 Then
Angle += 0.005
End If
If RelativeAngle < 0 Then
Angle -= 0.005
End If
' Calculate direction from angle
Direction = glb.Vector3(Math.Cos(Angle) * 0.1, 0, Math.Sin(Angle) * 0.1)
' Update position
Position = Position + Direction
' Set mesh rotation and position
Tank.SetRotation(0, -Angle, 0)
Tank.SetPosition(Position.x, Position.y, Position.z)
End If
' Don't render the landscape
Land.Enable(False)
Scene.RenderAll(True)
Land.Enable(True)
TV.RenderToScreen()
Windows.Forms.Application.DoEvents()
Loop
Me.Close()
End Sub
End Class