2011-06-02 79 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到 「重新中心」 的模式

儘管如此,最後一點似乎是可疑的。