Entry 6381

BirdEye.js

   

Submitted by anonymous on Aug. 27, 2010 at 12:09 p.m.
Language: JavaScript. Code size: 4.2 KB.

var maxAngleInDegree : float = 70.0;
var minAngleInDegree : float = 30.0;

var maxZoomIn : float = 5.0;
var maxZoomOut : float = -5.0;

var panSensitivity : float = 1.0;
var zoomFactor : float = 1.0;

var invertMouse : boolean = true;

private var g_prevMousePos : Vector3;
private var g_camStartHeight : float;
private var g_zoomValue : float = 0.0;

private var g_leftMouseDown : boolean = false;
private var g_rightMouseDown : boolean = false;

function Start() : void
{
	g_camStartHeight = camera.transform.position.y;
}

function FixedUpdate () : void
{
	// Must track down button pressure manually because Input.GetMouseButtonDown() isn't reliable.
	// Sometimes, the event isn't fired in the update.
	if( Input.GetMouseButton(0) && false == g_leftMouseDown )
	{
		// Left button down
		g_leftMouseDown = true;
		
		g_prevMousePos = Input.mousePosition;
	}
	else if( false == Input.GetMouseButton(0) && g_leftMouseDown )
	{
		// Left button up
		g_leftMouseDown = false;
	}
	
	if( Input.GetMouseButton(1) && false == g_rightMouseDown )
	{
		// Right button down
		g_rightMouseDown = true;
		
		g_prevMousePos = Input.mousePosition;
	}
	else if( false == Input.GetMouseButton(1) && g_rightMouseDown )
	{
		// Right button up
		g_rightMouseDown = false;
	}
	
	
	var delta : Vector3;
	if( Input.GetMouseButton(0) || Input.GetMouseButton(1) )
	{
		var curMousePos : Vector3 = Input.mousePosition;
		delta = curMousePos - g_prevMousePos;
		
		if( invertMouse )
		{
			delta = -delta;
		}
		
		g_prevMousePos = curMousePos;
	}
	
	
	if( Input.GetMouseButton(0) )
	{
		// PAN 
		
		if( Vector3.zero != delta )
		{
			// Get the camera direction
			var rightDir : Vector3 = camera.transform.right;
			var frontDir : Vector3 = Vector3.Cross( rightDir, Vector3.up );
		
			var direction : Vector3 = frontDir * delta.y + rightDir * delta.x;
		
			// Compute the speed ratio (slower if near the ground)
			var speedRatio : float = camera.transform.position.y / g_camStartHeight;
			speedRatio *= speedRatio;
		
			// Move the camera
			camera.transform.Translate( direction * panSensitivity * speedRatio, Space.World );
		}
	}
	else if( Input.GetMouseButton(1) )
	{
		// ROTATION
		
		if( Vector3.zero != delta )
		{
			var prevCamTrans : Transform = camera.transform;
		
			// Compute the point to rotate around
			var worldForward = Vector3.Cross( camera.transform.right, Vector3.up );
			var alphaDeg = Vector3.Angle( -(camera.transform.forward), -worldForward );
			var alpha = alphaDeg * Mathf.Deg2Rad;
			
			var hypo : float = 1 / ( Mathf.Tan(alpha) / camera.transform.position.y );
			var p : Vector3 = camera.transform.position + camera.transform.forward * hypo;
			
			var rotAnglesDeg : Vector2;
			rotAnglesDeg.x = delta.x;
			
			var totalAngleDeg : float = alphaDeg + delta.y;
			if( totalAngleDeg > maxAngleInDegree )
			{
				rotAnglesDeg.y = delta.y - ( totalAngleDeg - maxAngleInDegree );
			}
			else if( totalAngleDeg < minAngleInDegree )
			{
				rotAnglesDeg.y = delta.y - ( totalAngleDeg - minAngleInDegree );
			}
			else
			{
				rotAnglesDeg.y = delta.y;
			}
			
			camera.transform.RotateAround( p, Vector3.up, -rotAnglesDeg.x );
			camera.transform.RotateAround( p, camera.transform.right, rotAnglesDeg.y );
		}
	}
	else
	{
		// ZOOM
		
		var zoomValue : float = Input.GetAxis( "Mouse ScrollWheel" );
		if( false == Mathf.Approximately(0.0, zoomValue) )
		{
			var dir : Vector3 = camera.transform.forward;
			
			if( zoomValue > 0.0 )
			{
				if( g_zoomValue < maxZoomIn )
				{
					g_zoomValue += zoomValue;
					if( g_zoomValue > maxZoomIn )
					{
						// Recalibrate
						zoomValue = zoomValue - (g_zoomValue - maxZoomIn);
						g_zoomValue = maxZoomIn;
					}
					
					camera.transform.Translate( dir * zoomValue * zoomFactor, Space.World );
				}
			}
			else
			{
				if( g_zoomValue > maxZoomOut )
				{
					g_zoomValue += zoomValue;
					if( g_zoomValue < maxZoomOut )
					{
						// Recalibrate
						zoomValue = zoomValue - (g_zoomValue - maxZoomOut);
						g_zoomValue = maxZoomOut;
					}
					
					camera.transform.Translate( dir * zoomValue * zoomFactor, Space.World );
				}
			}
		}
	}
}

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).