查看: 4267|回复: 1

gluLookAt的实现的疑问[已解:2f]

[复制链接]

该用户从未签到

发表于 2011-7-20 11:34:43 | 显示全部楼层 |阅读模式
本帖最后由 CR苏杭 于 2011-7-20 15:05 编辑
  1. void GLAPIENTRY
  2. gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx,
  3.           GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy,
  4.           GLdouble upz)
  5. {
  6.     float forward[3], side[3], up[3];
  7.     GLfloat m[4][4];

  8.     forward[0] = centerx - eyex;
  9.     forward[1] = centery - eyey;
  10.     forward[2] = centerz - eyez;

  11.     up[0] = upx;
  12.     up[1] = upy;
  13.     up[2] = upz;

  14.     normalize(forward);

  15.     /* Side = forward x up */
  16.     cross(forward, up, side);
  17.     normalize(side);

  18.     /* Recompute up as: up = side x forward */        // ????
  19.     cross(side, forward, up);

  20.     __gluMakeIdentityf(&m[0][0]);
  21.     m[0][0] = side[0];
  22.     m[1][0] = side[1];
  23.     m[2][0] = side[2];

  24.     m[0][1] = up[0];
  25.     m[1][1] = up[1];
  26.     m[2][1] = up[2];

  27.     m[0][2] = -forward[0];
  28.     m[1][2] = -forward[1];
  29.     m[2][2] = -forward[2];

  30.     glMultMatrixf(&m[0][0]);
  31.     glTranslated(-eyex, -eyey, -eyez);
  32. }
复制代码
为什么这里的up要重新side叉乘forward一次? 而不直接normalize(up)?

该用户从未签到

发表于 2011-7-20 12:36:10 | 显示全部楼层
因为用户传进来的up可能是一个并非垂直于forward和side的值,需要重新换算成标准。据我所知至少在国内有不少人都愿意始终指定up为(0,0,1)……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表