我知道这个问题已被问过多次,但我仍然无法弄清楚我的代码中有什么问题。我有一个
QEntity
,上面附有 QObjectPicker
。我想要实现的是用户可以在与近平面和远平面平行的平面中移动对象。但目前我只是尝试投影回鼠标坐标以获得世界交集。
A
QPickEvent
已经提供了世界交集,但我需要自己计算它,以便它与用户按下鼠标按钮时的第一个世界交集具有相同的深度。这样我就可以计算差异向量并通过该差异移动对象。
为此,我实现了以下过程(
projectionMatrix
是在相机上手动设置的投影矩阵并存储在变量中,这就是我直接在此处设置它的原因):
float distance = pickEvent->distance();
float posY = height() - pickEvent->position().y() - 1.0f;
QVector3D screenCoordinates = QVector3D(pickEvent->position().x(), posY, distance);
QMatrix4x4 modelViewMatrix = camera->viewMatrix() * object->transform()->matrix();
QVector3D mouseIn3D = screenCoordinates.unproject(modelViewMatrix,
projectionMatrix,
QRect(0, 0, width(), height()));
object
是我要移动的物体。我获得的值的一个示例是:
600.787
(-72.0421, 27.4382, 697.146)
mouseIn3D
的投影为(168.434, 708.616, 29.4223)
显然这是不正确的,因为世界交集和投影鼠标坐标有很大不同。我还尝试使用
0.f
和 1.f
来代替 600.787
来表示距离,因为有人说这是近平面和远平面的深度值,但这也不起作用,并且给出了错误的坐标。
另一方面,当我将
QPickEvent
提供的 3D 局部交点投影到屏幕上时,2D 像素坐标是正确的:
QVector3D pointOnModel = pickEvent->localIntersection();
QVector3D projected = pointOnModel.project(modelViewMatrix,
projectionMatrix,
QRect(0, 0, width(), height()));
qDebug() << "x y" << pickEvent->position().x() << height() - pickEvent->position().y();
qDebug() << "projected" << projected;
这产生了
x y 949 1118
projected QVector3D(949, 1118, 0.90164)
有人知道我做错了什么吗?
不知怎的,我没有发布这个问题的答案(在@vre的帮助下):
错误在于乘以模型矩阵并使用距离 到相机而不是深度。
(我在主帖下的评论)