Преобразование из относительного в мировое пространство в обработке - PullRequest
2 голосов
/ 29 марта 2011

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

Например, рассмотрим пример Flocking , который поставляется с 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.
}

1 Ответ

2 голосов
/ 30 марта 2011

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

ПРЕДУПРЕЖДЕНИЕ : Это результат 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;
}
...