[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37647] branches/merwin-spacenav: small fix to turntable mode, first attempt at trackball code, ndof now respects view locking and updates 'User Persp' etc.

Mike Erwin significant.bit at gmail.com
Mon Jun 20 03:54:53 CEST 2011


Revision: 37647
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37647
Author:   merwin
Date:     2011-06-20 01:54:49 +0000 (Mon, 20 Jun 2011)
Log Message:
-----------
small fix to turntable mode, first attempt at trackball code, ndof now respects view locking and updates 'User Persp' etc.

Modified Paths:
--------------
    branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp
    branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c

Modified: branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp
===================================================================
--- branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp	2011-06-20 01:20:51 UTC (rev 37646)
+++ branches/merwin-spacenav/intern/ghost/intern/GHOST_NDOFManager.cpp	2011-06-20 01:54:49 UTC (rev 37647)
@@ -175,7 +175,9 @@
 
 				// -- older devices --
 				case 0xC623: puts("ndof: SpaceTraveler not supported, please file a bug report"); break;
+					// no buttons?
 				case 0xC625: puts("ndof: SpacePilot not supported, please file a bug report"); break;
+					// 21 buttons
 
 				default: printf("ndof: unknown Logitech product %04hx\n", product_id);
 				}
@@ -185,7 +187,10 @@
 		}
 
 	m_buttonMask = ~(-1 << m_buttonCount);
-	printf("ndof: %d buttons -> %X\n", m_buttonCount, m_buttonMask);
+
+	#ifdef DEBUG_NDOF_BUTTONS
+	printf("ndof: %d buttons -> hex:%X\n", m_buttonCount, m_buttonMask);
+	#endif
 	}
 
 void GHOST_NDOFManager::updateTranslation(short t[3], GHOST_TUns64 time)
@@ -312,7 +317,7 @@
 	data->ty = scale * m_translation[1];
 	data->tz = scale * m_translation[2];
 
-	data->rx = scale * m_rotation[0];
+	data->rx = -scale * m_rotation[0];
 	data->ry = scale * m_rotation[1];
 	data->rz = scale * m_rotation[2];
 

Modified: branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c
===================================================================
--- branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c	2011-06-20 01:20:51 UTC (rev 37646)
+++ branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c	2011-06-20 01:54:49 UTC (rev 37647)
@@ -954,47 +954,93 @@
 {
 	wmNDOFMotionData* ndof = (wmNDOFMotionData*) event->customdata;
 
+	float sensitivity = 1.f; /* ooh, magic number!
+	const float sensitivity = 0.035; /* ooh, magic number!
+		there will be several of these as interactions get tuned */
+
 	float dt = ndof->dt;
+	if (dt > 0.25f)
+		/* this is probably the first event for this motion, so set dt to something reasonable */
+		/* TODO: replace such guesswork with a flag or field from the NDOF manager */
+		dt = 0.0125f;
 
 	RegionView3D* rv3d = CTX_wm_region_view3d(C);
 
-	/* turntable view code by John Aughey, adapted for 3D mouse by [mce] */
-	float phi, q1[4];
-	float m[3][3];
-	float m_inv[3][3];
-	float xvec[3] = {1,0,0};
+	int /* bool */ has_rotation = rv3d->viewlock != RV3D_LOCKED && (ndof->rx || ndof->ry || ndof->rz);
+	if (has_rotation)
+		rv3d->view = RV3D_VIEW_USER;
 
-	const float sensitivity = 0.035;
+	if (has_rotation) {
+		if (U.flag & USER_TRACKBALL) {
+			/* TODO: write trackball code! */
 
-	if (dt > 0.25f)
-		/* this is probably the first event for this motion, so set dt to something reasonable */
-		dt = 0.0125f;
+			float axis[3] = {ndof->rx, ndof->ry, ndof->rz};
+			float angle = sensitivity * dt * ndof_to_angle_axis(axis, axis);
+			float rotation[4], rotationconj[4];
+			float view[4], viewconj[4];
 
-	/* Get the 3x3 matrix and its inverse from the quaternion */
-	quat_to_mat3(m,rv3d->viewquat);
-	invert_m3_m3(m_inv,m);
+			// convert to quaternion
+			axis_angle_to_quat(rotation, axis, angle);
 
-	/* Determine the direction of the x vector (for rotating up and down) */
-	/* This can likely be computed directly from the quaternion. */
-	mul_m3_v3(m_inv,xvec);
+			// extract rotation component of viewquat
+			copy_qt_qt(view, rv3d->viewquat);
+			invert_qt(view);
+			normalize_qt(view);
+			copy_qt_qt(viewconj, view);
+			conjugate_qt(viewconj);
 
-	/* Perform the up/down rotation */
-	phi = sensitivity * -ndof->rx;
-	q1[0] = cos(phi);
-	mul_v3_v3fl(q1+1, xvec, sin(phi));
-	mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
+			// transform device rotation into view's frame of reference
+			// rotation(view) = view * rotation(world) * viewconj
+			mul_qt_qtqt(rotation, rotation, viewconj);
+			mul_qt_qtqt(rotation, view, rotation);
 
-	/* Perform the orbital rotation */
-	phi = sensitivity * ndof->rz;
-	q1[0] = cos(phi);
-	q1[1] = q1[2] = 0.0;
-	q1[3] = sin(phi);
-	mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
+			// apply rotation to obtain new viewpoint
+//			copy_qt_qt(rotationconj, rotation);
+//			conjugate_qt(rotationconj);
+//			mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rotationconj);
+//			mul_qt_qtqt(rv3d->viewquat, rotation, rv3d->viewquat);
+			mul_qt_qtqt(rv3d->viewquat, rotation, rv3d->viewquat);
 
-	ED_region_tag_redraw(CTX_wm_region(C));
-	return OPERATOR_FINISHED;
+			// this is *close* to trackball behavior
+			// rotation axis needs to remain fixed relative to viewpoint, not world coordinates
+
+			ED_region_tag_redraw(CTX_wm_region(C));
+
+		} else {
+			/* turntable view code by John Aughey, adapted for 3D mouse by [mce] */
+			float phi, q1[4];
+			float m[3][3];
+			float m_inv[3][3];
+			float xvec[3] = {1,0,0};
+
+			/* Get the 3x3 matrix and its inverse from the quaternion */
+			quat_to_mat3(m,rv3d->viewquat);
+			invert_m3_m3(m_inv,m);
+
+			/* Determine the direction of the x vector (for rotating up and down) */
+			/* This can likely be computed directly from the quaternion. */
+			mul_m3_v3(m_inv,xvec);
+
+			/* Perform the up/down rotation */
+			phi = sensitivity * dt * ndof->rx;
+			q1[0] = cos(phi);
+			mul_v3_v3fl(q1+1, xvec, sin(phi));
+			mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
+
+			/* Perform the orbital rotation */
+			phi = sensitivity * dt * ndof->rz;
+			q1[0] = cos(phi);
+			q1[1] = q1[2] = 0.0;
+			q1[3] = sin(phi);
+			mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
+
+			ED_region_tag_redraw(CTX_wm_region(C));
+		}
 	}
 
+	return OPERATOR_FINISHED;
+}
+
 // Tom's version
 #if 0 
 static int viewndof_invoke(bContext *C, wmOperator *op, wmEvent *event)




More information about the Bf-blender-cvs mailing list