Align to vector
Blitz3D Forums/Blitz3D Beginners Area/Align to vector
| ||
Hi, I have been using the AlignToVector command to point my camera in my program and after lots of mashing on my controls i noticed the camera seems slightly out of whack, are there any rounding errors i need to be aware of when using this command? Hope that's readable, I'm not very good at this Internet forum malarkey |
| ||
Never had an issue with align to vector. Do you have a huge world( in terms of blitz units ) as this can lead to floating point inaccuracies in some situations? Can you show us the basic code you're using? Stevie |
| ||
Hi thanks for the quick replyFunction Update() CamX# = EntityX(MainCam, 1) CamY# = EntityY(MainCam, 1) CamZ# = EntityZ(MainCam, 1) Ship1X# = EntityX(Ship1, 1) Ship1Y# = EntityY(Ship1, 1) Ship1Z# = EntityZ(Ship1, 1) PositionEntity( SkyBox, CamX#, CamY#, CamZ#,1) PositionEntity( SkyBox2, CamX#, CamY#, CamZ#,1) TFormVector (0,0,1, SPivot, 0) SpX# = TFormedX() SpY# = TFormedY() ; Align Ship to +Z of SPivot SpZ# = TFormedZ() AlignToVector (Ship1, SpX#, SpY#, SpZ#, 3, 0.1) TFormVector (0,1,0, SPivot, 0) SpX# = TFormedX() SpY# = TFormedY() ; Align Ship to +Y of SPivot SpZ# = TFormedZ() AlignToVector (Ship1, SpX#, SpY#, SpZ#, 2, 0.1) TFormVector (0,1,0, CPivot, 0) SpX# = TFormedX() SpY# = TFormedY() ; Align Cam to +Y of CPivot SpZ# = TFormedZ() AlignToVector (MainCam, SpX#, SpY#, SpZ#, 2, 0.1 ) TFormVector (0,0,1, CPivot, 0) SpX# = TFormedX() SpY# = TFormedY() ; Align Cam to +Z of CPivot SpZ# = TFormedZ() AlignToVector (MainCam, SpX#, SpY#, SpZ#, 3, 0.1 ) ToPivX# = EntityX(TPivot, 1) - EntityX(MainCam, 1) ToPivY# = EntityY(TPivot, 1) - EntityY(MainCam, 1) ; Get Vector to TPivot ToPivZ# = EntityZ(TPivot, 1) - EntityZ(MainCam, 1) AlignToVector (CPivot, ToPivX#, ToPivY#, ToPivZ#, 3, 1) ; Point Rest Pivot at TPivot AlignToVector (CamPiv, ToPivX#, ToPivY#, ToPivZ#, 3, 1) ; Point CamPiv at TPivot SmoothMove ( CamPiv, CPivot, 0.1 ) ; Move Camera to rest smoothly ; Ship Movement MoveEntity (SPivot, 0, 0, SSpeed#) PositionEntity ( Ship1,EntityX(SPivot,1),EntityY(SPivot,1),EntityZ(SPivot,1),1 ) End Function this is a small snippet from my code (its a bit of a sprawling mess) im using pivots to position my camera behind my ship and the camera is pointed towards another pivot infront (TPivot) I hope this makes sense [Edit] oh just to add my world isnt very big its just a sky sphere and my ship floating about the world origin point |
| ||
Do you really need to align the camera to all 3 axis'? If you're trying to simlate pointentity but without potential gimbal lock then aligntovector on the z-axis will acheive this using quarternions. I'm not sure what your looking to acheive but the dodgy camera is probably as a result of aligning slowly to all 3 axis'. You could probably just get away with 2 .... the yaw/y and pitch/x axis or ...1 as above. Hope this helps. Stevie |
| ||
Not sure by what you mean as "out of whack" however there are rounding errors on everything that uses floating point maths. If there is drift in the matrix values due to aligntovector doing its thing on multiple axis then I would try RotateEntity cam,0,0,0 : ScaleEntity cam,1,1,1 every so often and see if it helps. Do the same for the camera pivot if the camera is parented to it. My thinking is that if it starts out working and gradually drifts off then this may be due to scaling issues. Could be something else entirely of course. |
| ||
Thanks my codes a complete mess at the moment i really should be designing it before have rather than tacking bits on. Im trying to align my camera Y vector with that of my target pivot so the camera is always pointing up in relation to my ship after a roll, im sure you have already gathered that, is there a better way of doing this? Thanks alot for your help |
| ||
I think you'd need to explain a bit about how you control the ship for me or others to help. A working code snipped .. even using a cone for the ship would be very handy. Stevie |
| ||
Okie ive hacked out the code the controls are commented, try turning the 'Ship' and rolling left and right at random then let the camera settle, after a bit it settles skewed.Graphics3D 800, 600, 32 SetBuffer BackBuffer() Global MainCam = CreateCamera() ; Global Camera Coords and info Global CamX# = 0 Global CamY# = 0 Global CamZ# = 0 Global CamZoom# = 1.5 ; Globals for Ship (Player) Global Ship1 ; Test ship Global Ship1X# =0 ; Ship X position Global Ship1Y# =0 ; Ship Y position Global Ship1Z# =0 ; Ship Z position Global SThrust# =0 ; Ships Set Speed Global SSpeed# =0 ; Ships Current Speed Global SAcc# =0 ; Ships Rate of Acceleration ; Globals for Pivots Global SPivot ; Ships Central Pivot Global TPivot ; Target pivot (both ship and cam points to this) Global CPivot ; Camera pivot (This is where the camera will rest at) Global CamPiv ; Camera Movement pivot (This the pivot the camera will be stuck to) Global MPivot ; Pivot for mouse movement TestShip() ; Main Game Loop While Not KeyHit(1) ; Start Main Game Loop Keys() Update() RenderWorld() Flip Wend End ; Create ship for control and tracking tests Function TestShip() SPivot = CreatePivot () ; Create Ship Central Pivot PositionEntity (SPivot, 0, 0, 0) Ship1 = CreateCube(SPivot) ScaleEntity (Ship1,1,1,2) TPivot = CreatePivot (SPivot) ; Create Target Pivot PositionEntity (TPivot, 0, 0, 40, 1) ; Position Target in front of ship PositionEntity ( MainCam, 0, 5,-20, 1 ) ; Position Camera behind ship CamPiv = CreatePivot() ; Create Camera Current Pivot PositionEntity (CamPiv, 0, 5,-20, 1) ; Position Behind Camera EntityParent (MainCam, CamPiv) ; Parent Camera to Pivot CPivot = CreatePivot (TPivot) ; Create Camera Rest Pivot PositionEntity (CPivot, 0, 5,-20, 1) ; Position Camera Rest Pivot MPivot = CreatePivot() ; Create 3D Mouse Position Pivot PositionEntity (MPivot, 0,0,40, 1) ; Move to +40 on Z Axis ; Set Ships Stats (Test) SAcc# = 0.01 ; Rate of Acceleration End Function ; Update Ship, Camera and Background Function Update() CamX# = EntityX(MainCam, 1) CamY# = EntityY(MainCam, 1) CamZ# = EntityZ(MainCam, 1) Ship1X# = EntityX(Ship1, 1) Ship1Y# = EntityY(Ship1, 1) Ship1Z# = EntityZ(Ship1, 1) TFormVector (0,0,1, SPivot, 0) SpX# = TFormedX() SpY# = TFormedY() ; Align Ship to +Z of SPivot SpZ# = TFormedZ() AlignToVector (Ship1, SpX#, SpY#, SpZ#, 3, 0.1) TFormVector (0,1,0, SPivot, 0) SpX# = TFormedX() SpY# = TFormedY() ; Align Ship to +Y of SPivot SpZ# = TFormedZ() AlignToVector (Ship1, SpX#, SpY#, SpZ#, 2, 0.1) TFormVector (0,1,0, CPivot, 0) SpX# = TFormedX() SpY# = TFormedY() ; Align Cam to +Y of CPivot SpZ# = TFormedZ() AlignToVector (MainCam, SpX#, SpY#, SpZ#, 2, 0.1 ) TFormVector (0,0,1, CPivot, 0) SpX# = TFormedX() SpY# = TFormedY() ; Align Cam to +Z of CPivot SpZ# = TFormedZ() AlignToVector (MainCam, SpX#, SpY#, SpZ#, 3, 0.1 ) ToPivX# = EntityX(TPivot, 1) - EntityX(MainCam, 1) ToPivY# = EntityY(TPivot, 1) - EntityY(MainCam, 1) ; Get Vector to TPivot ToPivZ# = EntityZ(TPivot, 1) - EntityZ(MainCam, 1) AlignToVector (CPivot, ToPivX#, ToPivY#, ToPivZ#, 3, 1) ; Point Rest Pivot at TPivot AlignToVector (CamPiv, ToPivX#, ToPivY#, ToPivZ#, 3, 1) ; Point CamPiv at TPivot SmoothMove ( CamPiv, CPivot, 0.1 ) ; Move Camera to rest smoothly ; Ship Movement MoveEntity (SPivot, 0, 0, SSpeed#) PositionEntity ( Ship1,EntityX(SPivot,1),EntityY(SPivot,1),EntityZ(SPivot,1),1 ) End Function ; Function for all key/mouse commands Function Keys() ; Ship Controls If KeyDown(200) TurnEntity (SPivot, 2,0,0) ; Up: Increase Pitch If KeyDown(208) TurnEntity (SPivot, -2,0,0) ; Down: Decrease Pitch If KeyDown(203) TurnEntity (SPivot, 0,2,0) ; Left: Increase Yaw (want to add tilt to pitch - If KeyDown(205) TurnEntity (SPivot, 0,-2,0) ; Right: Decrease Yaw turns for coolness) If KeyDown(16) TurnEntity (SPivot, 0,0,2) ; Q: Increase Roll If KeyDown(18) TurnEntity (SPivot, 0,0,-2) ; E: Decrease Roll ; Camera Controls If KeyDown(201) Then CamZoom = CamZoom + 0.1 ; PageUp: Increase Zoom If KeyDown(209) And CamZoom > 1.0 Then CamZoom = CamZoom - 0.1 ; PageDown: Decrease Zoom If KeyDown(199) Then CamZoom = 1.8 ; Home: Reset Zoom If CamZoom > 1.0 Then CameraZoom (MainCam, CamZoom ) ; Check Zoom no less than 1.0 If CamZoom < 1.0 Then CamZoom = 1.0 ; Test Move cam back and forward If KeyDown(210) Then MoveEntity(MainCam, 0,0,0.1) ; Insert: Move Cam forward If KeyDown(211) Then MoveEntity(MainCam, 0,0,-0.1) ; Delete: Move Cam back If KeyDown(30) And SThrust# < 5.0 ; A: Increase Thrust SThrust# = SThrust# + SAcc# EndIf If KeyDown(44) And SThrust# > 0.0 ; Z: Decrease Thrust SThrust# = SThrust# - SAcc# EndIf If SSpeed# < SThrust# Then SSpeed# = SSpeed# + SAcc# If SSpeed# > SThrust# Then SSpeed# = SSpeed# - SAcc# End Function ;Function for smooth movement from point A - B Function SmoothMove (Ent1, Ent2, Speed#) ; Ent1 is object i want to move, Ent2 is target X1# = EntityX(Ent1, 1) ; Object to moves coords Y1# = EntityY(Ent1, 1) Z1# = EntityZ(Ent1, 1) X2# = EntityX(Ent2, 1) ; Target coords Y2# = EntityY(Ent2, 1) Z2# = EntityZ(Ent2, 1) Xinc# = X2# - X1# Yinc# = Y2# - Y1# Zinc# = Z2# - Z1# TranslateEntity (Ent1, Xinc# * Speed# , Yinc# * Speed# , Zinc# * Speed# ) End Function Thanks again, very good of you to help |
| ||
Try not to use TurnEntity. Use:RotateEntity entity, EntityPitch(entity) + x_rot , EntityYaw(entity) + y_rot, EntityRoll(entity) + z_rot x_rot, y_rot and z_rot being the amount you wish to turn your craft by. Turn entity has a different way of rotating a mesh, than rotateentity. Turn entity sucks really... |
| ||
I don't really see much of a problem with that code really... Limme look again |
| ||
Well it is complicated. My guess is the problem is because you align +Z and +Y of the camera to Cpivot and then go on to align +Z of Campiv (which the camera is parented to) to Tpivot. I think this gives the X axis a bit too much freedom and hence the roll. (If you use mouse inputs for turning you can make the roll wind and unwind by moving the mouse in clockwise or anticlockwise circles). In any event there is a conflict there that you need to resolve. BTW. Turnentity might suck, but at least it avoids gimbal lock. Maybe it slerps. |
| ||
Thanks for the help everyone i will see if i can sort it out tonight |
| ||
Looks like i got it to work, ive now aligned the CPivots +y axis (the cameras rest position) to the TPivots +y axis (the Target 'Look at' pivot) and that seems to stop and skewing. Im sure there must be better ways to do this, but if it plays ok its ok with me hehe Thanks everyone for your help |
| ||
Sometimes, a solution is best if it is what works; even if it is not the BEST way to do it, a workable way will do until you have completed the program and want to to go back and tweak / optimize it for better ways. |