GAMES101笔记03:Transformation Cont (续) + 作业1

本文介绍了3D图形中的关键变换,包括三维变换、视图/相机变换(包含正交和透视投影)、以及如何创建视图矩阵、模型矩阵和投影矩阵。通过实例展示了如何用Eigen库实现这些矩阵的计算,以及与视图和投影相关的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、3D Transformations(三维变换)(续笔记02)

二、Viewing transformation(观测变换)

1、View / Camera transformation(视图/相机变换)

2、Projection transformation(投影变换)

① Orthographic projection(正交投影)

② Perspective Projection(透视投影)

三、作业一


一、3D Transformations(三维变换)(续笔记02)

(注意绕y轴转的矩阵与绕x轴、z轴旋转的矩阵的规律有不同!)

三维空间中旋转的矩阵表示公式:

二、Viewing transformation(观测变换)

1、View / Camera transformation(视图/相机变换)

(注意:

①View / Camera Transformation(视图变换)是进行平移再进行旋转,而笔记02中的Affine Transformations(仿射变换)是先旋转再平移

②求R逆用了特例法(X令其为[1,0,0,0]^T, Y令其为[0,1,0,0]^T, Z令其为[0,0,1,0]^T)。向量(g×t)为,向量t为,向量-g为

③旋转矩阵的逆矩阵就是它的转置矩阵,就是说旋转矩阵是正交矩阵(R^(-1) = R^(T))

)

2、Projection transformation(投影变换)

① Orthographic projection(正交投影)

2D:

3D:

② Perspective Projection(透视投影)

fovY(视角),aspect ratio(宽高比): 

三、作业一

写的代码:

#include "Triangle.hpp"
#include "rasterizer.hpp"
#include <eigen3/Eigen/Eigen>
#include <iostream>
#include <opencv2/opencv.hpp>

constexpr double MY_PI = 3.1415926;

Eigen::Matrix4f get_view_matrix(Eigen::Vector3f eye_pos)
{
    Eigen::Matrix4f view = Eigen::Matrix4f::Identity();

    Eigen::Matrix4f translate;
    translate << 1, 0, 0, -eye_pos[0], 0, 1, 0, -eye_pos[1], 0, 0, 1,
        -eye_pos[2], 0, 0, 0, 1;

    view = translate * view;

    return view;
}

Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
    Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
    
    // TODO: Implement this function
    // Create the model matrix for rotating the triangle around the Z axis.
    // Then return it.

    float r = rotation_angle/180*MY_PI;
    Eigen::Matrix4f rotate;
    rotate << cos(r), -sin(r), 0, 0,
                sin(r), cos(r),  0, 0,
                0,      0,       1, 0,
                0,      0,       0, 1;
    model = rotate * model;

    return model;
}

Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
                                      float zNear, float zFar)
{
    // Students will implement this function

    Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();

    // TODO: Implement this function
    // Create the projection matrix for the given parameters.
    // Then return it.
    zNear = -zNear;
    zFar = -zFar;
    float fovY = eye_fov/180*MY_PI;
    float t = abs(zNear)*tan(fovY/2);
    float r = aspect_ratio*t;
    float l = -r;
    float b = -t;
    Eigen::Matrix4f translate, scale, persp2ortho;

    translate << 1, 0, 0, -(l+r)/2,
                 0, 1, 0, -(t+b)/2,
                 0, 0, 1, -(zNear+zFar)/2,
                 0, 0, 0, 1;
    
    scale << 2/(r-l), 0, 0, 0,
             0,       2/(t-b), 0, 0,
             0,       0,       2/(zNear-zFar), 0,
             0,       0,       0,              1;

    persp2ortho << zNear, 0, 0, 0,
                   0, zNear, 0, 0,
                   0, 0, zNear+zFar, -zNear*zFar,
                   0, 0, 1, 0;

    projection = translate*scale*persp2ortho;      

    return projection;
}

成果图片:

参考:

games101——作业1_games101作业1-优快云博客

GAMES101 作业1_games101作业1-优快云博客

GAMES 101 作业 1 - Los1r - 博客园 (cnblogs.com)

Games101作业1三角形上下颠倒问题 - 知乎 (zhihu.com)

虚拟机中截图方法:

在ubuntu中进行截屏_virtualbox rsys怎么截图-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_69987707

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值