Change camera rotation point to mesh face

Hi Guys,

I’m pretty new to Unity, and I appologise for the long question.
I’m trying to use Unity to create a simple 3D model viewer. I currently have a script which rotates the camera when the user clicks and drags with the mouse. Here is my camera rotate code snippet:

//get left mouse button
		//Get mouse origin
		mouseOrigin = Input.mousePosition;
		rotating = true;

if (rotating){
		var pos : Vector3 = Camera.main.ScreenToViewportPoint(Input.mousePosition - mouseOrigin);
		transform.RotateAround(target.transform.position, transform.right, -pos.y * rotateSpeed);
		transform.RotateAround(target.transform.position, Vector3.up, pos.x * rotateSpeed);		

As you can see, the code rotates the camera about a target - in mycase an empty game object. One of the features I’d like to add is the ability to change the rotation point of the camera based on what is ‘underneath’ the mouse pointer. For instance if the mouse is pointed at the face of a mesh and the user clicks and drags to rotate the view, I’d like the rotation point to be on the face of that mesh, where the cursor was pointing when the drag started. This is the behavior you see in 3D CAD packages like SolidWorks etc.

I imagine that I can do this with a raycast - find the point of intersection, move the rotation point to the intersection point then perform the rotation. However, as far as I understand, you need a collider on the mesh for that to work. My scenes are going to be made up of lots and lots of mechanical parts like nuts and bolts etc, I don’t want to have to add colliders to each individual part.

Is there a better way to do this? Or perhaps a way to add colliders automatically to all parts without affecting performance too much?

I think you should consider creating some simplified colliders to accompany your high-poly objects. I’m thinking this may be the superior option here.

The only alternative that comes to mind would involve translating the mesh’s triangle data into world space, finding which tris could possibly be beneath the mouse, performing ray intersection tests agasint each manually with a 3D geometry library, and reporting the closest hitpoint.

I went through something similar trying to create triangle-based mesh destruction, but I was able to avoid a space conversion or two through some trickery. Not sure it would apply in your scenario; I’m thinking some simplified colliders is a much better option.