Pitch Problems

Blitz3D Forums/Blitz3D Beginners Area/Pitch Problems

Diablo(Posted 2004) [#1]


Does any one else get problems with this code...
on my machine when the pitch gets greater then 90, or less then -90 it goes wierd.


semar(Posted 2004) [#2]
put this code:
    PositionEntity Cam, entityx(Ball), entityy(Ball), entityz(ball)
     RotateEntity Cam, entitypitch(Ball), entityyaw(Ball), 0
     MoveEntity Cam, 0, 0, -10

outside of the main while..wend loop.

If you leave it inside the loop, then the ball rotation affects also the camera position and rotation. Which, I guess, is not exactly what you want..

Anyway, I've made a slight modification to your code, it may inspire you:
Graphics3D 800, 600, 32, 2

Global cam = CreateCamera()
Global ball = CreateSphere(32)
ScaleEntity ball,2,2,2

Global light = CreateLight(3) ;spot light
PositionEntity light,0,5,0
PointEntity light,ball

;let's just create a squared texture
batex = CreateTexture(32,32)
SetBuffer TextureBuffer(batex)
Color 200,25,0
Rect 2,2,30,30
SetBuffer BackBuffer()
EntityTexture ball,batex
ScaleTexture batex,0.1,0.1



SetBuffer BackBuffer()

PositionEntity Cam, EntityX(Ball), EntityY(Ball), EntityZ(ball)
RotateEntity Cam, EntityPitch(Ball), EntityYaw(Ball), 0
MoveEntity Cam, 0, 0, -10

While Not KeyHit(1)


     If KeyDown(200) Then
          TurnEntity Ball, 1, 0, 0

     ElseIf KeyDown(208) Then
          TurnEntity Ball, -1, 0, 0
     EndIf

     UpdateWorld: RenderWorld
     
     Flip: Cls
Wend:End


Sergio.


Diablo(Posted 2004) [#3]
no that is what i want, i am trying to make a 3d flight combat game and i need it so that you can do loop'da'loops and things like that.


semar(Posted 2004) [#4]
good luck then with your
loop'da'loops and things like that


Sergio.


jfk EO-11110(Posted 2004) [#5]
I think for a 3D flight sim you shouldn't use rotateentity at all, instead use Turnentity and feed it directly with the forces of the flight controls: the average of both tail planes that are both above or both below the normal level will give you the pitch to TURN. The diffrence of both of them will also give you the roll to turn (well, if it's a jet fighter thing)

And for the camera, I'd suggest to calculate a point that is behind the camera and then rubber-band-move the camera to that point continously (smoothed). Or you coul d even parent the camera to the plane. Or you can parent a dummy pivot to the airplane and then rubber-nand-move the camera to that pivots position, and simply point the camera to the airplane.


jfk EO-11110(Posted 2004) [#6]
Ok, I see now what you meant. I wrote a little Flight sim and everything works fine, I can do Loopings etc. withtout any problem, using the TurnEntity Command. But then I wanted some Filght Control Displays onscreen that shows the angles of the airplane. Now ENtityPitch gives me a range from -90 to 90. But unfortunately it doesn't represent a circe from 0 to 360 that would restart at 0 when it reaches 361, but goes up from 0 to 90, then sinks down to -90, just to raise again to 0. Additionally the EntityYaw also jumps from 0 to 180 at a certain point of the Pitch.

sorry, I currently have no better idea than to add a value to a variable simultanously with TurnEntity and from time to time correct the variable when Pitch passes the angle Zero.


Diablo(Posted 2004) [#7]
somtimes it also effects the roll as well which can be very annoying :<


Diablo(Posted 2004) [#8]
can u show me the code you used for the filght sim plz


jfk EO-11110(Posted 2004) [#9]
Graphics3D 640,480,32,2
SetBuffer BackBuffer()

TFormFilter 0
Dim side(35) ; used for the display
side(0)=LoadImage("hud_side.bmp")
For i=1 To 35
 side(i)=CopyImage(side(0))
 MidHandle side(i)
 RotateImage(side(i)),i*10
Next
MidHandle side(0)

jet=CreatePivot()
PositionEntity jet,0,3,0
camera=CreateCamera(jet)
CameraRange camera,1,100000
CameraFogMode camera,1
CameraFogRange camera,100,100000
CameraFogColor camera,100,150,170
CameraClsColor camera,100,150,170


ground=CreatePlane()
tex=CreateTexture(1024,1024) ; create a random "landscape"
SetBuffer TextureBuffer(tex)
For i=0 To 5000
 Color Rand(128,255),Rand(128,255),Rand(50,100)
 Rect Rand(-100,1124),Rand(-100,1124),Rand(100),Rand(100),1
Next
SetBuffer BackBuffer()
ScaleTexture tex,10000,10000
EntityTexture ground,tex

speed#=0

EntityType ground,2
EntityType jet,1
Collisions 1,2,2,2



While KeyDown(1)=0

 If KeyDown(200) Then
  speed=speed+1
  If speed >50 Then speed=50
 EndIf
 If KeyDown(208) Then
  speed=speed-.1
  If speed <0 Then speed=0
 EndIf
 button=GetJoy()
 jxs$=JoyX()
 jys$=JoyY()
 jzs$=JoyZ()
 If Instr(jxs$,"e")<>0 Then jxs$="0" ; prevent joystick rounding errors trough exponentional notation...
 If Instr(jys$,"e")<>0 Then jys$="0"
 If Instr(jzs$,"e")<>0 Then jzs$="0"
 jx#=jxs$
 jy#=jys$
 jz#=jzs$

 MoveEntity jet,0,0,speed ; forward
 TranslateEntity jet,0,-1.0,0 ; down by gravity
 rudl#=jy+(-jx) ; check rudders
 rudr#=jy+jx

 
 turnpitch#=-(rudl+rudr)/2.0
 turnroll#=rudl-rudr
 
 TurnEntity jet,turnpitch,0,turnroll

 UpdateWorld()
 RenderWorld()

 ; just some disply stuff
 Color 255,255,255
 Text 0,64,"Atlitude: "+ EntityY(jet)+" m"
 Text 0,80,"Speed: "+speed
 Oval 0,0,50,50,0
 Line 25+Cos(EntityRoll(jet,1))*25,25+Sin(EntityRoll(jet,1))*25,50-(25+Cos(EntityRoll(jet,1))*25),50-(25+Sin(EntityRoll(jet,1))*25)
 Line 25+Cos(EntityRoll(jet,1))*25,25+Sin(EntityRoll(jet,1))*25,50-(25+Cos(EntityRoll(jet,1)+90)*5),50-(25+Sin(EntityRoll(jet,1)+90)*5)
 Line 50-(25+Cos(EntityRoll(jet,1))*25),50-(25+Sin(EntityRoll(jet,1))*25),50-(25+Cos(EntityRoll(jet,1)+90)*5),50-(25+Sin(EntityRoll(jet,1)+90)*5)

50-(25+Sin(EntityPitch(jet,1))*25)
 wside=(18+(((EntityPitch(jet,1)+90.0)*2.0)/10.0))Mod 35
 If wside>35 Then wside=36
 If wside<0 Then wside=0
 DrawImage side(wside),85,25
 Text 120,25,"Pitch: "+EntityPitch(jet,1)
 Flip
Wend


It uses a joystick. First press the Cursor Up key to accellerate. THen pull back the Joystick to lift off. It's using a 50*50 Pixel sideview image of a jetfighter, but as I described, the display stuff don't works as I wanted. The solution I explained in my lates post isn't implemented here.

But of course, like in any 3D game, you need to remain inside a range of -32000 to 32000 to prevent zbuffer inaccuracies (that would result in wobbling geometry)