老师,您好
请问一下,我是用直接使用MS中已有的功能进行漫游的,没有自己编程,如下图菜单栏中的四个按钮。现在我要实现的是在窗口View1漫游的时候,另外的两个窗口也同时漫游。如下图所示,view1在播放点云数据,同时,view2实时把相机的位置显示在窗口的正中心,view3窗口实时显示当前点云位置对应的图像。可是我不知道该调用哪一个函数进行计算。或者,MS中有没有类似于C++中定时器的接口,当我开始漫游的时候,我点击一个按钮,就开始一个定时器,每隔1秒钟就计算一次相机的位置和对应的是哪一张图像,然后把图像显示出来。
我记得您之前问过IViewMonitor的用法,这个接口您试过了么?应该是可以的。
Answer Verified By: nian chen
我试过了,可是程序一运行MS就一直未响应,不知道是怎么回事?
IndexedViewSet& indexdViewSet = IViewManager::GetManager().GetActiveViewSet(); for (auto cur = indexdViewSet.begin(); cur != indexdViewSet.end(); cur++) { if (!(*cur)->IsActive()) { continue; } int curViewNum = (*cur)->GetViewNumber(); if (curViewNum == IViewManager::GetManager().GetCurrentViewNumber()) { continue; } ViewInfoP viewInfo = (*cur)->GetViewInfoP(); if (NULL != viewInfo) { if (1 == curViewNum) { viewInfo->SetGeometry(&viewport->GetViewInfoP()->GetOrigin(), &viewport->GetViewInfoP()->GetDelta(), &viewport->GetViewInfoP()->GetRotation()); } if (2 == curViewNum) { IndexedViewportP animation_camera = IViewManager::GetManager().GetActiveViewSet().GetSelectedViewport(); DPoint3d CameraPosition = animation_camera->GetCameraRoot()->position; DPoint3d selectPoint; //将单位为毫米的屏幕单位换算成单位为m的图像单位 selectPoint.x = CameraPosition.x / 10000; selectPoint.y = CameraPosition.y / 10000; selectPoint.z = CameraPosition.z / 10000; double min_dis = selectPoint.Distance(pts_image[0]); for (int i = 0; i < pts_image.size(); ++i) //计算每一个图像和相机的距离 { double distance = selectPoint.Distance(pts_image[i]); //double distance = sqrt((basePt.x - pts_image[i].x)*(basePt.x - pts_image[i].x) + (basePt.y - pts_image[i].y)*(basePt.y - pts_image[i].y) + (basePt.z - pts_image[i].z)*(basePt.z - pts_image[i].z)); if (distance < min_dis) { min_dis = distance; g_index_image = i; } } show_imageIndex = name[g_index_image]; rasterAttach_image(show_imageIndex); //显示二维的全景图像 } m_isSelfFire = true; mdlView_updateSingle(curViewNum); m_isSelfFire = false; } }
会不会是这个接口一直在计算,导致计算资源耗尽了。所以我才想到每隔2s才计算一次。
上边的代码是您_OnViewChanged的完整代码么?
嗯,是的。最上面少了三行
if (m_isSelfFire) { return; }