CR苏杭 发表于 2011-7-20 11:34:43

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

本帖最后由 CR苏杭 于 2011-7-20 15:05 编辑

void GLAPIENTRY
gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx,
          GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy,
          GLdouble upz)
{
    float forward, side, up;
    GLfloat m;

    forward = centerx - eyex;
    forward = centery - eyey;
    forward = centerz - eyez;

    up = upx;
    up = upy;
    up = upz;

    normalize(forward);

    /* Side = forward x up */
    cross(forward, up, side);
    normalize(side);

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

    __gluMakeIdentityf(&m);
    m = side;
    m = side;
    m = side;

    m = up;
    m = up;
    m = up;

    m = -forward;
    m = -forward;
    m = -forward;

    glMultMatrixf(&m);
    glTranslated(-eyex, -eyey, -eyez);
}为什么这里的up要重新side叉乘forward一次? 而不直接normalize(up)?

array 发表于 2011-7-20 12:36:10

因为用户传进来的up可能是一个并非垂直于forward和side的值,需要重新换算成标准。据我所知至少在国内有不少人都愿意始终指定up为(0,0,1)……
页: [1]
查看完整版本: gluLookAt的实现的疑问[已解:2f]