在OpenGL中将屏幕位置投影到平面上

时间:2012-11-11 14:41:27

标签: opengl transformation raytracing plane

我正在努力完成一项简单的任务:给定屏幕上的鼠标位置,计算新位置,该位置是通过计算穿过所选对象的相机平面与鼠标点击光线的交点来确定的。

所涉及的数学并不是那么棘手,但我似乎无法找到错误。

        QVector3D cameraPosition = Rotation.rotatedVector(translation);
        QVector3D cameraDirection = Dir;
        QVector3D objectPosition = objectTranslation;
        QVector3D up = Rotation.rotatedVector(QVector3D(0,1,0));
        QVector3D Right = QVector3D::crossProduct(Dir, up);

如您所见,我正在使用Qt来表示我的数据。首先,我通过Camera Rotation旋转我的翻译Vector以获得cameraPosition。否则我不会在Worldcoordinates中获得cameraPosition。之后我计算向上和向右矢量。为了计算光线平面交点,我将其用作参考:http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm#Line-Plane交点

后记我对屏幕坐标进行了规范化

        float screen_x = 2*(float(pos.x())/width()-0.5);
        float screen_y = 2*((float(height()-1-pos.y())/height())-0.5);
        screen_x*= (1.0f/height())/(1.0f/width());

最后,实际计算:

        QVector3D P0 = cameraPosition;
        QVector3D n = cameraDirection;
        QVector3D V0 = objectPosition;
        QVector3D u = (screen_x*Right+screen_y*up)*0.5+cameraDirection;
        float s = QVector3D::dotProduct(n, V0-P0) / QVector3D::dotProduct(n, u);
        objectTranslation = P0+s*u;

我想问题在于计算你或者超出我的东西。我通过评估ModelView Transformation矩阵并取出第三行来获得相机的Direction:

GLdouble modelview[16];
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
QMatrix4x4 mv = QMatrix4x4(modelview);
Dir = QVector3D(mv.row(2).x(), mv.row(2).y(), mv.row(2).z()).normalized();

0 个答案:

没有答案