所以,我成功地通过使用我想要选择的每个部分的唯一颜色进行渲染来实现拾取/选择。
这适用于几何体,但文本呢?我搜索了很多网页,但是我找不到任何与颜色挑选和文字相关的内容。
我认为解决方案是在后台缓冲区中渲染一些自定义几何体而不是文本。问题是我的场景可以有不同的旋转(全局X +局部Z),所以我需要计算每次正确的位置和旋转这个几何,因为我需要匹配文本的位置/旋转,即自动渲染使用glut.glutStrokeString(font,string)调用水平和垂直于用户。
我想知道是否还有关于文本选择的技巧。
Ps:sry,我错了,我没有使用笔画但是使用了glutBitmapString ..
答案 0 :(得分: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;
}