Преобразование из относительного мирового пространства в Processing

Каков хороший способ преобразования локальной относительной точки в мировое (экранное) пространство в Обработке?

Например, возьмем пример Flocking, который поставляется с Processing PDE. Как мне реализовать метод relativeToWorld и метод worldToRelative в классе Boid. Эти методы будут учитывать все преобразования, выполненные в методе render.

Я думал, что хочу преобразовать объекты PVector, чтобы сигнатуры методов могли выглядеть примерно так:

PVector relativeToWorld(PVector relative) {
    // Take a relative PVector and return a world PVector.
}

PVector worldToRelative(PVector world) {
    // Take a world PVector and return a relative PVector.
}

person Adam Harte    schedule 29.03.2011    source источник
comment
Этот пост может быть вам полезен: stackoverflow. ком/вопросы/8339533/   -  person Justin    schedule 23.08.2012


Ответы (1)


К сожалению, Processing не упрощает жизнь с такими вещами. Это не дает нам доступа к матрицам преобразования, поэтому я считаю, что мы должны использовать ручное умножение матрицы/вектора преобразования. (Если вам интересно, я использовал матрицы преобразования кадров в канонические в однородном представлении).

ВНИМАНИЕ: это результат Mathematica, быстро интерпретированный в java, который предполагает, что у вас есть только один поворот и один перевод (как в методе рендеринга). . Перевод дается только loc PVector.

PVector relativeToWorld(PVector relative) {
  float theta = vel.heading2D() + PI/2;
  float r00 = cos(theta);
  float r01 = -sin(theta);
  float r10 = -r01;
  float r11 = r00;
  PVector world = new PVector();
  world.x = relative.x * r00 + relative.y*r01 + loc.x;
  world.y = relative.x * r10 + relative.y*r11 + loc.y;
  return world;
}

PVector worldToRelative(PVector world) {
  float theta = vel.heading2D() + PI/2;
  float r00 = cos(theta);
  float r01 = sin(theta);
  float r10 = -r01;
  float r11 = r00;
  PVector relative = new PVector();
  relative.x = world.x*r00 + world.y*r10 - loc.x*r00 - loc.y*r10;
  relative.y = world.x*r01 + world.y*r11 - loc.x*r01 - loc.y*r11;
  return relative;
}
person num3ric    schedule 30.03.2011
comment
Все ли x и y в вашем коде правильные? И я думаю, где вы устанавливаете относительные значения в последних нескольких строках, они должны устанавливать свойства x и y? - person Adam Harte; 31.03.2011
comment
Поправил отн.x/y. Работает ли это для вас? Я проверил это сейчас, и, кажется, все в порядке, не так ли? Опять же, не лучшее решение, потому что оно ограничено только одним перемещением и вращением. - person num3ric; 31.03.2011
comment
Работает отлично. Просто нужно было успеть его протестировать :) Спасибо за тестирование и за правку. - person Adam Harte; 31.03.2011
comment
Я полагаю, вы пропустили знак минус в функции worldToRelative. Должно быть число с плавающей запятой r01 = -sin(theta); Потратил некоторое время, пытаясь понять это. - person genericdave; 10.09.2011