Hi,
I built same method of you (the second) and it is working.

I realized that the sphere entity needs the POLYGON flag set. Otherway the hit position vector differs from the point it should hit visually.

Code:
#include <acknex.h>

void fncRotate ()
{
	VECTOR vPos, vTarget;
	vec_set ( &vPos, &camera->x );
	vec_set ( &vTarget, &mouse_dir3d );
	vec_scale ( &vTarget, 1000 );
	vec_add ( &vTarget, &vPos );
	c_trace ( &vPos, &vTarget, NULL );
	if ( HIT_TARGET )
	{
		ENTITY *ent = you;
		VECTOR vDir1;
		vec_diff ( &vDir1, &hit->x, &you->x );
		vec_normalize ( &vDir1, 1 );
		ANGLE angOld;
		vec_set ( &angOld, &you->pan );
		while ( mouse_left )
		{
			vec_set ( &vPos, &camera->x );
			vec_set ( &vTarget, &mouse_dir3d );
			vec_scale ( &vTarget, 1000 );
			vec_add ( &vTarget, &vPos );
			c_trace ( &vPos, &vTarget, NULL );
			if ( HIT_TARGET )
			{
				if ( you == ent )
				{
					draw_point3d ( &hit->x, COLOR_WHITE, 100, 2 );
					VECTOR vDir2, vAxis;
					vec_diff ( &vDir2, &hit->x, &you->x );
					vec_normalize ( &vDir2, 1 );
					vec_cross ( &vAxis , &vDir1 , &vDir2 );
					ANGLE angRot;
					ang_for_axis( &angRot, &vAxis, acosv ( vec_dot ( &vDir1 , &vDir2 ) ) );
					vec_set ( &you->pan, &angOld );
					ang_add( &you->pan, &angRot );
				}
			}
			
			DEBUG_VAR ( ent->pan, 10 );
			DEBUG_VAR ( ent->tilt, 40 );
			DEBUG_VAR ( ent->roll, 70 );
			wait(1);
		}
	}
}

void main ()
{
	mouse_mode = 4;
	wait(1);
	
	level_load ( "" );
	camera->x -= 100;
	ENTITY *ent = ent_create ( "sphere.mdl", nullvector, NULL );
	ent->flags |= POLYGON;
	
	on_mouse_left = fncRotate;
	
	while ( !key_esc )
		wait(1);
	
	ent_remove ( ent );
	sys_exit ( NULL );
	
}



Salud!