Opengl 计算机图形学中的变换

Opengl 计算机图形学中的变换,opengl,graphics,transformation,Opengl,Graphics,Transformation,我正在努力学习这门关于计算机图形学的课程,但我被困在作业1中了。我不明白向量眼睛和向上的作用是什么。作业的描述可以找到,还有第一个作业的框架 到目前为止,我有以下代码: // Transform.cpp: implementation of the Transform class. #include "Transform.h" //Please implement the following functions: // Helper rotation function. mat3 T

我正在努力学习这门关于计算机图形学的课程,但我被困在作业1中了。我不明白向量
眼睛
向上
的作用是什么。作业的描述可以找到,还有第一个作业的框架

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

// 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()
{

}
//Transform.cpp:Transform类的实现。
#包括“Transform.h”
//请执行以下功能:
//辅助旋转函数。
mat3变换::旋转(常量浮点度、常量向量3和轴){
//请实施这一点。
浮动弧度=度*M_PI/180.0f;
mat3-r1(cos(弧度));
mat3 r2(0,-轴z,轴y,轴z,0,-轴x,-轴y,轴x,0);
mat3 r3(轴x*轴x、轴x*轴y、轴x*轴z、,
轴x*轴y,轴y*轴y,轴y*轴z,
轴x*轴z、轴z*轴y、轴z*轴z);
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
r2[i][j]=r2[i][j]*sin(弧度);
r3[i][j]=r3[i][j]*(1-cos(弧度));
}
}
返回r1+r2+r3;
}
//在“水晶球”界面周围变换相机左侧
void Transform::left(浮动度数、vec3和eye、vec3和up){
眼睛=眼睛*旋转(度,向上);
}
//围绕“水晶球”界面向上变换摄影机
void Transform::up(浮动度、vec3和eye、vec3和up){
vec3 newAxis=glm::十字(眼睛,向上);
}
//glm::lookAt矩阵的实现
mat4变换::注视(vec3眼睛,vec3向上){
返回lookAtMatrix;
}
Transform::Transform()
{
}
转换::~Transform()
{
}
对于
left
方法,它似乎做了正确的事情,即绕y轴旋转对象(实际上我不确定对象是否在移动,或者我移动的是相机,有人能澄清一下吗?)

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

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

有人能帮我理解要执行的操作吗?
有人能解释一下vectors
eye
up
的作用吗?

视图转换通常使用“look-at”功能实现。这样做的目的是指定摄影机的位置、它的观察方向以及在特定空间中表示“向上”的方向,然后返回一个表示该变换的矩阵

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

函数的工作原理如下

可以将表示旋转的3x3矩阵视为由要转换到的空间的3个垂直单位轴组成。如果你能提供这些向量,你就能建立矩阵

第一个轴很容易。相机的方向通常是沿“Z”方向看,因此,如果从相机的位置获取表示被观察物体方向的向量,然后将其法线化,这就是Z轴

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

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

< x′和z轴的叉积给出y轴(它不一定与y轴相同——考虑向天花板或地板看)。 这三个轴,归一化后,(x,y,z)直接形成旋转矩阵

矩阵的平移部分通常是相机的位置,通过旋转的倒数变换(这样,当通过注视矩阵本身变换相机位置时,它应该返回原点)。

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

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

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

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

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

5) 最后一点提示:

问:OpenGL mat3和mat4之间有什么区别

A:

mat3(MVI)*正常

从4x4矩阵返回上3x3矩阵并乘以 这个矩阵叫做“法线矩阵”。你可以使用 这可以将法线从世界空间带到眼睛空间

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


想必,
eye
是一个定义向里看的方向的向量,
up
是u