【问题标题】:Implementing a "grab" camera panning tool in a 3D scene在 3D 场景中实现“抓取”相机平移工具
【发布时间】:2011-06-03 19:35:36
【问题描述】:

在我的场景中,我想要“抓取”地形,然后在移动光标时让相机平移(高度、视图矢量、视野等都保持不变)。

所以最初的“抓取”点将是世界空间中的工作点,我希望在拖动时该点保持在光标下方。

我当前的解决方案是获取先前和当前的屏幕点,将它们取消投影,从另一个中减去一个,然后使用该向量平移我的相机。这接近我想要的,但光标不会完全停留在初始场景位置上,如果您从地形边缘附近开始,这可能会出现问题。

// Calculate scene points
MthPoint3D current_scene_point =
   camera->screenToScene(current_point.x, current_point.y);
MthPoint3D previous_scene_point =
   camera->screenToScene(previous_point.x, previous_point.y);

// Make sure the cursor didn't go off the terrain
if (current_scene_point.x != MAX_FLOAT &&
    previous_scene_point.x != MAX_FLOAT)
{
   // Move the camera to match the distance
   // covered by the cursor in the scene
   camera->translate(
      MthVector3D(
         previous_scene_point.x - current_scene_point.x,
         previous_scene_point.y - current_scene_point.y,
         0.0));
}

感谢任何想法。

【问题讨论】:

  • 您是在尝试“抓取”地形上的实际 3D 点,还是可以接受抓取 Z=0 的 2D 点?
  • 这个想法是光标将保持在地形上的初始 3D 点上,所以这就是我试图“抓取”的内容。例如,如果您正在查看远处有山脉的场景,并且您“抓住”了一座山峰,当您向下拖动(或拉动)光标时,当光标保持打开时,这座山将向您靠近整个时间的高峰。
  • 现在想出一个体面的解决方案为时已晚,但您要做的是解决系统问题:{ peak € ray from camera to mouse ; mountain.position.y = 0 },对吗?

标签: opengl 3d


【解决方案1】:

再睡一会:

  • 获取相交点在世界空间中的初始位置在模型空间中(相对于模型的原点)

即使用 screenToScene()

  • 创建一条从相机穿过鼠标位置的光线:{ray.start, ray.dir}

ray.start 是 camera.pos,ray.dir 是 (screenToScene() - camera.pos)

  • 求解 NewPos = ray.start + x * ray.dir 知道 NewPos.y = initialpos_worldspace.y;

-> ray.start.y + x*ray.dir.y = initialpos_worldspace.y

-> x = (initialpos_worldspace.y - ray.start.y)/rad.dir.y(小心除零异常)

-> 在 NewPos_worldspace 中重新注入 x = ray.start + x * ray.dir

  • 从中减去 initialpos_modelspace 以“重新居中”模型

不过,最后一点似乎很可疑。

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 2017-08-25
    • 2012-08-19
    • 1970-01-01
    • 2014-07-31
    • 2015-02-03
    • 1970-01-01
    • 2019-09-13
    相关资源
    最近更新 更多