Java 加工中相对空间到世界空间的变换

Java 加工中相对空间到世界空间的变换,java,transformation,processing,coordinate-transformation,Java,Transformation,Processing,Coordinate Transformation,在处理过程中将局部相对点转换为世界(屏幕)空间的好方法是什么 例如,以处理PDE附带的为例。如何在Boid类中实现relativeToWorld方法和worldToRelative方法。这些方法将考虑在render方法中完成的所有转换 我想我应该转换PVector对象,因此方法签名可能类似于: PVector relativeToWorld(PVector relative) { // Take a relative PVector and return a world PVector.

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

例如,以处理PDE附带的为例。如何在
Boid
类中实现
relativeToWorld
方法和
worldToRelative
方法。这些方法将考虑在
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.
}

不幸的是,处理这些事情并不能让生活变得轻松。它不能让我们访问转换矩阵,所以我认为我们必须使用手动转换矩阵/向量乘法。(如果你好奇的话,我使用齐次表示中的框架到规范变换矩阵)

警告: 这是一个用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;
}

你的代码中所有的x和y都正确吗?我认为在最后几行中设置相对的地方,应该设置x和y属性?更正了relative.x/y。对你有用吗?我现在测试过了,它看起来很好,不是吗?同样,这不是最好的解决方案,因为它仅限于一次平移和旋转。效果非常好。我只是需要时间来测试:)谢谢你的测试和编辑。我相信你在worldToRelative函数中漏掉了一个负号。应为浮点r01=-sin(θ);花了一段时间想弄明白。这篇文章可能会对你有所帮助: