在Processing中从相对世界空间转换
将局部相对点转换为处理中的世界(屏幕)空间有什么好方法?
例如,采用Processing PDE附带的Flocking示例 。 我如何在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. }
不幸的是,Processing并没有让这些东西变得简单。 它不能让我们访问转换矩阵,所以我认为我们必须使用手动转换矩阵/向量乘法。 (如果你很好奇,我在均匀表示中使用了帧到规范的变换矩阵)。
警告 :这是一个在java中快速解释的Mathematica结果,假设您只有一个旋转和一个平移 (如在render方法中)。 翻译仅由locector给出。
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; }