首页 > 编程知识 正文

自身坐标系和世界坐标系,物体坐标系到世界坐标系

时间:2023-05-05 17:37:12 阅读:172874 作者:1686

原文QOpenglWidget屏幕坐标系移动到vtk世界坐标系

在将QOpenglWidget屏幕坐标系移动到vtk世界坐标系的前两天,我看到有人问vtk的坐标系和qt的坐标系不同。 以前通过qt实现vtk的测量距离和测量角度,其中使用QOpenglWidget屏幕坐标系移动到了vtk世界坐标系。 在这里记录一下吧:

自己不是计算机专业的本科,对计算机视觉还不了解,只记录了自己在工作中利用vtk实现可视化的实际经验。

我自己大概接触了几个这样的坐标系:

qt屏幕坐标系(paintEvent描绘用的)二维、原点为左上的vtk的display坐标系) vtk屏幕描绘的坐标系)二维、原点为左下的vtk的normalized display坐标系) display的标准化:有多个render 屏幕指示控件vtkOrientationMarkerWidget的位置(vtk摄像机的view坐标系(相对于摄像机位置,范围- 1至1 ) vtk的word坐标系) x、y和z的实际位置view坐标系) vtk的view 视图坐标(计算机图形渲染坐标系)显示坐标)显示设备上的实际屏幕坐标)角度测量这三个直接测量的角度就可以了。 不需要移动到vtk的坐标系下,在qt的屏幕点进行计算

doublegeneralalgorithm :3360 includedangleline (qpointfpos 1,QPointF pos2,QPointF pos3,QPointF pos4) doubleK1=) pos doue returnAtan(ABS((K2-K1 )/(1 k1 * k2 ) ) ) * 57.29578; }距离测量需要从QOpenglWidget屏幕坐标系转移到vtk世界坐标系。

qt的屏幕坐标和vtk的屏幕坐标的原点位置是左上一个和左下一个,所以y轴需要处理1023 - pos1.y (),1024是vtk窗口的大小。

vtk网屏坐标旋转vtk空间坐标,如果确定在焦点面上,就直接使用viewportWorldToDisplay即可。

如果有偏差,需要判断是平行投影还是透视投影。

其实可以看出很多vtk拥有的rep和handle分为2d和3d。 区别在于平行投影还是透视投影。

打开源代码,可以看到以下内容

2d )平行投影(现成的vtkCoordinate,3d )平行或透视)均由ActiveCamera自行判断。 例如,下面注释的一部分可以是doublegeneralgorithm 33603360 computeworldposition double display pos [ ],doubleworldpos[]{doubleFP[4]; ren-GetActiveCamera ()-getfocalpoint ) ) FP; fp[3]=1.0; 返回设置点(FP; ren-WorldToDisplay (; ren-getdisplaypoint(FP; 双精度tmp [4]; tmp[0]=displayPos[0]; tmp[1]=displayPos[1]; tmp[2]=fp[2]; 返回设置播放(tmp; ren-DisplayToWorld (; ren-getworldpoint(tmp; //使焦点从焦平面向观察方向“偏移”。 (不需要在我这里测量距离(//double Offset=0.0; //double focalPlaneNormal[3]; //ren-getactivecamera (-getdirectionofprojection (focalplanenormal ) ); //if (ren-getactivecamera (-getparallelprojection ) )/tmp(0)=) focalplanenormal(0) *offset; //tmp [1]=(focalplanenormal [1] * offset ); //tmp [2]=(focalplanenormal [2] * offset ); //} else { //double camPos[3],viewDirection[3]; //ren-getactivecamera (-get position ) ) campos; //view direction [0]=tmp [0]-Campos [0]; //view direction [1]=tmp [1]-Campos [1]; //view direction [2]=tmp [2]-Campos [2]; //VTK math :3360 normalize (view direction ); //doublecostheta=VTK math : dot (viewdirection,focalplanenormal(//) vtkmath:norm ) ) view direction=0.0 ) ) /透视投影中0.0不可能(/(//tmp[0]=) view direction [0] * offset/cos theta ); //tmp [1]=(view direction [1] * offset/cos theta ); //tmp [2]=(view direction [2] * offset/cos theta ); //(worldpos[0]=tmp[0] ); worldPos[1]=tmp[1]; worldPos[2]=tmp[2]; 返回1; }双精度:3360 get distance (qpointfpos 1,QPointF pos2,vtkRenderer *renderer )双精度P1 (3) p2 ) 3双精度computeworldposition(renderer,display1,p1 ); computeworldposition(renderer,display2,p2 ); 双精度=sqrt (VTK math :3360精度2测试点(P1,p2 ); 返回距离; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。