2

在处理中将局部相对点转换为世界(屏幕)空间的好方法是什么?

例如,以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.
}
4

1 回答 1

2

不幸的是,Processing 并没有让这些事情变得轻松。它没有让我们访问转换矩阵,所以我相信我们必须使用手动转换矩阵/向量乘法。(如果你很好奇,我在齐次表示中使用了帧到规范变换矩阵)。

警告:这是一个在 java 中快速解释的 Mathematica 结果,假设您只有一次旋转一次平移(如在渲染方法中)。翻译仅由 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;
}
于 2011-03-30T05:56:03.137 回答