私は現在、単純なタスクに苦労しています: 画面上のマウスの位置を指定して、選択したオブジェクトを通過するカメラ平面とマウス クリックの光線の交点を計算することによって決定される新しい位置を計算します。
関連する数学はそれほどトリッキーではありませんが、それでもエラーを見つけることができないようです。
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 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;
問題は u または私を超えた何かの計算にあると思います。ModelView Transformation マトリックスを評価し、3 行目を取り出すことで、カメラの方向を取得します。
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();