3

因此,我成功地实现了拾取/选择,方法是使用独特的颜色渲染每个我希望可选择的部分。

这适用于几何,但文本呢?我在网上搜索了很多,但没有找到任何与颜色选择和文本相关的内容。

我认为的解决方案是在后台缓冲区中呈现一些自定义几何图形而不是文本。问题是我的场景可以有不同的旋转(全局 X + 局部 Z),所以我需要每次计算这个几何体的正确位置和旋转,因为我需要匹配自动渲染的文本的位置/旋转使用 glut.glutStrokeString(font, string) 调用水平和垂直于用户。

我想知道是否还有关于文本选择的技巧。

Ps:sry,我错了,我用的不是笔划而是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 回答