zoukankan      html  css  js  c++  java
  • 矢量运算

           Point1(x1, y1, z1),Point2(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就可以认为点相撞了
     
    二. 规格化,单位化(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个单位
     
    三. 点乘、点积、数量积
           首先明确两个矢量的点积是个标量,中学物理的力做功就是矢量点积的例子:W=|F|.|S|.cos(theta)
    二矢量点积:
           Vector1(x1,y1,z1)  Vector2(x2,y2,z2)
           DotProduct=x1*x2+y1*y2+z1*z2
    很重要的应用:求二矢量余弦,由我们最熟悉的力做功:
           cos(theta)=F.S/(|F|.|S|)
           可以判断二矢量的方向情况:cos=1同向,cos=-1相反,cos=0直角
    曲面消隐(Cull face)时判断物体表面是否可见法线和视线矢量的方向问题:cos>0不可见,cos<0可见
    OpenGL就是这么做的。
    Lambert定理求光照强度也用点积:
    Light=K.I.cos(theta)
    K,I为常数,theta是平面法线与入射光线夹角
    老王头的Fast Bump(Add Hyper Link here)也就是依据这个数学模型.但是他用了个很Cheap的Hack来模拟cosine
     
    四. 叉乘(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图形的很关键一步。

  • 相关阅读:
    数据库创建标量值函数
    大并发大数据量请求的处理方法
    模态对话框 bootstrap-modal.js
    创建测试表,批量插入数据的存储过程,分页存储过程
    android:强大的图片下载和缓存库Picasso
    压缩图片链接
    Css3:transform变形
    css中 padding属性的数值赋予顺序为
    Css3颜色值RGBA得表示方式
    css3 box-shadow让我们实现图层阴影效果
  • 原文地址:https://www.cnblogs.com/dolphin-gjh/p/3521049.html
Copyright © 2011-2022 走看看