精华内容
下载资源
问答
  • 齐次坐标 1. 向量 1.1 点乘 两个n维向量点乘: 二维向量的点乘:向量的模长相乘再乘以夹角余弦值。 点乘的结果是一个数值(标量)。 几何意义:b向量再a向量上的投影长度。 1.2 叉乘 结果:是...

    1. 向量

    1.1 点乘

    两个n维向量点乘:

    二维向量的点乘:向量的模长相乘再乘以夹角余弦值。

    • 点乘的结果是一个数值(标量)。
    • 几何意义:b向量再a向量上的投影长度。

    1.2 叉乘

    • 结果:是一个向量(矢量)。
    • 几何意义:向量a和向量b叉乘的得到的向量是同时垂直于向量a和向量b的向量。

    2. 矩阵

    2.1 矩阵乘法

    n维矩阵的乘法运算。

    举例:

    3. 齐次坐标

    • 齐次坐标就是图形变换过程中为了方便计算产生的概念。齐次坐标是将一个原本是n维的向量用一个n+1维向量来表示。

    • 例如:二维点(x,y)的齐次坐标表示为(hx,hy,h)。由此可以看出,一个点的齐次表示是不唯一的,齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标(8,4,2)、(4,2,1)表示的都是二维点(4,2)。

    • 向量的w分量也叫齐次坐标。想要从齐次向量得到3D向量,我们可以把x、y和z坐标分别除以w坐标。我们通常不会注意这个问题,因为w分量通常是1.0。

    • 如果一个向量的齐次坐标是0,这个坐标就是方向向量(Direction Vector),因为w坐标是0,这个向量就不能位移(译注:这也就是我们说的不能位移一个方向)。 它可以理解为一个无穷远的点。n+1维的齐次坐标中如果h=0,实际上就表示了n维空间的一个无穷远点。

    • 使用齐次坐标有几点好处:它允许我们在3D向量上进行位移(如果没有w分量我们是不能位移向量的)

    展开全文
  • 1.使用变换齐次矩阵与某个齐次坐标相乘得到的结果, 2.使用结果中的w分量,进行齐次除法得到归一化后的齐次坐标, 3.用变换齐次矩阵的逆矩阵与归一化后的齐次坐标相乘(注意我们是用归一化后的齐次坐标,不是上面第...

    1.使用变换齐次矩阵与某个齐次坐标相乘得到的结果.

    2.使用结果中的w分量,进行齐次除法得到归一化后的齐次坐标.

    3.用变换齐次矩阵的逆矩阵与归一化后的齐次坐标相乘(注意我们是用归一化后的齐次坐标,不是上面第一步变换后的齐次坐标),的到还原后的齐次矩阵,其w分量将会有一个特殊的值.

    4.如果将还原后的齐次矩阵使用其w分量进行齐次除法,将得到我们最开始用于变换的齐次坐标,彻底还原还原


    代数式表示为:

    M*V=>V/V.w=V"

    M逆*V"=V"/V".w=V


    具体为何会有如此结果,尚不清楚,但是Unity中广泛的应用了次齐次矩阵此种特性,特别是在Fragment的空间还原方法上


    测试代码如下

    public class NDC_Position : MonoBehaviour {
    
        bool m_isShow = false;
    	// Use this for initialization
    	void Start () {
    		
    	}
    	
    	// Update is called once per frame
    	void Update () {
    
            if (!m_isShow)
            {
                m_isShow = true;
    
                //直接使用世界坐标,这样可以方便测试
                //建立世界空间到clip空间的变换矩阵
                Matrix4x4 _vp = Camera.main.projectionMatrix * Camera.main.worldToCameraMatrix;
                //建立clip空间到世界空间的逆矩阵
                Matrix4x4 _vpInverse = _vp.inverse;
    
                Debug.Log("Camera.main.worldToCameraMatrix----\r\n" + _vp.ToString() + "\r\n-------------------------");
    
                Debug.Log("Camera.main.projectionMatrix----\r\n" + Camera.main.projectionMatrix.ToString()+"\r\n-------------------------");
    
                Debug.Log("_vp----\r\n" + _vp.ToString() + "\r\n-------------------------");
    
                Debug.Log("_vpInverse----\r\n" + _vpInverse.ToString() + "\r\n-------------------------");
    
    
                //手动使用齐次坐标来变换,已查看变换后的w分量
                Vector4 _ClipPos = _vp*(new Vector4(transform.position.x, transform.position.y, transform.position.z,1));
                Debug.Log("齐次 _ClipPos4=" + _ClipPos.x.ToString() + "," + _ClipPos.y.ToString() + "," + _ClipPos.z.ToString()+","+ _ClipPos.w.ToString() + "=>" + _ClipPos.ToString());
    
                //直接使用非齐次坐标,这样unity3d会自动帮你转换成齐次坐标,变换后自动帮你做齐次除法,最终得到NDC坐标
                Vector3 _NDCPos = _vp.MultiplyPoint(transform.position); //因为只返回前三个坐标,所以已经做了齐次除法处理,结果是直接返回了NDC坐标
                Debug.Log("齐次除后 _ClipPos=" + _NDCPos.x.ToString()+","+ _NDCPos.y.ToString()+","+ _NDCPos.z.ToString()+"=>"+ _NDCPos.ToString());
    
    
                //使用clip空间齐次坐标还原
                Vector4 _worldPos4 = _vpInverse * (new Vector4(_ClipPos.x, _ClipPos.y, _ClipPos.z, _ClipPos.w));
                Debug.Log("齐次还原 _worldPos4=[" + _ClipPos.x.ToString() + ", " + _ClipPos.y.ToString() + ", " + _ClipPos.z.ToString() +", "+ _ClipPos.w.ToString()+ ", 1]=>" + _worldPos4.x.ToString() + ", " + _worldPos4.y.ToString() + ", " + _worldPos4.z.ToString() + ", " + _worldPos4.w.ToString()+"=>"+ _worldPos4.ToString());
    
                //直接使用NDC齐次坐标还原,已查看变换后的w分量
                Vector4 _worldPos3 = _vpInverse * (new Vector4(_NDCPos.x, _NDCPos.y, _NDCPos.z,1));
                Debug.Log("非齐次还原 _worldPos3=[" + _NDCPos.x.ToString() + ", "+ _NDCPos.y.ToString() + ", "+ _NDCPos.z.ToString()+", 1]=>" + _worldPos3.x.ToString() + ", " + _worldPos3.y.ToString() + ", " + _worldPos3.z.ToString() + ", " + _worldPos3.w.ToString() + "=>" + _worldPos3.ToString());
    
                //Unity3d自动使用NDC齐次坐标还原,返回已经进行了齐次除法后的结果
                Vector3 _worldPos = _vpInverse.MultiplyPoint(_NDCPos);
                Debug.Log("非齐次还原 _worldPos=" + _worldPos.x.ToString() + ", " + _worldPos.y.ToString() + ", " + _worldPos.z.ToString()+"=>" + _worldPos.ToString());
            }
    
        }
    }


    展开全文
  • 小虎曾经在机器人学课堂上问过老师,老师含糊其词,想拿上面那句话唬我狂小虎,说这是线性代数的知识,但是小虎上的线性代数课也只给出“矩阵和矩阵相乘不满足乘法交换律(cummutative property)”的结论。

    这个很多人都会直接说:“就是不可逆啊,你拿两个矩阵乘以下,在换个顺序乘以下,它们的结果就是不一样的。”是啊,但是为什么它们的结果是不一样的呢?小虎曾经在机器人学课堂上问过老师,老师含糊其词,想拿上面那句话唬我狂小虎,说这是线性代数的知识,但是小虎上的线性代数课也只给出“矩阵和矩阵相乘不满足乘法交换律(cummutative property)”的结论。

    齐次变换矩阵复合变换不可逆分析

    先给出结论:
    对于在相对坐标系下的固定点P,当相对坐标系相对于固定/绝对坐标系作同一运动的时候,如果该运动所处的顺序不同,那么P点相对于固定/绝对坐标系的运动效果是不一样的,而我们观察的往往是物体(比如这个点)相对于固定/绝对坐标系的运动

    拿一个题目作为例子好啦。
    固连在坐标系(𝑛,𝑜,𝑎)上的点P(7,3,2)T 经历如下变换,求出变换后该点相对于固定参考坐标系的坐标。

    当绕y轴旋转90°处在第(2)步时

    (1)绕z轴旋转90°;
    (2)接着绕y轴旋转90°;
    (3)接着再平移[4,-3,7];
    我就拿例子中绕y轴旋转90°这个运动来说明。
    第一个步骤结束后,P坐标为
    P(3,7,2)P(-3,7,2)

    (1)结束后,我们来看看P在绝对坐标系中的位置:
    Pnoa=[0010010010000001]×[3721]=[2731]\pmb{P_{noa}''}=\begin{bmatrix} 0 & 0 & 1& 0\\ 0 & 1 & 0& 0\\ -1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 \\ \end{bmatrix}\times \begin{bmatrix} -3\\ 7\\ 2 \\ 1\\ \end{bmatrix}=\begin{bmatrix} 2\\ 7\\ 3\\ 1\\ \end{bmatrix}
    P(2,7,3)P'(2,7,3)

    两个步骤中P的相对位置变换为
    Δ1=(2,7,3)(3,7,2)=(5,0,1)\Delta_1= (2,7,3)-(-3,7,2)=(5,0,1)

    当绕y轴旋转90°处在第(3)步时

    倒转一下(2)和(3)的顺序
    (1)绕z轴旋转90°;
    (2)接着再平移[4,-3,7];
    (3)接着绕y轴旋转90°;

    (2)结束后,P在绝对坐标系中坐标如下(计算过程略)
    P(1,4,9)P(1,4,9)

    (3)结束后,我们来看看P在绝对坐标系中的位置:
    Pnoa=[0010010010000001]×[1491]=[9411]\pmb{P_{noa}'''}=\begin{bmatrix} 0 & 0 & 1& 0\\ 0 & 1 & 0& 0\\ -1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 \\ \end{bmatrix}\times \begin{bmatrix} 1\\ 4\\ 9 \\ 1\\ \end{bmatrix}=\begin{bmatrix} 9\\ 4\\ -1\\ 1\\ \end{bmatrix}
    P(9,4,1)P(9,4,-1)
    两个步骤中P的相对位置变换为
    Δ2=(9,4,1)(1,4,9)=(8,0,10)\Delta_2= (9,4,-1)-(1,4,9)=(8,0,-10)

    可以看到Δ1Δ2\Delta_1\neq \Delta_2,可以推测再平移[4,-3,7] 步骤的Δ3\Delta_3Δ4\Delta_4也是不一样的,而且正是由于Δ1+Δ3Δ2+Δ4\Delta_1+\Delta_3\neq \Delta_2+\Delta_4,最终交换顺序才导致结果不同。也就是P在不同顺序下进行接着绕y轴旋转90°相对于绝对坐标系位移是不一样的,对于再平移[4,-3,7]这个移动也是如此。
    P可以时相对坐标系上的任意一点,特殊地,当P初始坐标为(0,0,0)(0,0,0)时,P就是相对坐标系的坐标原点,结果也是类似的。

    说明

    为防止文章过长乏味,将此博客为上下两篇。通俗理解就上篇足够,下篇是对这篇例题的常规求解和线性代数解释。

    通俗理解齐次变换矩阵复合变换的时候变换顺序不可逆——上
    通俗理解齐次变换矩阵复合变换的时候变换顺序不可逆——下

    展开全文
  • 齐次坐标

    2016-06-23 10:30:14
    以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p’ = m1*p+ m2 (m1旋转缩放矩阵, m2为平移向量, p为原向量 ,p’为变换后的向量)。引入齐次坐标的目的主要是合并...

    仿射变换(Affine transformation)与python实践

    引进齐次坐标的好处?

    许多图形应用涉及到几何变换,主要包括平移、旋转、缩放、翻转。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p’ = m1*p+ m2 (m1旋转缩放矩阵, m2为平移向量, p为原向量 ,p’为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p’ = p*M的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。

    y⃗ m×1=Am×nx⃗ n×1+b⃗ m×1

    转换为齐次坐标的形式:

    [y⃗ 1](m+1)×1=[A0,,0b⃗ 1](m+1)×(n+1)[x⃗ 1](n+1)×1

    也即所有的: Ax+b 都可以转化为:

    Am×nxn×1+bm×1A(m+1)×(n+1)x(n+1)×1

    b 作为 A 的最后一列。


    这里写图片描述

    展开全文
  • 为什么要引入齐次坐标?什么是齐次坐标系?齐次坐标系的引入是为了将坐标的平移、旋转、缩放及透视投影等可表示为单一矩阵与向量相乘...如以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘......
  • 齐次坐标的作用

    2020-07-29 11:12:27
    以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为 x=R∗X+t(注:因为习惯的原因,实际使用时一般使用变化矩阵左乘向量)(R 旋转缩放矩阵,t 为平移矩阵,X为原向量,x ...
  • 引入齐次坐标的作用

    2019-01-13 23:53:15
    以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为 x=R∗X+t(注:因为习惯的原因,实际使用时一般使用变化矩阵左乘向量)(R 旋转缩放矩阵,t 为平移矩阵,X为原向量,...
  • http://blog.csdn.net/janestar/article/details/44244849齐次坐标在电脑图形内无处不在,因为该坐标允许平...与此相反,若使用笛卡儿坐标,平移及透视投影不能表示成矩阵相乘,虽然其他的运算可以。现在的OpenGL及...
  • 齐次坐标的含义

    2019-07-29 15:15:07
    在做旋转和缩放的时候,如果采用笛卡尔坐标的话,可以直接乘以旋转角度和缩放尺度就可以对图片进行处理,但是如果做平移变换的时候,笛卡尔坐标无法满足直接在坐标点做矩阵相乘运算,但是引入笛卡尔坐标的话就能够...
  • n元非齐次线性方程组: n元齐次线性方程组: 矩阵的定义 矩阵运算 矩阵加法 矩阵数乘 规则 矩阵与矩阵相乘 规则 由(iii)可知矩阵相乘满足分配律 特点 1.矩阵相乘的不可交换性: 2....
  • 3分钟理解齐次坐标系

    千次阅读 2018-11-24 11:14:20
    本文用于初学者学习齐次坐标系。博主也是通过这篇文章学习的,认为该文章通俗...齐次坐标在电脑图形内无处不在,因为该坐标允许平移、旋转、缩放及透视投影等可表示为矩阵与向量相乘的一般向量运算。依据链式法则...
  • 3D变换矩阵

    2015-12-04 13:46:44
    矩阵第四项为齐次坐标,方便几种变换的统一转换 以下任意矩阵可组合,只需及将矩阵相乘得到新的变换矩阵 平移矩阵 旋转矩阵 缩放矩阵
  • 唉。。。矩阵的逆搞了好几天都搞不明白,好不容易搞明白点了,poj...初次接触矩阵的童鞋 最好仔细研究一下矩阵相乘的过程 模拟一下结果。。。到时候能够自己构造矩阵,矩阵是一个很好的工具。 (一个菜鸟在装b) #
  • OpenGL ES中的变化矩阵

    2017-05-22 10:57:40
    列向量和矩阵相乘实现变换时,只能在列向量前面乘以矩阵,而行向量则反之,否则乘法没有意义。1、平移矩阵上述矩阵中的mx、my、mz分别表示平移变换中沿X、Y、Z轴方向的位移。通过简单的线性代数计算即可验证,矩阵M...
  • opengl 矩阵

    2013-10-31 12:16:46
    以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p' = p *m1+ m2(m1旋转缩放矩阵, m2为平移矩阵, p为原向量 ,p'为变换后的向量)。引入齐次坐标的目的主要是合并矩阵...
  • OpenGL学习三——矩阵堆栈

    千次阅读 2011-10-21 16:12:23
    在计算机图形学中,所有的变换都是通过矩阵相乘实现的,即物体定点构成的齐次坐标矩阵乘以三维变换矩阵就可得到变换后的物体齐次坐标矩阵。同样,在OpenGL中图远的坐标变换(移动、旋转、缩放)也是通过矩阵乘法实现...
  • unity shader 矩阵学习矩阵运算法则(1)矩阵和标量的乘法(2)矩阵和矩阵的乘法矩阵相乘的条件 和 结果的行数和列数变换的基本概念(1)变换(2)线性变换(3)平移变换(4)仿射变换(5)齐次坐标2D 矩阵变换(1)绕坐标...
  • 一般的机器人学教材中,首先介绍的是使用DH方法对机械臂进行正运动学建模,DH方法是对每个连杆给定4个参数,建立齐次矩阵相乘后即可得到机械臂末端的位置和姿态的表达式,另外一种建模方法是指数积公式,这种方法的...
  • 我看了很多书,和文章,可是还是不知道,四元数到底有什么用 好像她的好处就是为了能比矩阵,在相乘的时候,运算次数少 另外,一个包含旋转信息的四元数如何与一个向量运算得到我希望的结果?好像dx没有提供这样的...
  • 基本变换都是通过将表示点坐标的向量与特定的变换矩阵相乘完成的,进行基于矩阵的变换时,三维空间中点的位置需要表示成齐次坐标形式。 所谓齐次坐标形式也就是在x,y,z 3个坐标值后面增加第四个量w,未变换时w值一般...
  • 图形学上课的时候,????坐在第一排划拉瑟图 ,老师突然布置了个作业:推导mv变换的矩阵。常言道上山容易下山难之...然后把两个矩阵相乘,得到最终的变换矩阵 M,这个 M 矩阵左乘世界坐标系下的齐次坐标,能够帮助我们将
  • 我们都知道,要对非齐次方程求解,首先得对矩阵进行初等行变化,化成阶梯型矩阵,得到变量与值的关系求解。 而初等行变化,相当于左乘一个初等矩阵(单位矩阵进行相应的行变换)。 那么,问题来了。为什么对其进行...
  • 平面单应矩阵Homography介绍

    千次阅读 2017-11-19 11:23:03
    在计算机视觉中,平面的单应性被定义为一个平面到另外一个平面的投影映射。因此一个二维平面上的点映射到摄像...如果点Q到成像仪上的点q的映射使用齐次坐标,这种映射可以用矩阵相乘的方式表示。若有一下定义: 则
  • Opengl-变换&矩阵

    2018-11-05 21:50:23
    坐标系统向量向量与标量运算向量取反向量加减长度向量点乘叉乘矩阵的概念行向量和列向量矩阵加减法标量和矩阵乘法矩阵矩阵乘法矩阵与向量相乘单位矩阵缩放位移齐次坐标(Homogeneous Coordinates)旋转实践GLM把矩阵...
  • 单应矩阵Homography介绍

    2018-10-29 11:35:05
    在计算机视觉中,平面的单应性被定义为一个平面到另外一个平面的投影映射。...如果点Q到成像仪上的点q的映射使用齐次坐标,这种映射可以用矩阵相乘的方式表示。若有一下定义: 则可以将单应性简单的表示为: ...
  • A/B=A*inv(B)倒数相当于逆,可以不是同型矩阵,如齐次线性方程求解 A\B=inv(A)*B%左右除法不一样 乘方运算:A^B B为正整数时,表示A矩阵自乘B次; B为负整数时,可以先将A求逆矩阵,再自乘|B|次(仅对非奇异 ...

空空如也

空空如也

1 2 3 4 5
收藏数 95
精华内容 38
关键字:

齐次矩阵相乘