3

そこで、選択したいパーツごとに固有の色でレンダリングすることで、ピッキング/選択を正常に実装しました。

これはジオメトリでは機能しますが、テキストはどうですか?Webをよく検索しましたが、カラーピッキングやテキストに関連するものは見つかりませんでした。

私が考えた解決策は、バックバッファーのテキストではなく、カスタムジオメトリをレンダリングすることでした。問題は、シーンの回転が異なる可能性があることです(グローバルX +ローカルZ)。テキストの位置/回転を一致させる必要があるため、このジオメトリの正しい位置と回転を毎回計算する必要があります。これは自動的にレンダリングされます。 glut.glutStrokeString(font、string)呼び出しを使用して、ユーザーに対して水平および垂直。

テキストの選択にもコツがあるのではないでしょうか。

追伸:申し訳ありませんが、私は間違っていました。ストロークではなく、glutBitmapStringを使用しています。

4

1 に答える 1

3

テキストの画面スペースで境界矩形を計算し、クリックイベントで、カーソル位置がアクティブな境界矩形のいずれかにあるかどうかを確認できます。このようなもの:

struct brect_t { float x, y, w, h; };
struct string_t {
    void *fontID;
    const unsigned char *data;
    brect_t rect;
};

static string_t strings[MAX_STRINGS];
int stringsCount = 0;

// add new string to render queue
int stringsAdd(float x, float y, void *fontID, const unsigned char *str) {
    if (stringsCount >= MAX_STRINGS)
        return 0;

    string_t *string = strings + stringsCount++;
    string->rect.x  = x;
    string->rect.y  = y;
    string->rect.w  = glutStrokeLength(fontID, str);
    string->rect.h  = glutStrokeHeight(fontID);
    strings->fontID = fontID;
    string->data    = str;

    return 1;
}

// render all strings
void stringsRender(float r, float g, float b) {
    glColor3f(r, g, b);

    for (int i = 0; i < stringsCount; ++i) {
        const string_t *string = strings + i;

        glPushMatrix();
        glLoadIdentity();
        glTranslatef(string->rect.x, string->rect.y, 0.0f);
        glutStrokeString(string->fontID, string->data);
        glPopMatrix();
    }
}

// x,y - in model space coordinates
const string_t* stringsPick(float x, float y) {
    for (int i = 0; i < stringsCount; ++i) {
        const string_t *string = strings + i;
        const rect_t   *rect   = &string->rect;

        if (x >= rect->x &&
            y >= rect->y &&
            x <= (rect->x + rect->w) &&
            y <= (rect->y + rect->h)) {
            return string;
        }
    }

    return NULL;
}
于 2012-10-24T10:09:09.873 に答える