假设我有一个对象在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的画布上。该球应该具有z = 700。那么,在z = 700时,使其出现在画布上的实际x和y位置是多少?
因此,该方法将是float unscreenX(float x,float y,float z),并返回x值。
我的数学/编程技能不是很高级(可以称之为糟糕)(我更多的是设计师),所以我正在寻求一些帮助。我已经在processing论坛上提出了问题,但通常这里有更多人对矩阵等有更深入的知识。 processing的正常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和投影是3D矩阵,代码在这里:https://github.com/processing/processing/blob/master/core/src/processing/core/PMatrix3D.java,但我想这是相当基础和常见的。我还在processing论坛上发了帖子,因为你永远不知道。它以不同的方式解释了我想要什么。http://forum.processing.org/topic/unscreenx-and-unscreeny对于描述这篇文章的标签,我没有去特定的原因,因为我可以想象一个从未使用过Java但在矩阵方面有经验的C ++程序员仍然能够提供一个很好的答案。希望有人能帮忙。