選択モード
5604 ワード
Picking Tutorial Pickingチュートリアル
The Selection Mode選択モード
So far the OpenGL naming scheme has been presented. This section will show you how to enter the selection mode for picking purposes. The first step is to tell OpenGL where to store the hit records. This is accomplished with the following function:
これでOpenGLのネーミングスキームが示す.この部分では、選択の目的のためにどのように選択モードに入るかを示す.第1ステップはOpenGLにヒット記録を格納位置を教えることである.これは次の関数で行います.
void glSelectBuffer(GLsizei size, GLuint *buffer);
Parameters:
buffer : An array of unsigned integers. This array is where OpenGL will store the
hit records.
size : The size of the array.
You are required to call this function before entering the selection mode. Next you enter the selection mode with a call to
選択モードに入る前にこの関数を呼び出す必要がある.次に、次の関数を呼び出して選択モードに入ります.
void glRenderMode(GLenum mode);
Parameters:
mode - use GL_SELECT to enter the rendering mode and GL_RENDER to return to normal rendering. This later value is the default.
Now comes the tricky part. The application must redefine the viewing volume so that it renders only a small area around the place where the mouse was clicked. In order to do that it is necessary to set the matrix mode to GL_PROJECTION. Afterwards, the application should push the current matrix to save the normal rendering mode settings. Next initialise the matrix. The following snippet of code shows how to do this:
今は気をつけなければならないところに着いた.アプリケーションは、マウスのクリック領域の小さな領域のみを描画するように、ビューポート領域を再定義する必要があります.そのためにGL_を設定する必要がありますPROJECTIONの行列アプリケーションは、現在のマトリクスをスタックに押し込む、通常の描画モードの設定を保存する必要があります.次にマトリクスを初期化する.次のコードは、どのようにするかを示します.
OK so now you have a clean projection matrix. All that is required now is to define the viewing volume so that rendering is done only in a small area around the cursor. This can be accomplished using the following function:
これできれいな投影マトリクスができますビューポート領域を定義する必要があります.これにより、描画はカーソルの周囲の小さな領域にのみ適用されます.次の関数を使用して実装します.
void gluPickMatrix(GLdouble x, GLdouble y, GLdouble witdth, GLdouble height, GLint viewport[4]);
Parameters:
x,y : These two values represent the cursor location. They define the centre of the picking area. This value is specified in window coordinates. However note that window coordinates in OpenGL have the origin at the bottom left corner of the viewport, whereas for the Operating system is the upper left corner.
width, height : The size of the picking region, too small and you may be hard pressed to pick small objects, too large and you may end up with too many hits.
viewport : The current viewport
Before you call the above function you have to get the current viewport. This can be done querying OpenGL for the state variable GL_VIEWPORT (use the function glGetIntegerv). Then you call gluPickMatrix, and finally set your projection (perspective or orthogonal) just as you did for the normal rendering mode. Finally get back to the modelview matrix mode, and initialise the Name Stack to start rendering. The following code shows the sequence of function calls to do just that using a perspective projection.
次の関数を呼び出す前に、OpenGLのステータス変数GL_をクエリーすることで、現在のビューポートを取得する必要があります.VIEWPORT(glGetIntegerv関数を用いる)を得る.次にgluPickMatrixを呼び出し、通常の描画モードのように投影マトリクス(テーパ投影または直交投影)を設定します.最終的にモデルビューマトリクスモードに戻り、名前スタックを初期化し、描画を開始する.次の一連の関数はこれらのことをしています.
Note the second parameter of gluPickMatrix. As mentioned before, OpenGL has a different origin for its window coordinates than the operation system. The second parameter provides for the conversion between the two systems, i.e. it transforms the origin from the upper left corner, as provided by GLUT for example, into the bottom left corner.
注意gluPicMatrixの2番目のパラメータ.前述のようにOpenGLにはオペレーティングシステムとは異なる座標原点がある.第2のパラメータは、GLUTにより供給する座標原点を右上から左下に変換するなど、両システム間の変換を行う.
The picking region in this case is a 5x5 window. You may find that it is not appropriate for your application. Do some tests to find an appropriate value if you're finding it hard to pick the right objects.
この例では、選択領域は5*5のウィンドウである.アプリケーションに合わないことに気づくかもしれません正しいオブジェクトを選択するのが難しいことに気づいたら、適切な値を見つけるためにテストをたくさんします.
The following function does all operations required to enter the selection mode and start picking, assuming that cursorX and cursorY are the operating system window coordinates for the location of the mouse click.
以下の関数は、選択モードに入るから選択を開始するまでのすべての操作を実現し、cursorX cursorYがマウスクリック時の位置がオペレーティングシステム内の座標であると仮定する.
You may copy and paste this function to your application, with the appropriate modifications regarding your projection. If you do that then just call this function when entering the rendering mode and before rendering any graphic primitives.
この関数をアプリケーションにコピーして貼り付け、エンジニアリングに基づいて適切な変更を行うことができます.その後、描画モードに入ると、任意のエンティティを描画する前にこの関数が呼び出される.
The Selection Mode選択モード
So far the OpenGL naming scheme has been presented. This section will show you how to enter the selection mode for picking purposes. The first step is to tell OpenGL where to store the hit records. This is accomplished with the following function:
これでOpenGLのネーミングスキームが示す.この部分では、選択の目的のためにどのように選択モードに入るかを示す.第1ステップはOpenGLにヒット記録を格納位置を教えることである.これは次の関数で行います.
void glSelectBuffer(GLsizei size, GLuint *buffer);
Parameters:
buffer : An array of unsigned integers. This array is where OpenGL will store the
hit records.
size : The size of the array.
You are required to call this function before entering the selection mode. Next you enter the selection mode with a call to
選択モードに入る前にこの関数を呼び出す必要がある.次に、次の関数を呼び出して選択モードに入ります.
void glRenderMode(GLenum mode);
Parameters:
mode - use GL_SELECT to enter the rendering mode and GL_RENDER to return to normal rendering. This later value is the default.
Now comes the tricky part. The application must redefine the viewing volume so that it renders only a small area around the place where the mouse was clicked. In order to do that it is necessary to set the matrix mode to GL_PROJECTION. Afterwards, the application should push the current matrix to save the normal rendering mode settings. Next initialise the matrix. The following snippet of code shows how to do this:
今は気をつけなければならないところに着いた.アプリケーションは、マウスのクリック領域の小さな領域のみを描画するように、ビューポート領域を再定義する必要があります.そのためにGL_を設定する必要がありますPROJECTIONの行列アプリケーションは、現在のマトリクスをスタックに押し込む、通常の描画モードの設定を保存する必要があります.次にマトリクスを初期化する.次のコードは、どのようにするかを示します.
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
OK so now you have a clean projection matrix. All that is required now is to define the viewing volume so that rendering is done only in a small area around the cursor. This can be accomplished using the following function:
これできれいな投影マトリクスができますビューポート領域を定義する必要があります.これにより、描画はカーソルの周囲の小さな領域にのみ適用されます.次の関数を使用して実装します.
void gluPickMatrix(GLdouble x, GLdouble y, GLdouble witdth, GLdouble height, GLint viewport[4]);
Parameters:
x,y : These two values represent the cursor location. They define the centre of the picking area. This value is specified in window coordinates. However note that window coordinates in OpenGL have the origin at the bottom left corner of the viewport, whereas for the Operating system is the upper left corner.
width, height : The size of the picking region, too small and you may be hard pressed to pick small objects, too large and you may end up with too many hits.
viewport : The current viewport
Before you call the above function you have to get the current viewport. This can be done querying OpenGL for the state variable GL_VIEWPORT (use the function glGetIntegerv). Then you call gluPickMatrix, and finally set your projection (perspective or orthogonal) just as you did for the normal rendering mode. Finally get back to the modelview matrix mode, and initialise the Name Stack to start rendering. The following code shows the sequence of function calls to do just that using a perspective projection.
次の関数を呼び出す前に、OpenGLのステータス変数GL_をクエリーすることで、現在のビューポートを取得する必要があります.VIEWPORT(glGetIntegerv関数を用いる)を得る.次にgluPickMatrixを呼び出し、通常の描画モードのように投影マトリクス(テーパ投影または直交投影)を設定します.最終的にモデルビューマトリクスモードに戻り、名前スタックを初期化し、描画を開始する.次の一連の関数はこれらのことをしています.
glGetIntegerv(GL_VIEWPORT,viewport);
gluPickMatrix(cursorX,viewport[3]-cursorY,
5,5,viewport);
gluPerspective(45,ratio,0.1,1000);
glMatrixMode(GL_MODELVIEW);
glInitNames();
Note the second parameter of gluPickMatrix. As mentioned before, OpenGL has a different origin for its window coordinates than the operation system. The second parameter provides for the conversion between the two systems, i.e. it transforms the origin from the upper left corner, as provided by GLUT for example, into the bottom left corner.
注意gluPicMatrixの2番目のパラメータ.前述のようにOpenGLにはオペレーティングシステムとは異なる座標原点がある.第2のパラメータは、GLUTにより供給する座標原点を右上から左下に変換するなど、両システム間の変換を行う.
The picking region in this case is a 5x5 window. You may find that it is not appropriate for your application. Do some tests to find an appropriate value if you're finding it hard to pick the right objects.
この例では、選択領域は5*5のウィンドウである.アプリケーションに合わないことに気づくかもしれません正しいオブジェクトを選択するのが難しいことに気づいたら、適切な値を見つけるためにテストをたくさんします.
The following function does all operations required to enter the selection mode and start picking, assuming that cursorX and cursorY are the operating system window coordinates for the location of the mouse click.
以下の関数は、選択モードに入るから選択を開始するまでのすべての操作を実現し、cursorX cursorYがマウスクリック時の位置がオペレーティングシステム内の座標であると仮定する.
#define BUFSIZE 512
GLuint selectBuf[BUFSIZE]
...
void startPicking(int cursorX, int cursorY
) {
GLint viewport[4];
glSelectBuffer(BUFSIZE,selectBuf);
glRenderMode(GL_SELECT);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glGetIntegerv(GL_VIEWPORT,viewport);
gluPickMatrix(cursorX,viewport[3]-cursorY,
5,5,viewport);
gluPerspective(45,ratio,0.1,1000);
glMatrixMode(GL_MODELVIEW);
glInitNames();
}
You may copy and paste this function to your application, with the appropriate modifications regarding your projection. If you do that then just call this function when entering the rendering mode and before rendering any graphic primitives.
この関数をアプリケーションにコピーして貼り付け、エンジニアリングに基づいて適切な変更を行うことができます.その後、描画モードに入ると、任意のエンティティを描画する前にこの関数が呼び出される.