c++ - 如何相对于观察方向在地形中移动
问题描述
m_mouseMovement
我想相对于当前观察方向在地形(delta x,delta y in )中左右移动,向前/向后移动。以下代码适用于缩放(鼠标滚轮)。但是只有当观察方向正好沿着 x 轴时,运动才会起作用:
Vector3D m_position;
Vector2D m_mouseMovement; // delta x,y amount the mouse was moved on the screen
int m_mouseWheelSteps;
QVector3D direction(...);
QVector3D right(...);
QVector3D up = QVector3D::crossProduct(right, direction);
m_position += m_mouseWheelSteps * direction; // zoom in and out; ok
// m_position += Vector3D(m_mouseMovement.x*right.x, 0, m_mouseMovement.z*right.z); // does not work properly; it always moves along the x/z axis
QMatrix4x4 modelMatrix;
//modelMatrix.scale, translate, etc. the terrain
QMatrix4x4 viewMatrix;
viewMatrix.lookAt(m_position, m_position+direction, up);
QMatrix4x4 mvMatrix = viewMatrix * modelMatrix;
QMatrix4x4 projectionMatrix;
projectionMatrix.perspective(...);
QMatrix4x4 mvpMatrix = projectionMatrix*mvMatrix;
我无法弄清楚如何让它工作,以便运动独立于观察方向?
解决方案
简单的解决方案:
m_position += m_mouseMovement.x*Vector3D(right.x, 0, right.z);
//m_position += m_mouseMovement.y*Vector3D(up.x, 0, up.z);
m_position += m_mouseMovement.z*Vector3D(direction.x, 0, direction.z);
推荐阅读
- netsuite - SuiteScript 源文件未使用 SDF 更新(缓存)
- android - Unity Project 与 android studio 项目的集成
- java - 单击以启用Java Android开发中的按钮时,如何处理两个复选框?
- amazon-web-services - 除非定义了主机标头,否则具有自定义域名的 API 网关返回 403
- windows - 应用程序使用不同的 WM_DROPFILES 机制进行拖放
- c# - float 和 double 数据类型的区别
- c++ - 如何将 std::string_view 转换为 std::string?
- next.js - 为 Next 禁用静态文件服务
- r - 如何从 URL 中抓取返回的参数值?(理想情况下在 R 中)
- reactjs - React 给出错误 Uncaught TypeError: Super expression must be null or a function, not undefined ExcelJS