Вопросы по Mesh

Начать новую тему   Ответить на тему

Перейти вниз

Вопросы по Mesh

Сообщение автор Pyro338 в Пн Янв 15, 2018 1:19 pm

Кто нибудь работал с Мешами в Point JS? Что-то у меня ничего приличного не выходит. Вот например у меня есть массив:

Код:
OOP.forArr(shapes[shape_id], function (string, y) {
    OOP.forArr(string, function (cell, x) {
      if (x > 0 && y > 0) {
        if (cell == '1') {
          let block = game.newRectObject({
            x          : x * blocksize - blocksize,
            y          : y * blocksize - blocksize,
            w          : blocksize,
            h          : blocksize,
            fillColor  : colors[shape_id],
            strokeColor: '#000',
            strokeWidth: 1,
          });
          generated_shape.push(block);
        }
      }
    });
  });

Далее мне нужно сделать из него 2 меши:

Код:

for (var key in generated_shape) {
    next_shape[key] = generated_shape[key];
  }
  next_mesh = game.newMesh({
    add: next_shape
  });

/**/

for (var key in generated_shape) {
      current_shape[key] = generated_shape[key];
    }
current_mesh = game.newMesh({
    add: current_shape
  });

все хорошо. но если я пытаюсь установить их в нужные мне позиции

Код:
current_mesh.move(point(center_offset, 0));
  next_mesh.move(point(margin_left_small, 0));

или

Код:
current_mesh.setPosition(point(center_offset, 0));
  next_mesh.setPosition(point(margin_left_small, 0));

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

и еще вопрос: я вызываю функцию поворота меши:

Код:
function rotate() {
  current_mesh.turn(90);
}

всё ок. меш повернулась. но если я вызываю потом функцию движения

Код:
function moveDown() {
  current_mesh.move(point(0, blocksize));
}

меш сдвигается, но обратно становится в свой первоначальный угол наклона. почему так? причем если вывести в консоль current_mesh.angle, то там отображается адекватное значение угла. есть советiк?
avatar
Pyro338
Админ

Сообщения : 587
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор raingo в Пн Янв 15, 2018 2:50 pm

Обычно там где есть меши, там есть и матрицы. В pointjs есть матрицы преобразования?

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор Pyro338 в Пн Янв 15, 2018 2:51 pm

не припомню, чтобы где-то на них натыкался в АПИ или уроках или на форуме
avatar
Pyro338
Админ

Сообщения : 587
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор raingo в Пн Янв 15, 2018 3:00 pm

пиро пишет:то первая меш становится в нужную позицию, а вторая улетает черти-куда. я подозреваю, что относительно первой меши, а не относительно нуля. но я же специально передавал объекты по значению, а не по ссылке, чтобы избежать этого! так почему одна меш цепляет другую?
Очень правильно подметил. Каждая вершина объекта в 3d рассчитывается относительно самой себе. Т.е. каждый объект сам для себя начало координат. Иначе никак. Такая механика.

Чтобы объекты существовали друг с другом в одной вселенной используются матрицы преобразования, которые условно говорят, где тут начало координат и рассчитывают объект типа от начала. Сливая меши, ты сливаешь их матрицы. И наоборот. Второй объект скорее всего рассчитывается по матрице первого. Хз, яж не видел.

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

Формула будет зависеть от первого объекта. Т.е. от позиции второго объекта нужно отнимать позицию первого объекта, чтобы узнать где начало координат. Т.о. ты передвинешь объект правильно.

Это довольно муторная фигня. Надеюсь кто поопытнее подскажет что там с матрицами в поинте.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор Pyro338 в Пн Янв 15, 2018 3:05 pm

ну я подозреваю, что начало координат берется от начала экранных координат, а не от начала координат какого-то другого меша, потому как

Код:
current_mesh = game.newMesh({
    add: current_shape
  });

идентично

Код:
current_mesh = game.newMesh({
x: 0,
y: 0,
    add: current_shape
  });

иначе вообще зачем это всё?

Я хз зачем сканер делал меши для 2d.
на самом деле много для чего можно было бы их использовать. например у тебя персонаж - меш, а рука с оружием, туловище и ноги - отдельные браши. так было бы (забыл слово) ну типа проще там санимировать, оружие поменять или что-то типа того
avatar
Pyro338
Админ

Сообщения : 587
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор raingo в Пн Янв 15, 2018 3:30 pm

раинго пишет:Формула будет зависеть от первого объекта. Т.е. от позиции второго объекта нужно отнимать позицию первого объекта, чтобы узнать где начало координат. Т.о. ты передвинешь объект правильно.
Тут говорится про второй объект, который движется неправильно. Понятно, что есть ноль вычесть, нихера не изменится.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор raingo в Пн Янв 15, 2018 3:34 pm

Позиция первого объекта: x: 100.
Позиция второго объекта: х: 40.

Но второй объект рассчитывается так, будто начало координат в точке x:100. Его реально положение получается: х: 140. Чтобы узнать правильное положение, тебе нужно от "x" второго объекта вычесть "x" первого.

X = x2 - x1 = 100- 40 = -60.

-60 и будет верная координата. Матрицы по сути и занимаются вот такими преобразованиями. Если матриц нет - это делается вручную.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор Pyro338 в Пн Янв 15, 2018 3:36 pm

второй объект рассчитывается так, будто начало координат в точке x:100

но какого хрена? при чем тут первый объект вообще? откуда эта ересь взялась? нахера второй объект установил свой ноль в ноль первого?
avatar
Pyro338
Админ

Сообщения : 587
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор raingo в Пн Янв 15, 2018 3:42 pm

Я там расписал свою теорию, читай внимательно, гугли инфу про матрицы и меши. Это стандартная практика при создании архитектуры движка.

Вот оказывается где лежит api.

Попробуй при создании второго меша вставить туда x, y, angle первого объекта. Может поможет.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор raingo в Пн Янв 15, 2018 3:48 pm

А не, вряд ли поможет. x, y и angle это простые числа, они по ссылке не передаются.

raingo
Отдел прокрастинации

Сообщения : 755
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор Pyro338 в Пн Янв 15, 2018 3:54 pm

ладно. спасибо.
avatar
Pyro338
Админ

Сообщения : 587
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор Dessan в Чт Фев 08, 2018 6:25 am

Может я не понял вопрос,но с Mesh мы ещё год назад выясняли и правили движок. Сканер специально переделывал функционал, потому что у меня Mesh отрабатывал с миганием анимации, тогда он выпустил версию 0,1,0 уже исправленную.
А делал я вот так:
Спойлер:
Код:
var kenTile = pjs.tiles.newImage("ken.png");
var kenAnim = {
   ken : kenTile.getAnimation(0,77,66,84,4), // walk
   kenfist : kenTile.getAnimation(0,160,70,80,3), // fist hit
   kenDDD : kenTile.getAnimation(0,240,70,80,5),
   kenjump : kenTile.getAnimation(0,640,70,81,7),
   kensit : kenTile.getAnimation(0,719,70,81,0),
   kenleg : kenTile.getAnimation(0,560,70,80,5),
   magic : kenTile.getAnimation(0,337,60,30,2)
};

var kenleg = game.newAnimationObject({
   animation : kenAnim.kenleg,
   delay: 5,
   x:width/2-500, y: 0,
    h: 80, w: 90,
   visible : true
   //userData: {life : 1}
});
var ken = game.newAnimationObject({
   animation : kenAnim.ken,
   delay: 25,
   x:width/2-500, y: 0,
    h: 80, w: 90,
userData : { dy : 0, visible : true },

});
// ken.y = gr1.y-ken.h/3;
var kenfist = game.newAnimationObject({
   animation : kenAnim.kenfist,
   delay: 10,
   x:width/2-500, y: 0,
    h: 80, w: 90,
   visible : false,
   userData : { dy : 0 }
});

var kensit = game.newAnimationObject({
   animation : kenAnim.kensit,
   delay: 10,
   x:width/2-500, y: 0,
    h: 80, w: 90,
   visible : false
});
var kenjump = game.newAnimationObject({
   animation : kenAnim.kenjump,
   delay: 12,
   x:width/2-500, y : 0,
    h: 80, w: 90,
   visible : false,
   userData : { dy : 0 }
});
var kenDDD = game.newAnimationObject({
   animation : kenAnim.kenDDD,
   delay: 10,
   x:width/2-500, y: 0,
    h: 80, w: 90,
   visible : false
});
/////////////////////  MESH
var fight = game.newMesh({
   add : [kenfist, ken,  kensit, kenjump, kenDDD, ken1],
   x:width/2-500, y : 0,
   userData : { dy : 0 }
});
//////////////////////////////////////////

var speed = 2;
var speed1 = 2;

game.newLoop('game', function (){
   game.fill("#d9d9d9"); //grey back

var move = function () {
ken.setVisible(true);
////////////////////////////Удар ногой
if (key.isPress('Z')){
ken.frame = 0;
 ken.setAnimation(kenAnim.kenleg);
    }
if (ken.frame == 4){
   ken.frame = 0;
    ken.setAnimation(kenAnim.ken);
 }
//////////////////////////////////////////

if (key.isDown('LEFT')){
   
      kenDDD.setVisible(true);
      ken.setVisible(false);

      kenDDD.setFlip (1,0);
        ken.setFlip (1,0);
       kenjump.setFlip (1,0);
       kensit.setFlip (1,0);
       kenfist.setFlip (1,0);
       ken1.setFlip (1,0);
       kenleg.setFlip (1,0);
     
      fight.move(point(-speed,0));

  }else{

          kenDDD.setVisible(false);

  }

if (key.isDown('RIGHT')){
ken.setVisible(false);
      kenDDD.setVisible(true);

      kenDDD.setFlip (0,0);
      ken.setFlip (0,0);
      kenjump.setFlip (0,0);
      kensit.setFlip (0,0);
      kenfist.setFlip (0,0);
      ken1.setFlip (0,0);
        kenleg.setFlip (0,0);
      
fight.move(point(speed,0));
}

if (key.isDown('DOWN')){

kenDDD.setVisible(false);
kenjump.setVisible(false);
      kensit.setVisible(true);
        ken.setVisible(false);

      
     }else{


        kensit.setVisible(false);

     }

 } // move function

move();
    ken.move(point(ken.dx,ken.dy));
   fight.move(point(fight.dx, fight.dy));

ken.draw();             
     kenfist.draw();
   kensit.draw();
   kenjump.draw();
    fight.draw();

game.startLoop('game');

100% я где-то пропустил скобки, где-то скопировал не всё что надо, где-то наоборот лишнее, но смысл ты уловишь. Главное написать, что именно идёт в mesh, задать координаты и потом играться с visibility = true или false.

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор Pyro338 в Чт Фев 08, 2018 9:18 am

да, но у тебя здесь совсем другая система. ты добавил кучу анимаций в меш и по необходимости делаешь их то видимыми, то невидимыми. у меня два меша. они оба всегда видимые. мне их нужно двигать и вращать. проблема в том, что ВНЕЗАПНО один меш цепляет координаты другого и в итоге движение и вращение происходит не относительно цетров мешей, а относительно вообще левой точки.

ну да фиг с ним. я уже по другому сделал - без мешей
avatar
Pyro338
Админ

Сообщения : 587
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор Dessan в Чт Фев 08, 2018 1:37 pm

У меня тоже было 3 меша и я так же вписывал им свойства visible при необходимости и координаты так же как я и привёл в примере кода. Всё идентично и у меня всё работало. Другое дело - может так никто не делает и есть другие методы для этого, но у меня вроде как работало нормально.

Dessan
Юный падаван

Сообщения : 424
Дата регистрации : 2017-12-25

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор Pyro338 в Чт Фев 08, 2018 1:40 pm

ну хз. уже нет желания к этому возвращаться
avatar
Pyro338
Админ

Сообщения : 587
Дата регистрации : 2017-12-25
Возраст : 32
Откуда : Ставрополь

Посмотреть профиль http://pyro338.ru/

Вернуться к началу Перейти вниз

Re: Вопросы по Mesh

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

Начать новую тему   Ответить на тему
 
Права доступа к этому форуму:
Вы можете отвечать на сообщения