Flickering object

Blitz3D Forums/Blitz3D Programming/Flickering object

Picklesworth(Posted 2004) [#1]
Help please. I'm getting an odd flickering thing here with my ship oject, what am I doing wrong?
;3d space flight engine v 3
;now that I have proper physics, I think it may work out
;I'm aiming to fix the gameplay problem involving it just not 'feeling' right

;set up graphics
Graphics3D 1024,768,32

;double buffering
SetBuffer BackBuffer()

;set up tokamak simulator

TOKSIM_SetRigidBodiesCount 1
TOKSIM_SetAnimatedBodiesCount 0
TOKSIM_SetRigidParticleCount 0
TOKSIM_SetControllersCount 0
TOKSIM_SetGeometriesCount 14

TOKSIM_CreateSimulator(0,0,0)

;load the ship
;NOTE: CHANGE THIS TO AN ARRAY!!
Global ship01=LoadMesh("ship1.b3d")

;the camera
Global cam1 = CreateCamera()
CameraViewport cam1,0,0,GraphicsWidth(),GraphicsHeight()
PositionEntity cam1,0,3,-10

;the lights
AmbientLight 100,100,100

;render tweening timer / constants / initial variables
Const FPS=30
period=1000/FPS
time=MilliSecs()-period

;the ship rigid body
ship01rb=TOKRB_Create()
	TOKRB_SetPosition ship01rb,0.0,0.0,0.0
	TOKRB_SetRotation ship01rb,90.0,180.0,0.0
	TOKRB_SetBoxInertiaTensor ship01rb,5.0,5.0,5.0,1.0
	TOKRB_SetMass ship01rb,100.0
	TOKRB_SetLinearDamping ship01rb,0.1
	TOKRB_SetAngularDamping ship01rb,0.1
	TOKRB_CollideConnected ship01rb,0

	ship01rb_1 = TOKRB_AddBox(ship01rb,-2.20411,-2.88501,2.09501)
		TOKGEOM_SetPositionAndRotation g,-3.78355,-0.312894,-0.471711,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_1,0

	ship01rb_2 = TOKRB_AddBox(ship01rb,2.0,-0.913641,-1.19867)
		TOKGEOM_SetPositionAndRotation g,-3.78568,-2.07925,-0.294399,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_2,0

	ship01rb_3 = TOKRB_AddBox(ship01rb,-2.0,-3.0,0.804565)
		TOKGEOM_SetPositionAndRotation g,-3.85608,-3.90423,-0.268204,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_3,0

	ship01rb_4 = TOKRB_AddBox(ship01rb,1.86821,-0.93018,-0.757756)
		TOKGEOM_SetPositionAndRotation g,-3.94073,-5.83604,-0.289075,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_4,0

	ship01rb_5 = TOKRB_AddBox(ship01rb,1.44042,-0.808995,-0.571616)
		TOKGEOM_SetPositionAndRotation g,-3.83165,-6.66908,-0.3939,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_5,0

	ship01rb_6 = TOKRB_AddBox(ship01rb,-1.36885,-1.11293,-0.847562)
		TOKGEOM_SetPositionAndRotation g,-2.3013,-0.285581,-0.419939,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_6,0

	ship01rb_7 = TOKRB_AddBox(ship01rb,1.5764,-0.906782,-0.5684)
		TOKGEOM_SetPositionAndRotation g,-0.947437,-0.327261,-0.415343,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_7,0

	ship01rb_8 = TOKRB_AddBox(ship01rb,1.49912,-1.17104,-0.826421)
		TOKGEOM_SetPositionAndRotation g,-5.59488,-0.325605,-0.399286,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_8,0

	ship01rb_9 = TOKRB_AddBox(ship01rb,1.20174,-0.92761,0.578545)
		TOKGEOM_SetPositionAndRotation g,-6.92694,-0.300521,-0.372304,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_9,0
		
	ship01rb_10 = TOKRB_AddBox(ship01rb,0.379707,-2.13287,1.27555)
		TOKGEOM_SetPositionAndRotation g,-0.0445214,-0.347584,-0.413206,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_10,0
		
	ship01rb_11 = TOKRB_AddBox(ship01rb,-0.320397,-2.21165,-1.36992)
		TOKGEOM_SetPositionAndRotation g,-7.58982,-0.350264,-0.375476,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_11,0

	ship01rb_12 = TOKRB_AddBox(ship01rb,0.246424,-1.22218,0.220696)
		TOKGEOM_SetPositionAndRotation g,-0.0723057,-1.96473,-0.402167,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex ship01rb_12,0

	ship01rb_13 = TOKRB_AddBox(ship01rb,-0.237158,-1.5,0.245809)
		TOKGEOM_SetPositionAndRotation g,-7.61479,-1.83985,-0.40037,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex g,0

	ship01rb_14 = TOKRB_AddCylinder(ship01rb,1.73311,2.2236)
		TOKGEOM_SetPositionAndRotation g,-3.80075,-4.39053,-0.900166,0.0,0.0,0.0
		TOKGEOM_SetMaterialIndex g,0
		
TOKRB_UpdateBoundingInfo ship01rb
		
;the acceleration variable NOTE: SWITCH THRUST INTO THE SHIP01 ARRAY/TYPE
thrust# = 0
		

;main loop
While Not KeyDown(1)

;damned render tweening. Make this code more readable at some point. The indenting's all messed up.

	Repeat
		elapsed=MilliSecs()-time
	Until elapsed
	ticks=elapsed/period	;how many 'frames' have elapsed	
	tween#=Float(elapsed Mod period)/Float(period)	;fractional remainder
	For k=1 To ticks
		time=time+period
		If k=ticks Then CaptureWorld

		;;;;;;;;;;;;;;CONTENT HERE;;;;;;;;;;;;;;;;;;;;
		
		;;;acceleration stuff;;;

		; if the + key is pressed
	
		If KeyDown(78)
	
		;if not exeeding max speed  NOTE: WHEN YOU SET UP AN ARRAY/TYPE INSTANCE FOR THE SHIP, MAKE THIS A VARIABLE
			If thrust#<2000
		
			;speed up		
			thrust# = thrust# + 10
		
			EndIf
		EndIf
	
		;if the - key is pressed
	
		If KeyDown(74)
	
			If thrust#>-2000 ; max speed check
		
				;slow down
				thrust# = thrust# - 10
			EndIf	
		EndIf
	
		If KeyDown(11)
			thrust# = 0
		EndIf
	
		;actually move	
		
		TOKRB_SetForce ship01rb,0,0,thrust#
		
		;end acceleration stuff
	
		;rotation
	
		;left turn with "a" key
		If KeyDown(30)	
			TOKRB_ApplyImpulse2 ship01rb,0,0,0.5,TOKRB_GetX(ship01rb)+1,TOKRB_GetY(ship01rb),TOKRB_GetZ(ship01rb)
			TOKRB_ApplyImpulse2 ship01rb,0,0,-0.5,TOKRB_GetX(ship01rb)-1,TOKRB_GetY(ship01rb),TOKRB_GetZ(ship01rb)
		EndIf
	
		;right turn with "d" key
		If KeyDown(32)
			TOKRB_ApplyImpulse2 ship01rb,0,0,0.5,TOKRB_GetX(ship01rb)-1,TOKRB_GetY(ship01rb),TOKRB_GetZ(ship01rb)
			TOKRB_ApplyImpulse2 ship01rb,0,0,-0.5,TOKRB_GetX(ship01rb)+1,TOKRB_GetY(ship01rb),TOKRB_GetZ(ship01rb)
		EndIf
		
		;match ship01 to the tokamak rigid body
		PositionEntity ship01,TOKRB_GetX#(ship01rb),TOKRB_GetY#(ship01rb),TOKRB_GetZ#(ship01rb)
		RotateEntity ship01,TOKRB_GetPitch#(ship01rb),TOKRB_GetYaw#(ship01rb),TOKRB_GetRoll#(ship01rb),False

		;camera movement
;			PositionEntity cam1,EntityX(ship01),EntityY(ship01)+3,EntityZ(ship01)-10
;			PointEntity cam1,ship01
		
		;;;;;;;;;;;;;;;;END CONTENT;;;;;;;;;;;;;;;;;;;;
	
		;update the simulator
			TOKSIM_Advance(1.5/FPS,1)
			
		;finish render tweening
			UpdateWorld
		Next
	
	RenderWorld tween#
		
	;more double buffering
	Flip
		
Wend

TOKSIM_DestroySimulator()
End

Uh, sorry about any vulgar language, It will go through very extensive editing if this works out and I release it with source. I got a bit angry at my indenting :D
You will need the 3d model at http://www.freewebs.com/bass-line/projects/3dmodels/ship1.b3d to see the ship, and the tokamak physics wrapper v. 0.4 or higher. Just download from the link on the blitzbasic.com main page.
Thanks in advance!


Sweenie(Posted 2004) [#2]
Try adding the following line after you load the ship.
RotateMesh ship01,90,180,0

and change the TOKRB_SetRotation line to...
TOKRB_SetRotation ship01rb,0.0,0.0,0.0
or simply remove it.

I thought I had the rotations all worked out but there still seems to be some nasty little bugs in the code.


Picklesworth(Posted 2004) [#3]
Yay it works! Thanks. Now to focus on getting my friction stuff down to sensible amounts...