【问题标题】:Ray picking with gluUnProject() into world coordinates使用 gluUnProject() 将光线拾取到世界坐标中
【发布时间】:2011-02-10 22:46:03
【问题描述】:

我使用以下方法设置了一个场景:

glViewport(0,0,screen->w,screen->h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
const float wh = (float)screen->w/(float)screen->h;
gluPerspective(zoom,wh,1,10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-3); // puts model inside z-range

稍后,当用户单击时,我想在世界坐标系中计算一条射线以用于我的相交测试(使用glReadPixels() 来获取z):

double mv[16], p[16], a, b, c, d, e, f;
glGetDoublev(GL_MODELVIEW_MATRIX,mv);
glGetDoublev(GL_PROJECTION_MATRIX,p);
matrix_t _mv, _p;
glGetFloatv(GL_MODELVIEW_MATRIX,_mv.f);
glGetFloatv(GL_PROJECTION_MATRIX,_p.f);
const matrix_t inv = (_p*_mv).inverse();
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT,viewport);
gluUnProject(x,viewport[3]-y,0,mv,p,viewport,&a,&b,&c);
const vec_t origin(vec_t(a,b,c)*inv);
gluUnProject(x,viewport[3]-y,1,mv,p,viewport,&d,&e,&f);
const vec_t dest(vec_t(d,e,f)*inv);
ray_t ray(origin,dest-origin);

不幸的是,我误解了如何将光线从相机坐标转换为世界坐标 - 我的光线未命中。

如何正确地将光线转换为世界坐标?

【问题讨论】:

    标签: math 3d matrix


    【解决方案1】:

    您可能会发现我对类似问题的回答很有用。

    Click to zoom in WebGL

    该答案与 WebGL 和 Javascript 有关。我不在 C++ 和 OpenGL 中工作。但是查看您的代码,我认为 gluUnproject 已经在使用 pmv 矩阵的逆矩阵。因此,您将结果乘以 inv 是多余的,并且可能是导致结果出错的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多