【紧急求助】OpenGL二维曲线的选取

yovisun 2012-08-18 08:40:12
做一个简单的二维曲线绘制的程序,用VC的mfc做
从文件中读取,可以放大,缩小,平移。(已经完成)

最重要的功能是,可以选取曲线
使用的opengl的选取模式

但是始终选取不了,或者选取的不对,明明鼠标点了这里,却选取了另外的曲线
参看截图:


本人刚入手,刚刚接触opengl,很多代码都是参照网上或者书上写的
时间急,卡在这里实在无法进行下一步的工作了

紧急求助,估计懂的人一看,几分钟就能搞定了
希望快点解决这个问题
请加我QQ:8694198
我发源码
多谢。

能速度完美解决的,给一定酬劳!!!
...全文
167 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yovisun 2012-08-19
  • 打赏
  • 举报
回复
这是我的关键代码,麻烦大家看看:


void CCurvesView::SelectObject(GLint x, GLint y)
{
CString str;
str.Format("%d %d",x,y);
//MessageBox(str);//
str.Format("");
//MessageBox(str);

GLuint selectBuff[BUFSIZE]={0};//创建一个保存选择结果的数组
GLint hits; //点击记录的个数
GLint viewport[4]; //视口

glGetIntegerv(GL_VIEWPORT, viewport); //获得viewport

glSelectBuffer(BUFSIZE, selectBuff); //告诉OpenGL初始化selectbuffer
glRenderMode(GL_SELECT); //进入选择模式

glInitNames(); //初始化名字栈
glPushName(0); //在名字栈中放入一个初始化名字,这里为0

glMatrixMode(GL_PROJECTION); //进入投影阶段准备拾取
glPushMatrix(); //保存以前的投影矩阵
glLoadIdentity(); //载入单位矩阵

gluPickMatrix((GLdouble)x, // 设定我们选择框的大小,建立拾取矩阵,就是上面的公式
(GLdouble)(viewport[3]-y), // viewport[3]保存的是窗口的高度,窗口坐标转换为OpenGL坐标
2.0,2.0, // 选择框的大小为2,2
viewport // 视口信息,包括视口的起始位置和大小
);
gluOrtho2D(0.0, 3.0, 0.0, 3.0);

/****** GL_SELECT 模式画图 **********/
drawData(GL_SELECT);



glMatrixMode(GL_PROJECTION);
glPopMatrix(); // 返回正常的投影变换
glFlush();

glMatrixMode(GL_MODELVIEW);

hits = glRenderMode(GL_RENDER); // 从选择模式返回正常模式,该函数返回选择到对象的个数

if(hits > 0)
{


GLuint name;
GLuint *ptr;

ptr=selectBuff;

int i;
for(i=0;i<hits; i++){

name=*ptr; //选中图元在堆栈中的位置
ptr+=3; //跳过名字和深度信息
ptr+=name-1; //根据位置信息获得选中的图元名字

//addSelect(*ptr);

if (lineMaps[*ptr]==0 )
{
lineMaps[*ptr] = 1;
}else if (lineMaps[*ptr]==1)
{
lineMaps[*ptr] = 0;
}
ptr++;
}
/****** 默认模式画图 **********/
drawData();
}
}


void CCurvesView::drawData(GLenum model=GL_RENDER)
{
glPushMatrix();
glLoadIdentity(); // Reset The Current Modelview Matrix
glScalef(scaleX_,scaleY_,1);
glTranslatef( -viewHalfWidth_+marginWidth_*vcWidthRatio_, -viewHalfHight_+marginHight_*vcHightRatio_, 0);

glEnable(GL_SCISSOR_TEST);
glScissor(marginWidth_,marginWidth_,clientWidth_-marginWidth_,clientHeight_-marginWidth_);

glTranslatef( translateX_*vcWidthRatio_, translateY_*vcHightRatio_, 0);

if (data_&&dataSize_)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, dataSize_* 2 *sizeof(GLfloat), data_);
int i,j;
for (j = 0; j < nLineNumber; j++)
{
if(model==GL_SELECT)
{
glLoadName(j+1);
}
if(lineMaps[j+1]==1)
{
glColor3f(0.0,0.0,0.0);
}else{
glColor3f(1.0,0.0,0.0);
}
glDrawArrays(GL_LINE_STRIP , ndateNumber*j, ndateNumber);
}
}
glDisable(GL_SCISSOR_TEST);
glPopMatrix();
}
libralibra 2012-08-18
  • 打赏
  • 举报
回复
选择另外的曲线说明你坐标转换有问题
上面朋友说的射线法可以
或者用二维屏幕到三维世界坐标的反向计算,得到鼠标位置的三维世界坐标,然后求距离
gumuliying123 2012-08-18
  • 打赏
  • 举报
回复
opengl的选取模式我没有用过,一直用下面方式

1 view鼠标点转换到三维视景体中的射线
2 求射线和视景体中曲线的距离
3 距离在指定范围内就算选中

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧