向量在HTML5游戏开发中的应用

**CSS/位图的屏幕坐标系统,即左上角为原点、x轴沿右侧增加、y轴沿下方增加(亦称做笛卡尔坐标系)

向量运算 

 把一些有用的运算应用于向量

加法和减法

通过加减向量的x、y坐标来实现向量的相加或相减。一个向量和自己相加可以使它的长度扩大两倍,一个向量减掉它自己会得到零向量。

  如:1.给飞行的皮球加一个重力向量,让它真实地下落

         2.把两个碰撞物体的向量加在一起,计算逼真的碰撞反馈

         3.给宇宙飞创增加一个火箭推理的向量,让飞船移动

缩放

按照一定比例缩放向量x、y坐标,就可以缩小或放大向量的长度。一些实例如下:

- 反复以略小于1的向量缩放移动向量,让对应物体缓慢地停下来

- 将大炮方向向量扩大,作为一个发射炮弹的初始向量

标准化

有时候需将一个向量变为单位长度,或者说将向量长度变为一个单位。这个过程叫做标准化,单位长度的向量叫做单位向量。当感兴趣的是响亮的方向而不是长度时。单位向量可以表示为:

1.定向喷射的方向

2.斜坡的倾斜方向

3.大炮的发射方向

一旦有了单位向量,可以作为其缩放,使其代表喷射推理或者炮弹的初始化速度

旋转

以任意角度来旋转一个向量非常有用,因为这样可以指向任何一个你想要的方向。实例包括:

1.是一个对象始终指向另一个

2.更改一个虚拟的喷射引擎的推理方向

3.根据发射器的方向改变投射体的初始发射方向

在JavaScript中,角是以弧度(radius)为单位,而不是熟悉的角度(degree)指向的。因为弧度不是很直观,可以利用JavaScript中的函数很容易将弧度和角度进行转化。

//角度转为弧度

degToRad = function(deg){

   return deg*(Math.PI/180);

}

//弧度转为角度

radToDeg = function(rad){

    return rad*(Math.PI/180);

}

向量的点乘

单位向量的点乘给出两个向量之间角度的余弦,或者说单位向量点乘告诉我们两个向量的方向相近程度。点乘的结果在-1到1之间变化。这是一个些特殊点乘含义的例子:

1.向量的方向相同:点积=1

2.向量的夹角为45°:点积=0.5

3.向量的夹角90°:点积=0

4.向量的夹角为180°:点积=-1

点乘可以知道连个物体面向对方的程度。比如:游戏中,可以根据点乘判断两个角色是否可以“看到”对方,或者某形状的某一边是否指向某个方向

创建一个JavaScript向量对象

向量的x和y分量在对象中被称做为vx和vy。

    var vector2d = function(x,y){
        /*向量部分代码*/
        var vec = {
            //把x、y保存在对象vx、vy中
            vx:x,
            vy:y,

            //scale方法可以让我们来放大或缩小向量
            scale:function(scale){
                vec.vx *= scale;
                vec.vy *= scale;
            },
            //向量的加法运算
            add:function(vec2){
                vec.vx += vec.vx;
                vec.vy += vec.vy;
            },
            //向量的减法运算
            sub:function(vec2){
                vec.vx -= vec2.vx;
                vec.vy -= vec2.vy;
            },
            //方向取反
            negate:function(){
                vec.vx = -vec.vx;
                vec.vy = -vec.vy;
            },
            //获取向量长度
            length:function(){
                return Math.sqrt(vec.vx*vec.vx+vec.vy*vec.vy);
            },
            //获取向量长度的平方
            lengthSquared:function(){
                return vec.vx*vec.vx+vec.vy*vec.vy;
            },
            //将向量转化为一个单位向量
            normalize:function(){
                var len = Math.sqrt(vec.vx*vec.vx+vec.vy*vec.vy);
                if(len){
                    vec.vx /= len;
                    vec.vy /= len;
                }
                //把向量的长度返回
                return len;
            },
            //向量的旋转
            rotate:function(angle){
                var vx = vec.vx,
                        vy=vec.vy,
                        cosVal =Math.cos(angle),
                        sinVal =Math.sin(angle);
                vec.vx= vx*cosVal-vy*sinVal;
                vec.vy= vx*sinVal-vy*cosVal;
            },
            //toString方法可以把向量以文本方式输出,方便程序调用
            toString:function(){
                return '('+vec.vx.toFixed(3)+','+vec.vy.toFixed(3)+')'
            }
        };
        return vec;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值