我目前正在努力完成一个简单的任务:给定屏幕上的鼠标位置,计算新位置,该位置是通过计算穿过选定对象的相机平面与鼠标点击光线的交点来确定的。
所涉及的数学并不那么棘手,但我似乎仍然找不到错误。
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旋转我的平移向量以获得cameraPosition。否则我将无法在 Worldcoordinates 中获得 cameraPosition。之后我计算上下向量。为了计算射线平面交点,我将其用作参考:http ://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm#Line-Plane Intersection
后记我将屏幕坐标正常化
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 变换矩阵并取出第三行来获得相机的方向:
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();