游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2619|回复: 2

OpenGL 三维拾取

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-7-7 20:41:00 | 显示全部楼层 |阅读模式
最近做了三维拾取的程序,比如对一个立方体做面的拾取,是否用深度值来挑选,也就是对点击记录
select buffer 比较窗口坐标,取具有最小窗口坐标的名称的面作为拾取的面? 请指教,我自己感觉不太多,
一般的做法是怎么样的? 谢谢!
我主要思路如下:
void pickFace(int button, int state, int x, int y)  //鼠标点击函数
{
  glGetIntegerv(GL_VIEWPORT,viewport);
  glSelectBuffer(512,selBuffer);
  glRenderMode(GL_SELECT);
  glInitNames();
  glPushName(0);
  glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glLoadIdentity();
  gluPickMatrix((GLdouble)x,(GLdouble)(viewport[3] - y),5.0,5.0,viewport);
  glOrtho(-3.0,3.0, -3.0,3.0, -3.0,3.0);       
  glMatrixMode (GL_MODELVIEW);
  Cube(GL_SELECT);         //画立方体
  glMatrixMode(GL_PROJECTION);
  glPopMatrix();
  hits = glRenderMode(GL_RENDER);
  processPick(hits,selBuffer);  //处理点击记录
  glutSwapBuffers();
  glMatrixMode(GL_MODELVIEW);
  glutPostRedisplay();
}

void processPick(GLint hits,GLuint selBuffer[])
{
  ......
  std::vector<float> depth;
  float temp;
  for (int i=0;i<hits;++i)
  {
     printf(" number of names for hit = %d\n", *ptr);
     ptr++;
     temp = (float) *ptr/0x7fffffff;  //最小窗口坐标
     depth.push_back(temp);
     ptr++;
     temp = (float) *ptr/0x7fffffff;  //最大窗口坐标               
     depth.push_back(temp);
     ptr++;   
     ptr++;
   }
   ..........  //找出depth中最小的窗口坐标,对应的名称即为拾取面的名称
}

void Cube(GLenum mode)
{
  //Front face
  if (mode == GL_SELECT)
  {       
     glLoadName(1);
  }
  else
  {
     //画立方体的面
  }
  //Back face
  .....
  .....
}

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2009-7-10 21:06:00 | 显示全部楼层

Re: OpenGL 三维拾取

没人回我么??

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2009-8-26 10:36:00 | 显示全部楼层

Re:OpenGL 三维拾取

给每个面一个名字,取selectbuffer中最前的那个名字。

void Cube(GLenum mode)
{
  //Front face
  if (mode == GL_SELECT)
  {
     glLoadName(1);
     drawFace1();

glLoadName(2);
drawFace2();

glLoadName(3);
drawFace3();

glLoadName(4);
drawFace4();

glLoadName(5)
drawFace5();

glLoadName(6);
drawFace6();
  }
  else
  {
     //画立方体的面
  }
  //Back face
  .....
  .....
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 10:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表