gluLookAt(,,),前面三个参数是摄像机位置,中间三个是目标位置,那么这两个位置就确定一个向量V1了。后面三个参数说是摄像机竖直向上的方向V2。V1和V2理论上应该垂直啊,所以传递参数的时候应该有某种限制的,但是这两个向量被单独决定的,也就是说在传递参数的时候可以不垂直。求解!!!

解决方案 »

  1.   

    void gluLookAt
                  (GLdouble eyeX
                  , GLdouble eyeY
                  , GLdouble eyeZ
                  , GLdouble centerX
                  , GLdouble centerY
                  , GLdouble centerZ
                  , GLdouble upX
                  , GLdouble upY
                  , GLdouble upZ
                  );
    前3个:相机位置(三维点)
    中3个:模型位置(三维点)
    后3个:相机正方向(三维矢量)你把三维点和矢量搞混了:
    点说的是三维空间的位置,只是确定个位置,没有大小,没有方向.
    矢量是既有大小又有方向的量,最后3个数确定一个矢量,矢量的方向就是相机的正方向.
    "那么这两个位置就确定一个向量V1了。后面三个参数说是摄像机竖直向上的方向V2。V1和V2理论上应该垂直啊"
    V1和V2不必垂直,为什么必须垂直呢?如果觉得这个函数不好理解,那就转化为旋转平移变换:F = [centerX-eyeX;centerY-eyeY;centerZ-eyeZ] // 分号跟matlab中的意义一样,表示一行数据结束
    f = F/||F||; // 归一化
    up' = UP/||UP||;
    s = f×up', u = s×f; // ×表示叉乘
    旋转矩阵M = 
    s[0]   s[1]  s[2] 0
    u[0]   u[1]  u[2] 0
    -f[0] -f[1] -f[2] 0
    0      0     0    1gluLookAt(..)等价于
    glMultMatrix(M)
    glTranslated(-eyeX,-eyeY,-eyeZ)