- Home /
restricting MouseOrbit input area
I am building an interactive app for ipad. I have a machine ( excavator ) on the screen that is being operated by touch ( dragging rigidbodies and colliders around ), but I want to use MouseOrbit as well.At the moment, when you drag elements of the excavator around it operates the mouseorbit as well, so it all gets a bit visually confusing. As the excavator is always in the middle of the scene, I want to be able to use mouseorbit everywhere on the screen except for the middle, so there is no overlap. Is there anyway to do this ?I figure there must be some way to script in to mouseorbit a boolean question asking is the mouse within such and such an area but do not know how to do this. I looked at this other comparable example efficient method to detect mouse events anywhere on screen but dont think it is applicable for ipad
Answer by Jesse Anders · Jan 26, 2011 at 08:50 PM
If all you're wanting to do is detect whether the mouse position is in an area (e.g. circle or rectangle) in the middle of the screen, that's very easy to do. A point-in-circle test looks like this (untested pseudocode):
inside = squaredLength(point - circleCenter) <= square(circleRadius);
And the point-in-rectangle test looks like this (I think Unity may even have a function for this):
inside =
point.x >= rect.min.x &&
point.x <= rect.max.x &&
point.y >= rect.min.y &&
point.y <= rect.max.y;
Oh I see it Rect.Contains .... thanks for the tip!
it works !...but it is a bit jerky for some reason....
Answer by richardzzzarnold · Jan 26, 2011 at 09:28 PM
I have put Rect.Contains into MouseOrbit.js in order to create a central exclusion zone, but am unsure how to reverse it. At the moment there is no input from outside the rectangle, but i want there to be no input from inside the rectangle. I have so far...
var target : Transform; var distance = 10.0; var rect = Rect (200,200, 450, 450);
var xSpeed = 250.0; var ySpeed = 120.0;
var yMinLimit = -20; var yMaxLimit = 80;
private var x = 0.0; private var y = 0.0;
@script AddComponentMenu("Camera-Control/Mouse Orbit")
function Start () { var angles = transform.eulerAngles; x = angles.y; y = angles.x;
// Make the rigid body not change rotation
if (rigidbody)
rigidbody.freezeRotation = true;
} function LateUpdate () { if (rect.Contains(Input.mousePosition)) if (target && Input.GetMouseButton(0)) {
x += Input.GetAxis("Mouse X") * xSpeed * 0.02;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02;
y = ClampAngle(y, yMinLimit, yMaxLimit);
var rotation = Quaternion.Euler(y, x, 0);
var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
transform.rotation = rotation;
transform.position = position;
}
}
static function ClampAngle (angle : float, min : float, max : float) { if (angle < -360) angle += 360; if (angle > 360) angle -= 360; return Mathf.Clamp (angle, min, max); }
You can edit your post to add more info (generally better than adding follow-up questions as answers, I think). As for your question, are you familiar with the ! operator? That's what you're looking for here.
oh thanks ! wasnt sure how to format script in comment form
Your answer

Follow this Question
Related Questions
Restrict touch input 0 Answers
Help In Making a SphereCast for 3D Tire! Working RayCast Script included! 0 Answers
key remaping menu 0 Answers
Is it possible to implement the steam controller in a non-steam game? 2 Answers
Strange LeanTween issue 0 Answers