0

我正在尝试学习这门有关计算机图形学的课程,但我被困在作业中 1. 我不明白向量eyeup. 作业的描述可以在这个链接中找到,还有第一个作业的骨架。

到目前为止,我有以下代码:

// Transform.cpp: implementation of the Transform class.


#include "Transform.h"

//Please implement the following functions:

// Helper rotation function.  
mat3 Transform::rotate(const float degrees, const vec3& axis) {
  // Please implement this.
    float radians = degrees * M_PI / 180.0f;
    mat3 r1(cos(radians));
    mat3 r2(0, -axis.z, axis.y, axis.z, 0, -axis.x, -axis.y, axis.x, 0);
    mat3 r3(axis.x*axis.x, axis.x*axis.y, axis.x*axis.z,
            axis.x*axis.y, axis.y*axis.y, axis.y*axis.z,
            axis.x*axis.z, axis.z*axis.y, axis.z*axis.z);
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            r2[i][j] = r2[i][j]*sin(radians);
            r3[i][j] = r3[i][j]*(1-cos(radians));
        }
    }
    return r1 + r2 + r3;
}

// Transforms the camera left around the "crystal ball" interface
void Transform::left(float degrees, vec3& eye, vec3& up) {
    eye = eye * rotate(degrees, up);
}

// Transforms the camera up around the "crystal ball" interface
void Transform::up(float degrees, vec3& eye, vec3& up) {
    vec3 newAxis = glm::cross(eye, up);
}

// Your implementation of the glm::lookAt matrix
mat4 Transform::lookAt(vec3 eye, vec3 up) {
    return lookAtMatrix;
}

Transform::Transform()
{

}

Transform::~Transform()
{

}

对于该left方法,它似乎在做正确的事情,即围绕 y 轴旋转对象(实际上我不确定对象是在移动还是我正在移动的是相机,有人可以澄清一下吗?) .

对于up我无法使其工作的方法,它将围绕 x 轴旋转对象(或相机?)(至少我是这么认为的)。

最后,我不明白该lookAt方法应该做什么。

有人可以帮助我了解要执行的操作吗?有人可以解释向量eye和的作用是什么up吗?

4

2 回答 2

2

视图转换通常使用“查看”功能来实现。这个想法是你指定相机在哪里,它正在看什么方向,以及在你的特定空间中哪个方向代表“向上”,然后你会得到一个代表该变换的矩阵。

看起来您正在尝试实现某种“旋转球”导航控制。这相当简单——水平运动应该围绕某个“Y”轴旋转,而垂直运动应该围绕“右”(或 X)轴旋转。通常,这些旋转围绕当前视图轴工作,而不是全局工作,因此移动是直观的。我不确定你在寻找什么。

查看功能的工作原理如下。

表示旋转的 3x3 矩阵可以被视为由您正在转换的空间的 3 个垂直单位轴组成。因此,如果您可以提供这些向量,则可以构建矩阵。

第一个轴很容易。相机通常朝向“Z”方向看,所以如果你从相机的位置取代表被观察物体方向的向量,然后对其进行归一化,这就是 Z 轴。

然后您需要定义一个不同的“向上”向量 - (0,1,0) 是典型的,但在 Z 轴指向同一方向的情况下,您需要选择不同的向量。

这个“向上”向量和“Z”轴的叉积给出了“X”轴——这是因为叉积给出了一个垂直向量,构成水平的方向将垂直于“向前”方向,并且“向上'。

然后“X”和“Z”轴的叉积得到“Y”轴(不一定与“Y”轴相同——考虑看向天花板或地板)。

这三个归一化的轴 (x,y,z) 直接形成一个旋转矩阵。

矩阵的平移部分通常是相机的位置,由旋转的逆转换(这样当通过观察矩阵本身转换相机位置时,它应该最终回到原点)。

于 2012-12-30T19:11:36.687 回答
0

1)你的课程使用的是OpenGL库,你的作业是填写骨架模块“Transform.cpp”。

2)您要询问的方法是“mat4 Transform::lookAt(vec3 eye, vec3 up)”:

lookAt:最后,您需要在给定眼睛和向上向量的变换矩阵中进行编码。你可能需要参考课堂笔记来做到这一点。它可能有助于定义一个 uvw 坐标系(作为 3 个向量),并建立一个辅助 4 4 矩阵 M,该矩阵作为此函数的结果返回。请参阅本部分的课堂笔记和讲座。

3)在课堂笔记和讲座中应该提示“眼睛”和“向上”这两个论点的含义。

4) 另一个提示是“定义一个 uvw 坐标系(作为三个向量),并建立一个辅助 4x4 矩阵......作为结果返回......”。

5)最后的提示:

问:OpenGL mat3 和 mat4 有什么区别?

A: glsl 中提取 mat3(a mat4 matrix) 语句是做什么的?

mat3(MVI) * normal

从 4x4 矩阵返回上面的 3x3 矩阵,并将法线乘以该矩阵。该矩阵称为“正常矩阵”。你用它把你的法线从世界空间带到眼睛空间。

原始矩阵是 4x4 而不是 3x3 的原因是因为 4x4 矩阵允许您进行仿射变换并包含透视渲染的有用信息。但是要从世界空间到眼睛空间的法线,您只需要 3x3 模型视图矩阵。

于 2012-12-30T21:11:17.743 回答