矢量运算:矢量运算介绍

如果不好好学那么下回我介绍个3D Engine时候你就麻烦大了.

质量保证:
只讨论可以任意平移自由矢量
以下原理适于你个人开发3D系统,D3D系统,OpenGL系统

.两点距离
2D系统:
Po1(x1,y1),Po2(x2,y2)
距离D=sqr( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) )
3D系统:
Po 1 (x1, y1, z1) Po 2 at (x2, y2, z2).

xd = x2-x1
yd = y2-y1
zd = z2-z1
距离Distance = SquareRoot(xd*xd + yd*yd + zd*zd)

做游戏和demo永远不要去做开方:
1.用LUT查表技术(Look up Table )
2.在做碰撞检测时,误差Distance*Distance<a certain number就可以认为点相撞了

2规格化,单位化(Normalize)
先要说矢量长度:
矢量Vector(x,y,z)
矢量长度Length(Vector)= |Vector|=sqr(x*x+y*y+z*z)
Normalize后:
(x/Length(Vector),y/Length(Vector),z/Length(Vector))
方向不变,长度为1个单位


3.点乘 点积 数量积(Dot Product)
回事儿.首先明确两个矢量点积是个标量.
中学物理力做功就是矢量点积例子:W=|F|.|S|.cos(theta)

2矢量点积:
Vector1:(x1,y1,z1) Vector2(x2,y2,z2)
DotProduct=x1*x2+y1*y2+z1*z2

很重要应用:
1.求 2矢量余弦:
由我们最熟悉力做功:
cos(theta)=F.S/(|F|.|S|)
可以判断 2矢量方向情况: cos=1同向,cos=-1相反,cos=0直角
曲面消隐(Cull face)时判断物体表面是否可见:(法线和视线矢量方向问题)cos>0不可见,cos<0可见
OpenGL就是这么做

2.Lambert定理求光照强度也用点积:
Light=K.I.cos(theta)
K,I为常数,theta是平面法线和入射光线夹角
老王头Fast Bump(Add Hyper Link here)也就是依据这个数学模型.但是他用了个很CheapHack来模拟cosine

4.叉乘(Cross product)
叉乘:Vector1(x1,y1,z1),Vector2(x2,y2,z2):
其结果是个矢量.
方向是Vector1,Vector2构成平面法线.再使用右手定则
长度是Length(Vector1)*Length(Vector2)*sin(theta)
theta是Vector1 & Vector2夹角.
所以,平行矢量叉乘结果为0矢量(长为0,方向任意)
计算结果矢量:(ox,oy,oz)
ox = (y1 * z2) - (y2 * z1)
oy = (z1 * x2) - (z2 * x1)
oz = (x1 * y2) - (x2 * y1)
用途:计算法向量这是生成3D图形很关键

学会了?好样!你又重新达到了大学年级水平~~~~~~~~~~~~
Tags:  矢量素材 矢量图 矢量运算公式 矢量运算

延伸阅读

最新评论

发表评论