OpenCASCADE中通過鼠標點擊獲取曲面上一點坐標的方法


轉載請注明出處

ltr199010@163.com

  通過鼠標點擊獲取曲面上一點坐標還算是一種比較常用的功能,今天又被人問到了,就再總結分享一下。

 

  大體思路如下,首先,根據鼠標在屏幕上的點擊,獲取該點的屏幕坐標系坐標,生成一條垂直於屏幕的直線,然后將該直線通過坐標變換轉換到模型坐標系中,最后求解直線與曲面的交點,即為所求點。

 

  詳細過程及代碼如下:

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即為所求點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM