OpenCASCADE中通过鼠标点击获取曲面上一点坐标的方法

转载请注明出处

[email protected]

  通过鼠标点击获取曲面上一点坐标还算是一种比较常用的功能,今天又被人问到了,就再总结分享一下。

 

  大体思路如下,首先,根据鼠标在屏幕上的点击,获取该点的屏幕坐标系坐标,生成一条垂直于屏幕的直线,然后将该直线通过坐标变换转换到模型坐标系中,最后求解直线与曲面的交点,即为所求点。

 

  详细过程及代码如下:

1. 响应鼠标点击操作,获取屏幕坐标系坐标(screenX, screenY)

  该步因使用框架而异。

2. 利用OpenGL函数,将屏幕坐标转换至窗口坐标,并生成垂直于屏幕的直线

  具体代码见以下代码中的13~16行。由于屏幕坐标系中坐标原点在屏幕的左上角,而窗口坐标系中,坐标原点在左下角,所以需要进行转换。

  所谓的直线,其实就是两个点,winP1(winX, winY, winZ1)和winP2(winX, winY, winZ2),Z1、Z2的取值可以随意,但是不要太过分。

3. 利用gluUnProject函数,将窗口坐标系中的直线转换至模型坐标系

  下面代码的5~11行获取必要的矩阵,19~20进行坐标的转换。

复制代码
 1     GLint viewport[4];
 2     GLdouble modleview[16];
 3     GLdouble projection[16];
 4 
 5     glPushMatrix();
 6     glLoadIdentity();
 7     glLoadMatrixd(aView->Camera()->OrientationMatrix());
 8     glGetIntegerv(GL_VIEWPORT, viewport);
 9     glGetDoublev(GL_MODELVIEW_MATRIX, modleview);
10     glGetDoublev(GL_PROJECTION_MATRIX, projection);
11     glPopMatrix();
12 
13     GLdouble winX = screenX;
14     GLdouble winY = viewport[3] - screenY;
15     GLdouble winZ1 = 0;
16     GLdouble winZ2 = 10;
17     double x1, y1, z1, x2, y2, z2;
18 
19     gluUnProject(winX, winY, winZ1, modleview, projection, viewport, &x1, &y1, &z1);
20     gluUnProject(winX, winY, winZ2, modleview, projection, viewport, &x2, &y2, &z2);
复制代码

  gluUnProject函数的函数声明如下:

复制代码
GLint gluUnProject(
  GLdouble winX,
  GLdouble winY,
  GLdouble winZ,           // Specify the window coordinates to be mapped
  const GLdouble * model,  // Specifies the modelview matrix
  const GLdouble * proj,   // Specifies the projection matrix
  const GLint * view,      // Specifies the viewport
  GLdouble* objX,
  GLdouble* objY,
  GLdouble* objZ           // Returns the computed object coordinates
);
复制代码

  可以看到,在获取了必要的矩阵之后,即可通过该函数将窗口坐标转换至模型坐标。

4. 根据上面求得的两个点,生成直线,并与曲面求交

   先生成Geom_Line,再用GeomAPI_IntCS函数直接求交即可。

1 Handle(Geom_Line) aLine = new Geom_Line(gp_Pnt(x1, y1, z1), gp_Dir(x2 - x1, y2 - y1, z2 - z1));
2 GeomAPI_IntCS intCS(aLine, aSurface);
3 gp_Pnt aPnt = intCS.Point(1);

  aPnt即为所求点。

转:https://www.cnblogs.com/ltr199010/p/5682404.html

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/80740486
今日推荐