У меня немного болит голова… Я использую jsbox2d.js для 2D-игры, основанной на графике SVG. Я хотел бы «подключить» b2d-тело к элементу svg, что уже работает для отладки, но не для графики в сцене.
настраивать:
есть SVG, включая произвольную глубоко вложенную структуру групп и фигур. У каждого из них есть некоторые преобразования, поэтому каждый элемент находится в своем собственном координатном пространстве.
в стороне есть симуляция box2d, и некоторые тела представляют собой элемент в svg.
Я хотел бы применить преобразование b2body к элементу svg, который он представляет, чтобы анимация выглядела правильно. Он уже работает для отладки, где я использую этот код:
// links is an array like [[b2body, svgelement],…]
for (var i = 0; i < links.length; i++) {
var t = links[i][0].GetTransform();
//tiny helper function just taking the values and
//setting it to the element
// transform(element, a,b,c,d,e,f)
//|a c e|
//|b d f|
svghelper.transform(links[i][1],
t.q.c, t.q.s, -t.q.s,
t.q.c, t.p.x, t.p.y);
}
Основное отличие состоит в том, что элементы, используемые для отладочной отрисовки, генерируются на лету, без каких-либо преобразований, с использованием мировых координат вершин b2dShapes.
Но графика для сцены взята из графики SVG, созданной с помощью inkscape и, т.е. используя группы для руки или головы персонажа.
Как я могу применить преобразование тела прямо к элементам? Я думаю, мне нужно изменить основу матрицы преобразования, но я почему-то не могу заставить ее работать.
Я пробовал это:
var t = body.GetTransform(),
mtr = svg,createSVGMatrix(
t.q.c, t.q.s, -t.q.s,
t.q.c, t.p.x, t.p.y),
toElement = element.getTransformToElement(element.ownerSVGDocument),
toElement_inv = toElement.invert();
mtr = mtr.multiply(toElement);
mtr = toElement_inv.multiply(mtr);
//applying the result
Но это привело к неправильному результату и ошибкам при инвертировании матрицы.
Спасибо впереди!
getTransformToElement
принимает аргументElement
, а неDocument
.SVGMatrix
имеет методinverse()
, а неinvert()
. Вы пытались просто добавить матрицу преобразования в качестве атрибута? Например,element.setAttribute("transform", "matrix(" + t.q.c + " " + t.q.s + " " + (-t.q.s) + " " + t.q.c + " " + t.p.c + t.p.y + " " + ")");
? - person Erik Dahlström   schedule 21.03.2014