Hi osg-community,
I am working on a stereoscopic renderer which can receive mouse and
on-screen-touch-events to handle translations of the scene. Now I want to
extend this to handle gestures of the Xbox-Kinect camera. I already got it
working for the x and y on-screen translation. Unfortunatly I don't know how to
handle movements of the z-direction (towards/into the screen). I already ensure
that my coordinates from my kinect-camera are scaled from -1 to 1 for all
directions.
Here is the code that is already working for X and Y directions. I have tried
to extend (commented out) it for the Z direction but couldn't get it to work.
Maybe someone has any idea how to do it. My implementation for the z-direction
was a complete guess, so it is possible that I am way off.
Code:
double dist = opencover::cover->getViewerScreenDistance();
//
// The center is (0.5, 0.5) only if the viewer position is exactly in the
middle
// of the screen
// On the table, we are way more nearer to the bottom, thus, the center is
calculated
// dynamically. This way, head-tracking is possible
//
double horzFrustum = this->frustum.right + fabsf(this->frustum.left );
double vertFrustum = this->frustum.top + fabsf(this->frustum.bottom);
// double forwardFrustum = fabsf(this->frustum.zfar) +
fabsf(this->frustum.znear);
//
// For stereo, we are interacting on the screen surface and not on the near
plane,
// thus calculate the motion on the surface
//
double surfaceRight = (horzFrustum / 2.0f) * dist / this->frustum.znear;
double surfaceTop = (vertFrustum / 2.0f) * dist / this->frustum.znear;
// double surfaceFar = (forwardFrustum / 2.0f) * dist /
this->frustum.znear;
double screenCenterX = this->frustum.right / horzFrustum;
double screenCenterY = this->frustum.top / vertFrustum;
// double screenCenterZ = this->frustum.zfar / forwardFrustum;
//
// Compute x0 and y0 in world coords using the theorem on intersecting lines
//
double x0 = (cur.down.x() - screenCenterX) * 2.0 * surfaceRight;
double y0 = (cur.down.y() - screenCenterY) * 2.0 * surfaceTop;
// double z0 = (cur.down.z() - screenCenterZ) * 2.0 * surfaceFar;
//
// Compute xc and yc in world coords using the theorem on intersecting lines
//
double xc = (cur.curr.x() - screenCenterX) * 2.0 * surfaceRight;
double yc = (cur.curr.y() - screenCenterY) * 2.0 * surfaceTop;
// double zc = (cur.curr.z() - screenCenterZ) * 2.0 * surfaceFar;
//
// Compute translation
//
osg::Vec3 direction = Vec3(xc-x0, zc-z0, yc-y0);
//
// Get the viewer position
//
osg::Vec3 viewerPosition = opencover::cover->getViewerMat().getTrans();
//
// Compute new transform matrix
//
osg::Matrix transform =
this->rootTransform
* osg::Matrix::translate(-viewerPosition)
* osg::Matrix::translate(direction)
* osg::Matrix::translate(viewerPosition);
//
// Apply the new transformation matrix -- if it's valid
//
if (transform.valid())
{
opencover::VRSceneGraph::instance()->getTransform()->setMatrix(transform);
}
variable "cur.down" is where the cursor of mouse started clicking / touch on
the screen first appeared / kinect started captureing the skeleton
variable "cur.curr" is the current position of the corresponding cursor
(mouse/touch/kinect).
I hope someone can help!
Thank you!
Cheers,
Charma
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=52065#52065
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org