処理中 (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 である必要があります。では、z=700 での実際の x と y の位置は、キャンバス上の 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 とプロジェクションは 3D マトリックスです。コードは次のとおり です 。
あなたが決して知らないので、私も処理ボードに投稿しました。それは私が望むものとは少し異なることを説明しています。 http://forum.processing.org/topic/unscreenx-and-unscreeny
この投稿を説明するタグについては、特定の原因には行きませんでした。たとえば、Java を使用したことはないが、C++ を使用したことがあり、マトリックスの経験があるプログラマーが適切な回答を提供できると想像できます。
誰かが助けてくれることを願っています。