Thanks Stephan, you answer was very helpful. After some headbanging I have it
working seemingly flawless. Here is the code for reference:
Code:
osg::Vec3d rayIntersectWithXYPlane(float x, float y, osg::Node* widget) {
// flip mouse y axis
y = ofGetHeight() - y; //important
osg::Vec3d isect = osg::Vec3d(0,0,0);
// compute model to window transform
// Model*View*Projection*WindowMatrix
osg::Matrixd matrix;
matrix.postMult(widget->getWorldMatrices()[0]);
matrix.postMult(camera->getViewMatrix());
matrix.postMult(camera->getProjectionMatrix());
matrix.postMult(camera->getViewport()->computeWindowMatrix());
osg::Matrixd inverse;
inverse.invert(matrix);
// Transform ray from window to model coordinates
osg::Vec3d startRay = osg::Vec3d(x,y,0) * inverse;
osg::Vec3d endRay = osg::Vec3d(x,y,1) * inverse;
// Intersect ray with XY-plane
// (0,0,1,0) is plane in hess normal form
getPlaneLineIntersection(osg::Vec4d(0,0,1,0), startRay, endRay, isect);
return isect;
}
bool getPlaneLineIntersection(const osg::Vec4d& plane,
const osg::Vec3d& lineStart, const osg::Vec3d&
lineEnd,
osg::Vec3d& isect)
{
// intersects an infinite line with an infinite plane
// in hesse normal form Ax + By + Cz + D = 0
// A,B,C is the normal vector of the plane, D the distance to the origin
const double deltaX = lineEnd.x() - lineStart.x();
const double deltaY = lineEnd.y() - lineStart.y();
const double deltaZ = lineEnd.z() - lineStart.z();
const double denominator = (plane[0]*deltaX + plane[1]*deltaY +
plane[2]*deltaZ);
if (! denominator) return false;
const double C = (plane[0]*lineStart.x() + plane[1]*lineStart.y() +
plane[2]*lineStart.z() + plane[3]) / denominator;
isect.x() = lineStart.x() - deltaX * C;
isect.y() = lineStart.y() - deltaY * C;
isect.z() = lineStart.z() - deltaZ * C;
return true;
}
Instead of osg::computeLocalToWorld(...) I use getWorldMatrices(...) which I
believe does pretty much the same. I also use this
getPlaneLineIntersection(...) for doing the actual intersection.
I have one more quick question. What is generally meant in osg with world
coordinates? For example in computeLocalToWorldMatrix(). Is it simply the
coordinates in the parent or all the way up to the root node? I would assume
it's all the way up to the root but I read some code that makes me think
otherwise.
Thanks again,
/stefanix
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=13960#13960
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org