【MSCE C++】在相机模式下,利用代码实现窗口之间的联合显示时,窗口发生抖动

void MyIViewMonitor::_OnViewChanged(ViewportP viewport)
{	
	if (m_isSelfFire)
	{
		return;
	}
	if (MyIViewMonitor::m_toolType == 3){
	    if (viewport->GetViewNumber() == 2) {	
			Dpoint3d       position;
			Dpoint3d      target;
			Dpoint3d       upVector;
			double        angle;
			DRange2d       screenWindow;
			double          frontClipDist;
			double          backClipDist;
			mdlView_getCameraParameters(&position, &target, &upVector, &angle, &screenWindow, &frontClipDist, &backClipDist, 2);		 //得到视图3相机参数
			if (!mdlView_getDisplayControl(VIEWCONTROL_CAMERA, 0))	mdlView_setDisplayControl(VIEWCONTROL_CAMERA, 0, true);				 //打开视图1相机
			mdlView_setCameraParameters(&position, &target, &upVector, &angle, NULL, &screenWindow, &frontClipDist, &backClipDist, 0);	 //设置视图1相机
			m_isSelfFire = true;
			mdlView_updateSingle(0);//更新视图1
			m_isSelfFire = false;
		}
		return;
	}
}
这段代码是实现视图3和视图1之间的联动显示,需要先手动打开视图3的相机模式,联动显示时,平移和缩放都正常,旋转时视图1发生抖动,非常影响联合显示效果,请问怎么优化代码来解决这个问题。

Parents
  • 抖动是因为动态旋转过程中,每一帧显示以后后台又会把视图的参数恢复到动态开始时的状态,您可以利用如下代码示例这样控制一下即可:

    	bool m_isSelfFire;
    	DPoint3d m_position;
    	DPoint3d m_target;
    	DPoint3d m_upVector;
    	double m_angle = DBL_MIN;
    	DRange2d m_screenWindow;
    	double m_frontClipDist;
    	double m_backClipDist;
    	virtual void _OnViewChanged(ViewportP viewport) override
    	{
    		if (m_isSelfFire)
    			return;
    		if (viewport->GetViewNumber() == 2)
    		{
    			static bool isRestore = false;
    			if (isRestore)
    			{
    				isRestore = false;
    				return;
    			}
    			isRestore = true;
    			DPoint3d position,target,upVector;
    			double angle, frontClipDist, backClipDist;
    			DRange2d screenWindow;
    			mdlView_getCameraParameters(&position, &target, &upVector, &angle, &screenWindow, &frontClipDist, &backClipDist, 2);
    			if (DBL_MIN != m_angle)
    			{
    				if (m_position == position && m_target == target && m_upVector == upVector && m_angle == angle &&
    					m_screenWindow.low == screenWindow.low && m_screenWindow.high == screenWindow.high && m_frontClipDist == frontClipDist && m_backClipDist == backClipDist)
    				{
    					isRestore = false;
    					return;
    				}
    			}
    			m_position = position;m_target = target;m_upVector = upVector;m_angle = angle;m_screenWindow = screenWindow;m_frontClipDist = frontClipDist;m_backClipDist = backClipDist;
    			if(!mdlView_getDisplayControl(VIEWCONTROL_CAMERA,0))
    				mdlView_setDisplayControl(VIEWCONTROL_CAMERA, 0, true);
    			mdlView_setCameraParameters(&position, &target, &upVector, &angle, NULL, &screenWindow, &frontClipDist, &backClipDist, 0);
    			m_isSelfFire = true;
    			mdlView_updateSingle(0);
    			m_isSelfFire = false;
    		}
    		return;
    	}

    MS学习资源:

    MicroStation Wednesday视频分享 

    深入探讨MicroStation DGN基本概念系列

    一步步学习MicroStation CE Addin开发

    一步步学习MicroStation CE MDL开发

    Answer Verified By: dong zhen 

Reply
  • 抖动是因为动态旋转过程中,每一帧显示以后后台又会把视图的参数恢复到动态开始时的状态,您可以利用如下代码示例这样控制一下即可:

    	bool m_isSelfFire;
    	DPoint3d m_position;
    	DPoint3d m_target;
    	DPoint3d m_upVector;
    	double m_angle = DBL_MIN;
    	DRange2d m_screenWindow;
    	double m_frontClipDist;
    	double m_backClipDist;
    	virtual void _OnViewChanged(ViewportP viewport) override
    	{
    		if (m_isSelfFire)
    			return;
    		if (viewport->GetViewNumber() == 2)
    		{
    			static bool isRestore = false;
    			if (isRestore)
    			{
    				isRestore = false;
    				return;
    			}
    			isRestore = true;
    			DPoint3d position,target,upVector;
    			double angle, frontClipDist, backClipDist;
    			DRange2d screenWindow;
    			mdlView_getCameraParameters(&position, &target, &upVector, &angle, &screenWindow, &frontClipDist, &backClipDist, 2);
    			if (DBL_MIN != m_angle)
    			{
    				if (m_position == position && m_target == target && m_upVector == upVector && m_angle == angle &&
    					m_screenWindow.low == screenWindow.low && m_screenWindow.high == screenWindow.high && m_frontClipDist == frontClipDist && m_backClipDist == backClipDist)
    				{
    					isRestore = false;
    					return;
    				}
    			}
    			m_position = position;m_target = target;m_upVector = upVector;m_angle = angle;m_screenWindow = screenWindow;m_frontClipDist = frontClipDist;m_backClipDist = backClipDist;
    			if(!mdlView_getDisplayControl(VIEWCONTROL_CAMERA,0))
    				mdlView_setDisplayControl(VIEWCONTROL_CAMERA, 0, true);
    			mdlView_setCameraParameters(&position, &target, &upVector, &angle, NULL, &screenWindow, &frontClipDist, &backClipDist, 0);
    			m_isSelfFire = true;
    			mdlView_updateSingle(0);
    			m_isSelfFire = false;
    		}
    		return;
    	}

    MS学习资源:

    MicroStation Wednesday视频分享 

    深入探讨MicroStation DGN基本概念系列

    一步步学习MicroStation CE Addin开发

    一步步学习MicroStation CE MDL开发

    Answer Verified By: dong zhen 

Children
No Data