Attaching camera to a joint

Blitz3D Forums/Blitz3D Beginners Area/Attaching camera to a joint

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Be careful when using the EntityPitch command. It will return duplicate values at different points of rotation. It's better to use a variable to store the pitch value.

EntityYaw and EntityRoll return useful values, but they may not be the values you expect. I'd recommend experimentation.

EntityPitch, EntityYaw, and EntityRoll can be used as a set to take a snapshot of the total rotational state of an entity, however.

Here's some code that can be used to view the rotational values returned by these commands:-

Const C_CAM_TURN_RATE# = 1.0

Global timer = CreateTimer( 25 )

Graphics3D 800, 600, 0, 2
SetBuffer BackBuffer()

Global cam = CreateCamera()
CameraZoom cam, 1.6
PositionEntity cam, 15.0, 0.0, 0.0

Global light = CreateLight()

Global cone_x = CreateCone() ; Cone points to X+.
RotateMesh cone_x, 0.0, 0.0, -90.0
UpdateNormals cone_x
HideEntity  cone_x

Global cone_y = CreateCone() ; Cone points to Y+.
UpdateNormals cone_y
HideEntity  cone_y

Global cone_z = CreateCone() ; Cone points to Z+.
RotateMesh cone_z, 90.0, 0.0, 0.0
UpdateNormals cone_z
HideEntity  cone_z

Global cone = cone_z
ShowEntity cone

PointEntity cam, cone

Global axis = 1

While Not KeyHit( 1 )

	If KeyHit( 57 )
		axis = axis + 1
		If axis = 4 Then axis = 1
	
		RotateEntity cone, 0.0, 0.0, 0.0
	
		HideEntity cone
		
		If axis = 1 Then PositionEntity cam, 15.0, 0.0, 0.0 : cone = cone_z
		If axis = 2 Then PositionEntity cam, 0.0, 15.0, 0.0 : cone = cone_x
		If axis = 3 Then PositionEntity cam, 0.0, 0.0, 15.0 : cone = cone_y
	
		ShowEntity cone
	
		PointEntity cam, cone
	EndIf
	
	If axis = 1 Then TurnEntity cone, C_CAM_TURN_RATE#, 0.0, 0.0
	If axis = 2 Then TurnEntity cone, 0.0, C_CAM_TURN_RATE#, 0.0
	If axis = 3 Then TurnEntity cone, 0.0, 0.0, C_CAM_TURN_RATE#
	
	UpdateWorld
	RenderWorld
	
	Color 255, 255, 255
	
	Text 10, 10, "Press SPACE to switch to a new axis of rotation"
	
	If axis = 1
		Text 10, 40, "Pitch (X axis): " + EntityPitch( cone )
		Text 10, 60, "Viewing from X+"
		Text 10, 80, "Cone points to Z+"
	EndIf
	
	If axis = 2
		Text 10, 40, "Yaw (Y axis): " + EntityYaw( cone )
		Text 10, 60, "Viewing from Y+"
		Text 10, 80, "Cone points to X+"
	EndIf
	
	If axis = 3
		Text 10, 40, "Roll (Z axis): " + EntityRoll( cone )
		Text 10, 60, "Viewing from Z+"
		Text 10, 80, "Cone points to Y+"
	EndIf
	
	If axis <> 1
	
		Color 200, 0, 0
		
		; -- Draw X+ axis marker.
		CameraProject cam, 5.0, 0.0, 0.0
		Text ProjectedX# (), ProjectedY# (), "X+", True, True
		;^^^^^^
		
		; -- Draw X- axis marker.
		CameraProject cam, -5.0, 0.0, 0.0
		Text ProjectedX# (), ProjectedY# (), "X-", True, True
		;^^^^^^
	
	EndIf
	
	If axis <> 2
	
		Color 240, 240, 0
		
		; -- Draw Y+ axis marker.
		CameraProject cam, 0.0, 5.0, 0.0
		Text ProjectedX# (), ProjectedY# (), "Y+", True, True
		;^^^^^^
		
		; -- Draw Y- axis marker.
		CameraProject cam, 0.0, -5.0, 0.0
		Text ProjectedX# (), ProjectedY# (), "Y-", True, True
		;^^^^^^
	
	EndIf
	
	If axis <> 3
	
		Color 0, 240, 0
		
		; -- Draw Z+ axis marker.
		CameraProject cam, 0.0, 0.0, 5.0
		Text ProjectedX# (), ProjectedY# (), "Z+", True, True
		;^^^^^^
		
		; -- Draw Z- axis marker.
		CameraProject cam, 0.0, 0.0, -5.0
		Text ProjectedX# (), ProjectedY# (), "Z-", True, True
		;^^^^^^
	
	EndIf
	
	Flip
	
	WaitTimer( timer )
	
Wend

End