選択したカラーエンコーディング
3718 ワード
Picking Tutorial Pickingチュートリアル
Color Codingカラーコーディング
The Red Book describes an interesting approach to picking based on color coding. This is a very simple approach that can be used instead of using the OpenGL API described in the previous sections.
赤宝書は基本的な色符号化でピックアップする面白い方法を説明している.前章で説明したOpenGL APIを使用する方法の代わりに、非常に簡単な方法です.
The color coding scheme does not require any perspective changes and therefore it is simpler in theory. Just define a rendering function where the relevant objects (pickable and occluders) are assigned each a different color. When the user clicks the mouse over the scene, render the scene on the back buffer, read back the selected pixel from the back buffer and check its color. The process is completely transparent to the user because the buffers are not swapped, so the color coding rendering is never seen.
色符号化法はいかなる視角変異体も必要としないので,理論的にも非常に簡単である.ペイント関数は1つだけ定義され、各関連オブジェクト(選択可能および遮蔽可能なプレート)に異なる色を割り当てます.ユーザがシーン上でマウスをクリックすると、シーンをバックバッファに描画し、選択したピクセルの色をバックバッファから読み返してチェックします.この処理プロセスは、バッファが交換されないため、色符号化ペイントは決して見られないため、ユーザに対して完全に透明である.
For instance, consider the following scene with 4 snowmen. What you're seeing is the result of the normal rendering function.
たとえば、次の4つの雪だるまのシーンを考えると、正常に関数を描いた結果が見えます.
The next figure shows the result produced in the back buffer by the color coding rendering function. As you can see each snowman has a different color.
次の図は、カラーエンコードペイント関数によってポストバッファにペイントされた結果を示しています.ご覧のように、雪だるまごとに色が違います.
The required steps when the mouse is clicked are:
マウスをクリックするには、次の手順に従います.
Bellow the normal rendering function is presented. It contains the code to render both the ground as well as the snowmen (contained in the display list).
次は通常のペイント関数です.大地と雪だるまを描くコード(表示リストに含む)が含まれています.
void draw() {
// Draw ground
glColor3f(0.9f, 0.9f, 0.9f);
glBegin(GL_QUADS);
glVertex3f(-100.0f, 0.0f, -100.0f);
glVertex3f(-100.0f, 0.0f, 100.0f);
glVertex3f( 100.0f, 0.0f, 100.0f);
glVertex3f( 100.0f, 0.0f, -100.0f);
glEnd();
// Draw 4 Snowmen
glColor3f(1.0f, 1.0f, 1.0f);
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++) {
glPushMatrix();
glTranslatef(i*3.0,0,-j * 3.0);
glColor3f(1.0f, 1.0f, 1.0f);
glCallList(snowman_display_list);
glPopMatrix();
}
}
The following function is for color coding rendering. As you can see the ground was left out since it is neither a pickable object, nor an occluding one. Also the code for the snowmen was altered
の下にある関数は、カラーコーディングペイントです.ご覧のように、大地は無視されています.それは選択可能なオブジェクトでも遮蔽板でもないからです.同時に、雪だるまを描くコードが修正されました.
void drawPickingMode() {
// Draw 4 SnowMen
glDisable(GL_DITHER);
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++) {
glPushMatrix();
// A different color for each snowman
switch (i*2+j) {
case 0: glColor3ub(255,0,0);break;
case 1: glColor3ub(0,255,0);break;
case 2: glColor3ub(0,0,255);break;
case 3: glColor3ub(250,0,250);break;
}
glTranslatef(i*3.0,0,-j * 3.0);
glCallList(snowman_display_list);
glPopMatrix();
}
glEnable(GL_DITHER);
}