【MSCE U13 C++】点云漫游问题

老师,您好

       请问一下,我是用直接使用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;
    }