计算机图形的转换



我正在尝试遵循有关计算机图形的课程,但我陷入了作业1.我不明白vector 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方法应该做什么。

有人可以帮助我了解要执行的动作吗?有人可以解释向量eyeup的角色是什么?

视图变换通常是使用" look-at"函数实现的。您的想法是您指定相机的位置,它在哪个方向上以及在特定空间中代表"向上"的方向,并且您将获得一个代表转换的矩阵。

看来您正在尝试实现某种"旋转球"导航控制。这很简单 - 水平运动应围绕一些" Y"轴旋转,垂直运动应围绕"右"(或X)轴旋转。通常,这些旋转围绕当前视图轴而不是全球性工作,使运动是直观的。我不确定您在那里想要什么。

look-at函数如下。

代表旋转的3x3矩阵可以看作是您要转换为空间的3个垂直单位轴组成。因此,如果您可以提供这些向量,则可以构建矩阵。

第一个轴很容易。摄像机通常是指向" z"的,因此,如果您将矢量从相机位置观察到的事物方向,然后将其归一化,这是Z轴。

然后,您需要定义一个独特的"向上"向量 - (0,1,0)是典型的,但是在Z轴指向相同方向的情况下,您需要选择其他的矢量。

此"向上"向量和" Z"轴的交叉产物给出了" x"轴 - 这是因为跨产品给出了垂直矢量,而构成水平的构成将垂直于"正向"方向和"向上"。

然后," x"one_answers" z"轴的跨产品给出了'y'轴(不一定与'y'轴相同 - 考虑向天花板或地板朝上看)。

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

矩阵的翻译部分通常是相机的位置,由旋转的反向转换(因此,当通过Lookat矩阵本身转换相机位置时,它应该回到原点。

)。

1)您的课程使用OpenGL库,您的作业分配是填写骨架模块" transform.cpp"。

2)您要问的方法是" Mat4 Transform :: Lookat(Vec3 Eye,Vec3 Up)":

lookAt:最后,您需要在转换矩阵中进行编码,给定 眼睛和向上的向量。您可能需要参考课程 注意这样做。可能有助于脱离UVW坐标框架 (作为3个向量),并建立一个辅助4 4矩阵M 由于此功能而返回。咨询课堂笔记和 这部分的讲座。

3)这两个论点"眼"one_answers"向上"的提示应在您的课堂笔记和讲座中。

4)另一个提示是"定义一个UVW坐标框架(作为三个向量),并构建一个辅助4x4矩阵...结果返回...。

5)最终提示:

问:OpenGL Mat3和Mat4有什么区别?

a: GLSL中的MAT3(MAT4矩阵)语句是什么?

mat3(MVI) * normal

从4x4矩阵返回上部3x3矩阵,并乘以 正常。该矩阵称为"正常矩阵"。你用 这使您的正常天体从世界空间到眼睛空间。

原始矩阵为4x4而不是3x3的原因是4x4 矩阵让您进行仿射转换并包含有用的 透视渲染的信息。但是要从世界上享受正常 空间到眼睛空间,您只需要3x3型号视图矩阵。

相关内容

  • 没有找到相关文章

最新更新