Elp, Entity yaw.
Blitz3D Forums/Blitz3D Programming/Elp, Entity yaw.
| ||
hay all, I know this is gona be something really really daft, but its buggin me so i thought id ask. If you need the media I will provide it as well just let me know. ok, What im trying to do is have this target moved by the mouse, the ship will face the target at all times, I'm using the Delta Yaw method to do this(found on a forum search) .. The Problem is that as I move the target from left to right, as I pass over the ship and go into its right hand side the ship flips over. Any Ideas ? ; ; ; Asteroids Remake. ; ; This mini project has been started as a test bed for some of the things ; I plan to implement into the SolarShatter code base. ; ; Graphics3D 800,600,32,2 SetBuffer BackBuffer() Cls HidePointer() Global cam=CreateCamera() PositionEntity cam,0,0,-20 Global light=CreateLight() Global background=CreatePlane() Global texture_background=LoadTexture("img/bg1.jpg") RotateEntity background,-90,0,0 ScaleTexture texture_background,40,30 PositionTexture texture_background,.50,.50 EntityTexture background,texture_background Global line_vert=LoadImage("img/vert.jpg") Global line_hor=LoadImage("img/hor.jpg") Global Target=LoadImage("img/target.bmp"):MidHandle target:MaskImage target,255,0,255 Global mouse_pivot=CreateSphere(3) Global PLayer_Ship=LoadMesh("models/ship.3ds") ScaleEntity player_ship,.02,.02,.02 HideEntity PLayer_Ship Type player Field x# Field y# Field z# Field turn_rate# Field turn_amount# Field sight_pivot Field model End Type Global player.player = New player player\x=0 player\y=0 player\turn_rate=1.5 player\model=CopyEntity(player_ship) PositionEntity player\model,0,0,-2 HideEntity background t=CreateSphere(3) PositionEntity t,0,20,-2 player\sight_pivot=CreatePivot() PositionEntity player\sight_pivot,0,0,-2 EntityParent player\model,player\sight_pivot RotateEntity player\model,0,0,90 ;Play out the game intro Intro() Function Intro() GUI() End Function End Function GUI() Local ENDGUI=False Repeat Cls GUI_Update() GUI_Render() UpdateWorld() RenderWorld() GUI_Render_2D() If KeyHit(57)=1 Then Game() Flip False Until KeyHit(1) Or ENDGUI=True End Function Function GUI_Update() End Function Function GUI_Render() End Function Function GUI_render_2D() End Function Function GAME() Local ENDGAME=False Repeat Cls GAME_Update() GAME_Render() UpdateWorld() RenderWorld() GAME_render_2d() Flip Until KeyHit(1) Or ENDGAME=True End Function Function GAME_update() PositionEntity mouse_pivot,-19.1+(MouseX()/20.99),-(-14.2+(MouseY()/20.99)),-2 PointEntity player\sight_pivot,mouse_pivot game_align(player\model,mouse_pivot,1) End Function Global switch=False Function game_align( Entity, Target, Smooth# ) dp# = GAME_LIMIT ( DeltaPitch( Entity , Target ) , -Smooth , Smooth ) dy# = GAME_LIMIT ( DeltaYaw( Entity , Target ), -Smooth , Smooth ) TurnEntity Entity, 0 , dy , 0 End Function Function GAME_LIMIT#( q# , low# , hi# ) If q < low q = low If q > hi q = hi Return q End Function Function GAME_render() PositionEntity player\model,player\x,player\y,-2,1 End Function Function GAME_render_2D() DrawImage line_hor,0,MouseY(),0 DrawImage line_vert,MouseX(),0,0 DrawImage target,MouseX(),1+MouseY(),0 Text 1,1,"Yaw :"+EntityYaw(player\model,1) Text 1,20,"pit :"+EntityPitch(player\model,1) Text 1,30,"rol :"+EntityRoll(player\model,1) End Function |
| ||
Here is the full source with models and art. http://yavin.binary-people.com/source/Roidz.zip |
| ||
Not tested, but this is a sound method. function betterPointEntity(Entity1,entity2,axis=1) xd#=entityX(entity2)-entityX(entity1) yd#=entityY(entity2)-entityY(entity1) zd#=entityZ(entity2)-entityZ(entity1) td#=sqr(xd*xd+yd*yd+zd*zd) alignToVector Entity1,xd/td,yd/td,zd/td,axis end function Depending on your model's orientation you may want to change axis to 0 or 2. |
| ||
Yeah that function is ok, but it allows for the ship to turn on all axis.. So Still need some help here. All I want is for the ship to turn left or right to face the target, it should not turn on any other axis. |
| ||
what i did was parent the model to a pivot and rotated the pivot instead on only yaw. |
| ||
I tried that cKob it didnt work though. |
| ||
hmm maybe detect if the mouse pointer is near the model and tell it not to allow any rotations. Thought this would work but I just noticed it does still rotate pitch :/ |
| ||
function betterPointEntity(Entity1,entity2,axis=1) xd#=entityX(entity2)-entityX(entity1) yd#=entityY(entity2)-entityY(entity1) zd#=entityZ(entity2)-entityZ(entity1) td#=sqr(xd*xd+yd*yd+zd*zd) alignToVector Entity1,xd/td,0,zd/td,axis end function If you cancel out the Y part of the vector, it'll only point along the flat x/z plane(I.e only affect yaw).. again not tested..but it should work, maybe with axis 0 or 2. |
| ||
How about: Create a pivot. After moving the target, position the pivot at x,z of the target and y of the ship. Then, use "PointEntity ship, pivot". If necessary, add "EntityRotate ship,0,entityYaw(ship),0,1" (last 1 = global). That should keep it pinned down to the original orientation except for compass point. If all of this does not fit your situation, then still, apply the principle: "the simpler the better". Good luck! |
| ||
Try this Yavin, you're axis were all wrong so I've changes a couple of things. I've positioned camera directly above - it works.; ; ; Asteroids Remake. ; ; This mini project has been started as a test bed for some of the things ; I plan to implement into the SolarShatter code base. ; ; Graphics3D 800,600,32,2 SetBuffer BackBuffer() Cls HidePointer() Global cam=CreateCamera() PositionEntity cam,0,20,0 RotateEntity cam,90,0,0 Global light=CreateLight() Global switch=False Global background=CreatePlane() Global texture_background=LoadTexture("img/bg1.jpg") ScaleTexture texture_background,40,30 PositionTexture texture_background,.50,.50 EntityTexture background,texture_background Global line_vert=LoadImage("img/vert.jpg") Global line_hor=LoadImage("img/hor.jpg") Global Target=LoadImage("img/target.bmp"):MidHandle target:MaskImage target,255,0,255 Global PLayer_Ship=LoadMesh("models/ship.3ds") ScaleEntity player_ship,.02,.02,.02 HideEntity PLayer_Ship Type player Field x# Field y# Field z# Field turn_rate# Field turn_amount# Field sight_pivot Field model End Type Global player.player = New player player\x=0 player\y=0 player\z=0 player\turn_rate=1.5 player\model=CopyEntity(player_ship) PositionEntity player\model,0,0,0 player\sight_pivot=CreatePivot( player\model) PositionEntity player\sight_pivot,0,0,-2 t=CreateSphere(3, player\sight_pivot):ScaleEntity t, 30, 30, 30 ;Play out the game intro Intro() Function Intro() GUI() End Function End ;======================== ;======================== ;======================== Function GUI() Local ENDGUI=False Repeat Cls GUI_Update() GUI_Render() UpdateWorld() RenderWorld() GUI_Render_2D() If KeyHit(57)=1 Then Game() Flip False Until KeyHit(1) Or ENDGUI=True End Function ;======================== ;======================== ;======================== Function GUI_Update() End Function ;======================== ;======================== ;======================== Function GUI_Render() End Function ;======================== ;======================== ;======================== Function GUI_render_2D() End Function ;======================== ;======================== ;======================== Function GAME() Local ENDGAME=False Repeat Cls GAME_Update() GAME_Render() UpdateWorld() RenderWorld() GAME_render_2d() Flip Until KeyHit(1) Or ENDGAME=True End Function Function GAME_update() PositionEntity player\sight_pivot,-19.1+(MouseX()/20.99),0, -(-14.2+(MouseY()/20.99)), 1 game_align(player\model, player\sight_pivot,1) End Function ;======================== ;======================== ;======================== Function game_align( Entity, Target, Smooth# ) dp# = GAME_LIMIT ( DeltaPitch( Entity , Target ) , -Smooth , Smooth ) dy# = GAME_LIMIT ( DeltaYaw( Entity , Target ), -Smooth , Smooth ) TurnEntity Entity, 0 , dy , 0, 1 End Function ;======================== ;======================== ;======================== Function GAME_LIMIT#( q# , low# , hi# ) If q < low q = low If q > hi q = hi Return q End Function ;======================== ;======================== ;======================== Function GAME_render() PositionEntity player\model, player\x,0,player\z End Function Function GAME_render_2D() DrawImage line_hor,0,MouseY(),0 DrawImage line_vert,MouseX(),0,0 DrawImage target,MouseX(),1+MouseY(),0 Text 1,1,"Yaw :"+EntityYaw(player\model,1) Text 1,20,"pit :"+EntityPitch(player\model,1) Text 1,30,"rol :"+EntityRoll(player\model,1) End Function |
| ||
That did the trick m8, I knew it was something daft like that. thanks m8. |