Code archives/3D Graphics - Misc/Track AI function
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Track functions...if anyone search for them | |||||
;TRACK_SMOOTH TRACK_YR TRACK_SMOOTH_YR SAMPLE DEMO
;WRITTEN By Bitmaniak
;Tracking Functions idea and specs By DoctorZ
;Tracking Functions code by Bitmaniak
;*********************************************************************************
;*** Thi is a real shared pivot...
;*********************************************************************************
Global gPivot1,gPivot2,gCube
;*********************************************************************************
;*** Slow PointEntity on xz axe
;*********************************************************************************
Function track_YR_Smooth(e1,e2,smothness#=1.0)
PositionEntity gPivot1,EntityX(e1),EntityY(e1),EntityZ(e1)
PointEntity gPivot1,e2
RotateEntity e1, 0,curveAngle#(EntityYaw(gPivot1),EntityYaw(e1),smothness#),0
End Function
;*********************************************************************************
;*** Fast PointEntity on xz axe
;*********************************************************************************
Function track_YR(e1,e2)
PositionEntity gPivot1,EntityX(e1),EntityY(e1),EntityZ(e1)
PointEntity gPivot1,e2
RotateEntity e1, 0,EntityYaw(gPivot1),0
End Function
;*********************************************************************************
;*** Slow PointEntity on all axes
;*********************************************************************************
Function track_Smooth(e1,e2,smothness#)
PositionEntity gPivot1,EntityX(e1),EntityY(e1),EntityZ(e1)
PointEntity gPivot1,e2
RotateEntity e1, curveAngle#(EntityPitch(gPivot1),EntityPitch(e1),smothness#),curveAngle#(EntityYaw(gPivot1),EntityYaw(e1),smothness#),0
End Function
;*********************************************************************************
;*** Fast PointEntity on all axes...so...pointEntity...just for fun!
;*********************************************************************************
Function track(e1,e2)
PointEntity e1,e2
End Function
;*********************************************************************************
;*** This calculate the 2d distance*distance on y axes
;*** The exact distance is the sqr( EntityDistance_YR_Power2(e1,e2))
;*********************************************************************************
Function EntityDistance_YR_Power2(e1,e2)
p#=EntityX(e2)-EntityX(e1)
q#=EntityZ(e2)-EntityZ(e1)
Return (p*p)+(q*q)
End Function
;*********************************************************************************
;*** Anyone knows this! Calculate the incremental steps
;*********************************************************************************
Function curveangle#( newangle#,oldangle#,increments#)
If increments>1
If (oldangle+360)-newangle<newangle-oldangle
oldangle=360+oldangle
End If
If (newangle+360)-oldangle<oldangle-newangle
newangle=360+newangle
End If
oldangle=oldangle-(oldangle-newangle)/increments
End If
If increments<=1
Return newangle
End If
Return oldangle
End Function
;*********************************************************************************
;*** Same of above but with points
;*********************************************************************************
;Global gPivot2
Function track_SmoothPoint(entity, x#,y#,z#, turnspeed#=1.0, useRoll%=0)
PositionEntity gPivot2,x,y,z
PositionEntity gPivot1,EntityX(entity),EntityY(entity),EntityZ(entity)
PointEntity gPivot1,gPivot2
temp_pitch# = curveAngle#(EntityPitch(gPivot1),EntityPitch(entity),turnspeed#*2)
temp_yaw# = curveAngle#(EntityYaw(gPivot1),EntityYaw(entity),turnspeed#)
If useRoll
temp_roll# = curveAngle#(EntityRoll(gPivot1),EntityRoll(entity),turnspeed#)
RotateEntity entity, temp_pitch, temp_yaw, temp_roll
Else
RotateEntity entity, temp_pitch, temp_yaw, 0
End If
End Function
;*********************************************************************************
;*** Create a squared texure
;*********************************************************************************
Function defaultTextureEntity(mesh, colr1=32,colg1=128,colb1=192, colr2=255,colg2=255,colb2=160)
tex=CreateTexture( 64,64 )
ScaleTexture tex,.125,.125
SetBuffer TextureBuffer( tex )
Color colr1,colg1,colb1:Rect 32,0,32,32:Rect 0,32,32,32
Color colr2,colg2,colb2:Rect 0,0,32,32:Rect 32,32,32,32
SetBuffer BackBuffer()
Color 255,255,255
brush=CreateBrush()
BrushTexture brush,tex
EntityTexture mesh,tex
FreeBrush brush
FreeTexture tex
End Function
;*********************************************************************************
;*** Draws Lines
;*********************************************************************************
Function drawpivot(e,camera,length)
;Get initial position
CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
x=ProjectedX()
y=ProjectedY()
;Draw X axis
Color 255,0,0
MoveEntity e,length,0,0
CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
Line x,y,ProjectedX(),ProjectedY()
MoveEntity e,-length,0,0
;Draw Y axis
Color 0,255,0
MoveEntity e,0,length,0
CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
Line x,y,ProjectedX(),ProjectedY()
MoveEntity e,0,-length,0
;Draw Z axis
Color 0,0,255
MoveEntity e,0,0,length
CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
Line x,y,ProjectedX(),ProjectedY()
MoveEntity e,0,0,-length
End Function
;*********************************************************************************
;*** The test!
;*********************************************************************************
Graphics3D 800,600
SetBuffer BackBuffer()
camera=CreateCamera()
light=CreateLight()
PositionEntity camera,0,0,-10
;*** create some entities
cone=CreateCone()
PositionEntity cone,-2,0,-5
RotateMesh cone,90,0,0
defaultTextureEntity(cone)
cone1=CopyEntity(cone)
PositionEntity cone1,-1,0,0
EntityColor cone1,255,0,0
cone2=CopyEntity(cone)
PositionEntity cone2,1,2,0
EntityColor cone2,0,255,0
cone3=CopyEntity(cone)
PositionEntity cone3,0,0,0
EntityColor cone3,0,255,255
cone4=CopyEntity(cone)
PositionEntity cone4,0,0,0
EntityColor cone4,255,255,0
cube=CreateCube()
PositionEntity cube,0,0,8
defaultTextureEntity(cube)
plane = CreatePlane()
defaultTextureEntity(plane)
PositionEntity plane,0,-.5,0
EntityAlpha plane,.5
gPivot1 = CreatePivot()
gPivot2 = CreatePivot()
gCube = CreatePivot()
gfxMiddleWidth = GraphicsWidth()/2
gfxMiddleHeight = GraphicsHeight()/2
;*********************************************************************************
While Not KeyDown( 1 )
;*** Cube rotation
my = -MouseYSpeed()/5
mx = MouseXSpeed()/5
MoveMouse gfxMiddleWidth,gfxMiddleHeight
; PositionEntity gPivot1,EntityX(cone),EntityY(cone),EntityZ(cone)
PositionEntity gPivot1,0,0,0
EntityParent cube,gCube
TurnEntity gCube,my,mx,0
EntityParent cube,0
;*** The routines
;*** Before you used to call a pointEntity(e1,e2)...now you'll call a track_Smooth(e1,e2,smooth)
track_Smooth(cone,cube,20.0)
track_Smooth(cone1,cube,100.0)
track(cone2,cube)
d#=EntityDistance_YR_Power2(cone3,cube)
If d>1
track_YR_Smooth(cone3,cube,10.0)
MoveEntity cone3,0,0,.1
End If
track_Smooth(cone4,cube,EntityDistance(cone4,cube)*2)
MoveEntity cone4,0,0,EntityDistance(cone4,cube)/200.0
RenderWorld
drawpivot(cone,camera,1)
drawpivot(cone1,camera,1)
drawpivot(cone2,camera,1)
drawpivot(cone3,camera,1)
drawpivot(cone4,camera,1)
Text 0,0,d
Flip
Wend
End |
Comments
None.
Code Archives Forum