【问题标题】:About LookAt() function关于 LookAt() 函数
【发布时间】:2013-04-28 15:55:49
【问题描述】:

我需要实现一个四元数来旋转相机。在实现四元数之前,我使用 LookAt(&eye, &at, &up) 来表示相机坐标(vpn, vup, ...)。

vec3 eye = vec3(0.0,0.0,-10.0);
vec3 to = vec3(0.0,0.0,0.0); // initial
vec3 up = vec3(0.0,1.0,0.0);

vec3 d = to - eye;

在显示回调时。

        m = LookAt(eye,to,up);

        glUniformMatrix4fv(ModelView,1,GL_TRUE,m);

并添加一个旋转(它仍然是欧几里得旋转,和键盘交互)

        case 'a':
                temp = RotateX(1.0) * vec4(d,0);
                temp1 = RotateX(1.0) * vec4(up,0);
                d = vec3(temp.x, temp.y, temp.z);
                up = vec3(temp1.x, temp1.y, temp1.z);
                eye = to - d;
                break;
        case 'd':
                temp = RotateY(1.0) * vec4(d,0);
                temp1 = RotateY(1.0) * vec4(up,0);
                d = vec3(temp.x, temp.y, temp.z);
                up = vec3(temp1.x, temp1.y, temp1.z);
                eye = to - d;
                break;

所以我的问题是,LookAt 功能只是使相机坐标?是否有任何旋转矩阵来使相机坐标?如您所见,我通过使用 LookAt 中没有的一些旋转来旋转我的相机,我将使用四元数进行旋转。但是 LookAt() 使用了一些旋转,我将实现 LookAt 的四元数版本以避免云台锁定

【问题讨论】:

    标签: opengl graphics


    【解决方案1】:

    LookAt 所做的只是平移 T(因此新原点位于 eye 点),然后是旋转 R。旋转是通过从 3 个向量(由 eye 向量定义的方向)构建正交基来定义的居中,直接指定的上向量和定义为垂直于两者的右向量)。 LookAt 产生的最终变压器是 R*T。

    如果您正确指定输入向量,您可以使用 LookAt 而不会出现任何万向节锁定问题,但您也可以通过位置向量(定义 T)和方向四元数(定义 R)来描述您的相机,而不必使用看看。

    【讨论】:

    • 这是真的,它是第一个应用于 LooAt 的 T 和 R 转换。我也在这个视频中看到了一些讨论:youtube.com/watch?v=s9FhcvjM7Hk 但我不知道为什么我们不能应用 R 然后 T。你有解释吗?
    • @Narek: 每个 仅由旋转和平移组成的变换矩阵都可以分解为M=T1*RM=R*T2 形式,只是平移值本身会在中间发生变化两种形式。
    猜你喜欢
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2014-02-04
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多