赞
踩
紧接上一篇:http://blog.csdn.net/yinhun2012/article/details/79415781
上一篇讲了向量的加减分配等计算,那么紧接着就是应该来讲乘除了吧,我们知道普通数值都有加减乘除开方等等计算,比如:
10x10 = 100
10÷10 = 1
那么向量AxB = ? A÷B = ?
我们知道向量其实是多个数值分量组成的一个集合,那么向量相乘又怎么处理呢?是分量相乘再相加,还是分量相加再相乘?
然后就算给一个向量相乘的规范,那有什么意义呢?能解决什么实际问题?
这里我们从物理上来考虑向量相乘的问题:
这里不得不提一个做功的概念,物理上,我们求力F使物体位移S所做的功W
ps:物理上为什么做功的概念是w = f*s*cosθ,其实是有一个积分推导过程的,百度词条上有推导过程,这里我们暂时不做讨论,等我们图形学所需的数学知识完善后,再去讨论一些后面的物理意义。
这里做功的计算结果,数学上我们称为向量的内积(点积),从第二幅图可以认为向量A和B的内积,等于A在B上的投影长度标量乘B的长度标量。
当然这和计算机图形学有什么关系呢?我们这里又不是学计算机物理引擎,这里我们观察下:
看第一个公式w = Fx*Sx+Fy*Sy,咋一看就是两个平面向量A(Fx,Fy)和B(Sx,Sy)的分量的乘积的和,这个结果和第二个公式W = F*S*cosθ有什么关系呢?如下图:
上面我们通过余弦定理推出A(Xa,Ya),B(Xb,Yb)的点积可以换算成标量的处理,即:
W = |A|*|B|*cosθ = Xa*Xb+Ya*Yb
上面我们就把向量的点积转换成标量的处理了。
既然我们已经推导了平面二维向量的点积,那么接下来推导三维向量的点积。
向量A(Xa,Ya,Za),B(Xb,Yb,Zb)的点积
可以推出:A(Xa,Ya,Za)·B(Xb,Yb,Zb) = Xa*Xb + Ya*Yb + Za*Zb。
接下来程序验证一下:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class DotMathFunc : MonoBehaviour {
-
- public Transform aHead;
- public Transform aTail;
- public Transform bHead;
- public Transform bTail;
-
- void Start () {
- Vector3 A = aTail.position - aHead.position;
- Vector3 B = bTail.position - bHead.position;
- //用推导公式计算
- float dotAB = A.x * B.x + A.y * B.y + A.z * B.z;
-
- //用api计算
- float apidotAB = Vector3.Dot(A, B);
- #if UNITY_EDITOR
- Debug.LogFormat("dotAB = {0} apidotAB = {1}", dotAB, apidotAB);
- #endif
- }
-
-
- }
以上就是向量点积的理解推导过程
点积呢,在图形学中具体的应用,判断向量夹角,如果点击为0就是垂直角,为正数就是锐角,为负数就是钝角,这应该很好理解,通过A到B的投影A'就能得出
第二就是换算反射reflect函数,在光线反射中会起到很大作用,后面我们会讲
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。