二维空间中的Javascript phsyic

二维空间中的Javascript phsyic,javascript,canvas,physics,Javascript,Canvas,Physics,所以,我正在自学Canvas(HTML5),并编写了大部分简单的游戏引擎。它是空间场景(行星、恒星、天体等)的二维表示。我的默认“Sprite”类有一个帧侦听器,如下所示: “基类”包含一个允许继承的函数,并将“a”应用于“this.a”。所以,“var-aTest=new-Sprite({foo:'bar'});”将使“aTest.foo='bar'”。这就是我如何将对象彼此公开的方式 Sprite = baseClass.extend({ init: function(a){ b

所以,我正在自学Canvas(HTML5),并编写了大部分简单的游戏引擎。它是空间场景(行星、恒星、天体等)的二维表示。我的默认“Sprite”类有一个帧侦听器,如下所示:

“基类”包含一个允许继承的函数,并将“a”应用于“this.a”。所以,“var-aTest=new-Sprite({foo:'bar'});”将使“aTest.foo='bar'”。这就是我如何将对象彼此公开的方式

Sprite = baseClass.extend({
  init: function(a){
    baseClass.init(this, a);
    this.fields = new Array(); // list of fields of gravity one is in. Not sure if this is a good idea.
    this.addFL(function(tick){ // this will change to be independent of framerate soon.

      // gobjs is an array of all the Sprite objects in the "world".
      for(i = 0; i < gobjs.length; i++){

        // Make sure its got setup correctly, make sure it -wants- gravity, and make sure it's not -this- sprite.
        if(typeof(gobjs[i].a) != undefined && !gobjs[i].a.ignoreGravity && gobjs[i].id != this.id){
          // Check if it's within a certain range (obviously, gravity doesn't work this way... But I plan on having a large "space" area,
          // And I can't very well have all objects accounted for at all times, can I?
          if(this.distanceTo(gobjs[i]) < this.a.size*10 && gobjs[i].fields.indexOf(this.id) == -1){
            gobjs[i].fields.push(this.id);
          }
        }
      }
      for(i = 0; i < this.fields.length; i++){
        distance = this.distanceTo(gobjs[this.fields[i]]); 

        angletosun = this.angleTo(gobjs[this.fields[i]])*(180/Math.PI); // .angleTo works very well, returning the angle in radians, which I convert to degrees here.

        // I have no idea what should happen here, although through trial and error (and attempting to read Maths papers on gravity (eeeeek!)), this sort of mimics gravity.
        // angle is its orientation, currently I assign a constant velocity to one of my objects, and leave the other static (it ignores gravity, but still emits it).
        // This cant be right, because it just _sets_ the angle regardless of whatever it was.
        // This is where we need to find "the average of the forces".
        this.a.angle = angletosun+(75+(distance*-1)/5); //todo: omg learn math

        if(this.distanceTo(gobjs[this.fields[i]]) > gobjs[this.fields[i]].a.size*10){
          this.fields.splice(i); // out of range, stop effecting.
        }
      }
    });

    //draw objects based on new position (from fixed velocity and angle).

  }
});

这更像是一个物理问题而不是Javascript,但我已经搜索了很多关于轨道数学的维基文章。这让我很快就忘记了。

哦,这让我走上了记忆的道路,玩物理模拟非常有趣

在任何情况下,听起来你需要完善你的向量数学,这可能是最重要的问题,这篇文章应该包含你需要了解的关于向量数学的一切,尽管我不确定这是否是最容易获得的来源

您的代码似乎有点过于面向对象,当然这在很大程度上取决于您的偏好,但我会坚持使用纯数据对象,并将逻辑保留在单独的函数中

这里有一个小的物理数学让你们开始,每个物体应该有一个位置作为向量,一个速度作为向量,还有质量

对于每个勾号,您要做两件事,对于每个对象,您要将速度添加到位置:

p=p+v
对于每一个物体,相对于每一个其他物体,你根据计算出的引力改变速度。由于A的重力井,B的速度也会这样变化:

B.v=B.v+(A.p-B.p)*(A.m/(|A.p-B.p|^3))

一旦你破解了向量数学,你应该能够将其转化为真实的代码。

问题是什么?我知道它在密码里。但你应该在别的地方明确地说出来,我有一个物体,速度固定,指向0度。它受到另一个物体的引力影响,比如说,正好100个单位外的90度角。我如何计算朝向上述物体的矢量,以及b)求出朝向不同物体的任意数量的不同矢量的总和(或平均值?),最终我可以创造一颗恒星和一颗行星,并以非常仔细选择的起始速度和角度,创造出一个工作(循环)轨道。如果操作正确,“非重力发射”对象将很容易制造(因此,彗星和微型宇宙飞船),并且能够产生推力并落入“重力场”。我不太理解如何用javascript构建向量,尽管我看到有一些库。所以一个位置和速度向量。。。每个值在矩阵中的哪个位置?[posX,posY,speed]?我已经读过那个wiki页面,我正在看Javascript中的向量数学,但在如何使用向量表示速度方面,我有些脱节。谢谢你,顺便说一句。。。我将试着解码你的帖子一段时间,我想:好吧,我想我现在明白了。什么是上午?A的弥撒?这不是矢量,是吗?如果没有,我怎么把一个向量加到一个普通数上(或者这是一个愚蠢的问题)还有,你怎么做向量除法?好的,我想我已经把它全部记下来了,保存向量除法。我应该做什么操作?没有向量除法的定义,但是你可以用一个数字来除法一个向量|A |(在维基百科上写为| | A | | |)是向量A的长度,所以显然| A.p-B.p |是一个数字。我很高兴听到你需要使用你的思想者,如果我给你所有的答案,那就不好玩了,是吗?
B.v=B.v+(A.p-B.p)*(A.m/(|A.p-B.p|^3))