JavaScript phsyics в 2-м пространстве

Так, я работаю над обучением мне Холст (HTML5) и имею большую часть простого игрового механизма, кодированного. Это - 2-е представление сцены пространства (планеты, звезды, небесные тела, и т.д.). Мой класс "Sprite" по умолчанию имеет слушателя кадра как такой:

"базовый класс" содержит функцию, которая позволяет наследование и применяет "a" к "this.a". Так, "var aTest = новый Sprite ({нечто: 'панель'})"; сделал бы "aTest.foo = 'панель'". Это - то, как я выставляю свои объекты друг другу.

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).

  }
});

Заранее спасибо. Реальный прием - то, что одна строка и btw, я знаю это, не имеют никакого смысла вообще. Градусы + расстояние = отказ.

this.a.angle = angletosun+(75+(distance*-1)/5);

Это - больше вопрос о физике, чем JavaScript, но я искал и искал и считал путь ко многим статьям Wiki об орбитальной математике. Это преобладает над моей головой очень быстро.

6
задан user330123 1 May 2010 в 00:55
поделиться

1 ответ

О, это возвращает меня в воспоминания, играть с физическими симуляторами так весело.

В любом случае, похоже, вам нужно подтянуть векторную математику, это, вероятно, самый важный вопрос. Эта статья должна содержать все, что вам нужно знать о векторной математике, хотя я не уверен, что это самый простой доступный источник. http://en.wikipedia.org/wiki/Euclidean_vector

Ваш код кажется немного слишком объектно-ориентированным, конечно, это вопрос предпочтений, но я бы придерживался чистых объектов данных и держал логику в отдельных функциях.

И вот немного математики для начала, каждый объект должен иметь положение как вектор, скорость как вектор и массу.

Для каждого тика вы делаете две вещи, для каждого объекта вы добавляете скорость к позиции:

p=p+v

И для каждого объекта относительно каждого другого объекта вы изменяете скорость в соответствии с рассчитанным гравитационным притяжением. Скорость объекта B будет изменяться следующим образом из-за гравитационного колодца A:

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

Как только вы разберетесь с векторной математикой, вы сможете перевести это в реальный код.

3
ответ дан 17 December 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: