Вопросы по Mesh
Участников: 3
Страница 1 из 1
Вопросы по Mesh
Кто нибудь работал с Мешами в Point JS? Что-то у меня ничего приличного не выходит. Вот например у меня есть массив:
Далее мне нужно сделать из него 2 меши:
все хорошо. но если я пытаюсь установить их в нужные мне позиции
или
то первая меш становится в нужную позицию, а вторая улетает черти-куда. я подозреваю, что относительно первой меши, а не относительно нуля. но я же специально передавал объекты по значению, а не по ссылке, чтобы избежать этого! так почему одна меш цепляет другую?
и еще вопрос: я вызываю функцию поворота меши:
всё ок. меш повернулась. но если я вызываю потом функцию движения
меш сдвигается, но обратно становится в свой первоначальный угол наклона. почему так? причем если вывести в консоль current_mesh.angle, то там отображается адекватное значение угла. есть советiк?
- Код:
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к?
Re: Вопросы по Mesh
Обычно там где есть меши, там есть и матрицы. В pointjs есть матрицы преобразования?
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы по Mesh
Очень правильно подметил. Каждая вершина объекта в 3d рассчитывается относительно самой себе. Т.е. каждый объект сам для себя начало координат. Иначе никак. Такая механика.пиро пишет:то первая меш становится в нужную позицию, а вторая улетает черти-куда. я подозреваю, что относительно первой меши, а не относительно нуля. но я же специально передавал объекты по значению, а не по ссылке, чтобы избежать этого! так почему одна меш цепляет другую?
Чтобы объекты существовали друг с другом в одной вселенной используются матрицы преобразования, которые условно говорят, где тут начало координат и рассчитывают объект типа от начала. Сливая меши, ты сливаешь их матрицы. И наоборот. Второй объект скорее всего рассчитывается по матрице первого. Хз, яж не видел.
Я хз зачем сканер делал меши для 2d. Видимо был какой- план капкан. Если матриц нет, то тебе нужно самому найти формулу, которая преобразовывает неправильную ротацию, скейл и позицию в правильные. И делать это в методах объекта.
Формула будет зависеть от первого объекта. Т.е. от позиции второго объекта нужно отнимать позицию первого объекта, чтобы узнать где начало координат. Т.о. ты передвинешь объект правильно.
Это довольно муторная фигня. Надеюсь кто поопытнее подскажет что там с матрицами в поинте.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы по Mesh
ну я подозреваю, что начало координат берется от начала экранных координат, а не от начала координат какого-то другого меша, потому как
идентично
иначе вообще зачем это всё?
- Код:
current_mesh = game.newMesh({
add: current_shape
});
идентично
- Код:
current_mesh = game.newMesh({
x: 0,
y: 0,
add: current_shape
});
иначе вообще зачем это всё?
на самом деле много для чего можно было бы их использовать. например у тебя персонаж - меш, а рука с оружием, туловище и ноги - отдельные браши. так было бы (забыл слово) ну типа проще там санимировать, оружие поменять или что-то типа тогоЯ хз зачем сканер делал меши для 2d.
Re: Вопросы по Mesh
Тут говорится про второй объект, который движется неправильно. Понятно, что есть ноль вычесть, нихера не изменится.раинго пишет:Формула будет зависеть от первого объекта. Т.е. от позиции второго объекта нужно отнимать позицию первого объекта, чтобы узнать где начало координат. Т.о. ты передвинешь объект правильно.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы по Mesh
Позиция первого объекта: x: 100.
Позиция второго объекта: х: 40.
Но второй объект рассчитывается так, будто начало координат в точке x:100. Его реально положение получается: х: 140. Чтобы узнать правильное положение, тебе нужно от "x" второго объекта вычесть "x" первого.
X = x2 - x1 = 100- 40 = -60.
-60 и будет верная координата. Матрицы по сути и занимаются вот такими преобразованиями. Если матриц нет - это делается вручную.
Позиция второго объекта: х: 40.
Но второй объект рассчитывается так, будто начало координат в точке x:100. Его реально положение получается: х: 140. Чтобы узнать правильное положение, тебе нужно от "x" второго объекта вычесть "x" первого.
X = x2 - x1 = 100- 40 = -60.
-60 и будет верная координата. Матрицы по сути и занимаются вот такими преобразованиями. Если матриц нет - это делается вручную.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы по Mesh
второй объект рассчитывается так, будто начало координат в точке x:100
но какого хрена? при чем тут первый объект вообще? откуда эта ересь взялась? нахера второй объект установил свой ноль в ноль первого?
Re: Вопросы по Mesh
Я там расписал свою теорию, читай внимательно, гугли инфу про матрицы и меши. Это стандартная практика при создании архитектуры движка.
Вот оказывается где лежит api.
Попробуй при создании второго меша вставить туда x, y, angle первого объекта. Может поможет.
Вот оказывается где лежит api.
Попробуй при создании второго меша вставить туда x, y, angle первого объекта. Может поможет.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы по Mesh
А не, вряд ли поможет. x, y и angle это простые числа, они по ссылке не передаются.
raingo- Отдел прокрастинации
- Сообщения : 756
Дата регистрации : 2017-12-25
Re: Вопросы по Mesh
Может я не понял вопрос,но с Mesh мы ещё год назад выясняли и правили движок. Сканер специально переделывал функционал, потому что у меня Mesh отрабатывал с миганием анимации, тогда он выпустил версию 0,1,0 уже исправленную.
А делал я вот так:
100% я где-то пропустил скобки, где-то скопировал не всё что надо, где-то наоборот лишнее, но смысл ты уловишь. Главное написать, что именно идёт в mesh, задать координаты и потом играться с visibility = true или false.
А делал я вот так:
- Спойлер:
- Код:
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- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Re: Вопросы по Mesh
да, но у тебя здесь совсем другая система. ты добавил кучу анимаций в меш и по необходимости делаешь их то видимыми, то невидимыми. у меня два меша. они оба всегда видимые. мне их нужно двигать и вращать. проблема в том, что ВНЕЗАПНО один меш цепляет координаты другого и в итоге движение и вращение происходит не относительно цетров мешей, а относительно вообще левой точки.
ну да фиг с ним. я уже по другому сделал - без мешей
ну да фиг с ним. я уже по другому сделал - без мешей
Re: Вопросы по Mesh
У меня тоже было 3 меша и я так же вписывал им свойства visible при необходимости и координаты так же как я и привёл в примере кода. Всё идентично и у меня всё работало. Другое дело - может так никто не делает и есть другие методы для этого, но у меня вроде как работало нормально.
Dessan- Юный падаван
- Сообщения : 426
Дата регистрации : 2017-12-25
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения