【GAMES101】二维变换和齐次坐标

2023-12-07 03:28

本文主要是介绍【GAMES101】二维变换和齐次坐标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这几天都在抽空学OpenGL、敲leetcode和看games,这里留点笔记给以后复习

games101第一节课在吹水,第二节课讲了线性代数的入门知识,比较简单,这里稍微回顾一下重点,然后开始讲第三节课的二维变换和齐次坐标

目录

向量

向量的点乘

向量的叉乘

​二维变换

缩放

拉伸

旋转

平移

齐次坐标


向量

games101的向量是默认列向量

向量的点乘

向量的点乘就是对应的元素相乘

这个可以用来求向量之间的夹角,特别是当两个向量都是单位向量的时候,它们夹角的余弦值就是两个向量点乘的结果

向量的叉乘

两个向量叉乘的结果是这样的一个向量:方向与两个向量垂直,按右手系是从a旋转到b大拇指指向的方向,大小是两个向量的长度和夹角正弦值的乘积

坐标系的话,games101用的是右手系,OpenGL用的也是右手系,但是unity和ue都是左手系

叉乘可以用来判断一个点是否在一个多边形内部,如下P点,如果AP×AB和BP×BC和CP×CA的方向是一样的,那么这个P点就在三角形内部

二维变换

缩放

对于一个图形进行缩放,实际上就是对于每一个点的坐标进行缩放,比如缩小一半,就是x和y都变成原来的一半,这个没有什么问题

更方便的统一操作,我们可以用一个矩阵乘法来表示缩放这个操作,x和y都乘以s

x和y不同程度的拉伸

对称变换

拉伸

往某个方向拉伸,比如x方向,y不变,x’=x+ay

旋转

逆时针旋转,这个可以通过固定两个顶点来推出这个变换矩阵

平移

对于平移,即x和y加上对应的平移量

齐次坐标

其实你可能已经发现,在变换中,缩放、拉伸和旋转都可以用一个矩阵乘法来表示,这三个变换又可以称为线性变换,唯独平移不可以用矩阵乘法表示(我尝试过了,真不行)

齐次坐标就是解决这个问题的,可以统一变换为一个矩阵乘法形式

解决办法:通过增加一个维度来表示,第三个维度为1表示这是个点,第三个维度为0表示这是个向量,这样就可以通过三维矩阵乘法来表示平移变换了

这样子的话,那么两个向量相加是向量,两个点相减是向量,一个点加上一个向量还是一个点

那么点加点呢?

实际上还是点,而且是这两个点的中点,因为点,确切的表示是这个:

因此通过齐次坐标,我们就可以统一变换为矩阵乘法形式

由于矩阵乘法的规律,所以多次变换是以矩阵左乘的顺序相乘的,而且是先进行线性变换再平移 

这篇关于【GAMES101】二维变换和齐次坐标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/464335

相关文章

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x

C语言批量数据到动态二维数组

上一篇文章将文件读取放到静态创建的二维数组中,但是结合网络上感觉到今天的DT时代,这样批量大量读取一个上百行的数据,分配的内存是否可能因为大量的数据而产生溢出呢,最近一直研究里malloc函数,通过它来动态建立所需的二维数组,因此,通过文件操作和动态创建二维数组结合起来,将大量的数据动态的放入矩阵中,不知道这样的思想是否正确,下午把程序运行出来了,将程序贴上来,欢迎大家一起探讨:对于有规律的大数据

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘:

HLJUOJ1118(二维树状数组)

1118: Matrix Time Limit: 4 Sec   Memory Limit: 128 MB Submit: 77   Solved: 12 [ Submit][ Status][ Web Board] Description 给定一个1000*1000的二维矩阵,初始矩阵中每个数都为1,然后为矩阵有4种操作. S x1 y1 x2 y2:计算(x1,y1)、(x2

hdu1892(二维树状数组)

See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 3726    Accepted Submission(s): 1168 题目链接: http://acm.hdu.edu.cn/showproblem.php