在处理(java 方言)中有方法 screenX、screenY(和 screenZ,但我们现在跳过它)。
假设我在 xyz = 50、100、500 处有一个对象。然后使用 screenX 和 screenY,您现在可以在画布上出现它们的位置。
float x = screenX(50, 100, 500);
float y = screenY(50, 100, 500);
这是参考: http: //processing.org/reference/screenX_.html
我感兴趣的是一种逆方法。例如,我希望在 x=175 和 y=100 的画布上出现一个球体。球体的 az 应该是 700。那么实际的 x 和 y 位置会在 z=700 处使其在画布上的 175,100 处出现?
所以方法是float unscreenX(float x, float y, float z)
,它会返回 x 值。
我的数学/编程技能不是那么先进(让我们称之为糟糕)(我更像是一名设计师)所以我正在寻找一些帮助。我已经准备好在处理板上询问,但这里通常有更多人对矩阵等有更深入的了解。
可以在此处找到来自处理的正常 screenX 方法: https ://github.com/processing/processing/blob/master/core/src/processing/opengl/PGraphicsOpenGL.java
public float screenX(float x, float y, float z) {
return screenXImpl(x, y, z);
}
protected float screenXImpl(float x, float y, float z) {
float ax =
modelview.m00*x + modelview.m01*y + modelview.m02*z + modelview.m03;
float ay =
modelview.m10*x + modelview.m11*y + modelview.m12*z + modelview.m13;
float az =
modelview.m20*x + modelview.m21*y + modelview.m22*z + modelview.m23;
float aw =
modelview.m30*x + modelview.m31*y + modelview.m32*z + modelview.m33;
return screenXImpl(ax, ay, az, aw);
}
protected float screenXImpl(float x, float y, float z, float w) {
float ox =
projection.m00*x + projection.m01*y + projection.m02*z + projection.m03*w;
float ow =
projection.m30*x + projection.m31*y + projection.m32*z + projection.m33*w;
if (nonZero(ow)) {
ox /= ow;
}
float sx = width * (1 + ox) / 2.0f;
return sx;
}
当然,还有 y 和 z (我不理解 z 但我们忽略它)。我认为这可能会对如何反转它提供一些见解。
modelview 和 projection 是一个 3d 矩阵,代码在这里: https ://github.com/processing/processing/blob/master/core/src/processing/core/PMatrix3D.java 但我想这是非常基本和常见的。
我还在处理板上发了一个帖子,因为你永远不知道。它解释了我想要的有点不同。 http://forum.processing.org/topic/unscreenx-and-unscreeny
对于描述这篇文章的标签,我没有具体说明原因,我可以想象一个从未使用过 java 但确实使用过 c++ 并且具有矩阵经验的程序员仍然能够提供一个很好的答案。
希望有人可以提供帮助。