2011-06-02 50 views
2

在我的场景中,我想要“抓取”地形,然后让相机平移(使用其高度,视图向量,视野等等)与我移动光标相同)。在3D场景中实现“抓取”相机平移工具

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

我目前的解决方案是采取以前和当前的屏幕点,不投影他们,从另一个减去一个,并翻译我的相机与该向量。这与我想要的很接近,但光标不能完全保留在最初的场景位置上,如果您在地形的边缘附近开始,这可能会有问题。

// 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)); 
} 

任何想法表示赞赏。

+0

您是否试图在地形上“抓取”实际的3D点,或者您能否抓住Z = 0处的2D点? – genpfault 2011-06-02 21:17:25

+0

这个想法是,光标将保持在地形上的初始3D点上,所以这就是我试图“抓住”。例如,如果您正在查看远处有山脉的场景,并且您在“抓取”了山峰中的一个山峰时,在向下拖动(或拉动)光标时,当光标保持点亮时,山峰会向您走来整个时间的高峰期。 – 2011-06-02 21:39:44

+0

现在想想一个体面的解决方案为时已晚,但你要做的是解决这个系统问题:{从相机到鼠标的高峰时间; mountain.position.y = 0},对吧? – Calvin1602 2011-06-02 22:23:29

回答

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 (小心dividebyzeroexception的)

- >在NewPos_worldspace = ray.start + X * ray.dir

  • 。减去从initialpos_modelspace重新注入x到 “重新中心” 的模式

尽管如此,最后一点似乎是可疑的。