2

位置 (XYZ) を画面上の点 (XY) に正確に変換するにはどうすればよいでしょうか。

(XYZ) 座標にいるプレイヤー (あなたがコントロールするプレイヤー) と、同じく (XYZ) 座標にいる別のプレイヤーがいます。

他のプレイヤーの XYZ を画面上で XY に正確に変換して、X Y を使用して彼/その上に名前を描画できるようにするにはどうすればよいですか?

それが理にかなっていることを願っています...

編集:

これが私のgluProjectコードです:

IntBuffer viewport = GLAllocation.createDirectIntBuffer(16);
FloatBuffer modelview = GLAllocation.createDirectFloatBuffer(16);
FloatBuffer projection = GLAllocation.createDirectFloatBuffer(16);
FloatBuffer objectCoords = GLAllocation.createDirectFloatBuffer(3);
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelview);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection);
GL11.glGetInteger(GL11.GL_VIEWPORT, viewport);
GLU.gluProject(x, y, z, modelview, projection, viewport, objectCoords);
eturn objectCoords;

ありがとう。

4

4 に答える 4

1

あなたはそれに対処できるはずです:

public get2DFrom3D(float x, float y, float z)
{
    /*
    FloatBuffer screen_coords = GLAllocation.createDirectFloatBuffer(4);
    IntBuffer viewport = GLAllocation.createDirectIntBuffer(16);
    FloatBuffer modelview = GLAllocation.createDirectFloatBuffer(16);
    FloatBuffer projection = GLAllocation.createDirectFloatBuffer(16);
    */

    double[] screen_coords = new double[4];
    int[] viewport = new int[4];
    double[] modelview = new double[16];
    double[] projection = new double[16];


    GL11.glGetFloat(2982 /*GL_MODELVIEW_MATRIX*/, modelview);
    GL11.glGetFloat(2983 /*GL_PROJECTION_MATRIX*/, projection);
    GL11.glGetInteger(2978 /*GL_VIEWPORT*/, viewport);

    boolean result = GLU.gluProject(x, y, z, modelview, projection, viewport, screen_coords);
    if (result)
    {
        //System.out.printf("Convert [ %6.2f %6.2f %6.2f ] -> Screen [ %4d %4d ]\n", x, y, z, (int)screen_coords[0], (int)(screen_coords[3] - screen_coords[1]));
        System.out.printf("Convert [ %6.2f %6.2f %6.2f ] -> Screen [ %4d %4d ]\n", x, y, z, (int)screen_coords.get(0), (int)(screen_coords.get(3) - screen_coords.get(1)));
        return new Vector2(screen_coords[0], screen_coords[3] - screen_coords[1]);
    }
    else
    {
        System.out.printf("Failed to convert 3D coords to 2D screen coords");
        return null;
    }
}
于 2012-04-09T17:00:46.497 に答える
0

世界の点に対応する画面座標を見つけるには、カメラ変換を世界の点に適用します。使用している 3D フレームワークはわかりませんが、ほぼ確実に、この変換を実行するために作成できる API 呼び出しがあります。たとえば、Unity3D フレームワークでは を呼び出しCamera.WorldToScreenPoint、OpenGL では を呼び出しますgluProject

ただし、これはキャラクター名のような「ヘッドアップ」表示をレンダリングするための最良の方法であるとは限りません。もう 1 つの手法は、ビルボード (ビルボード) を作成することです。これは、ワールド内で常にカメラの方を向いているオブジェクトです。繰り返しますが、お使いの 3D フレームワークはおそらくこれをサポートしています。たとえば、Unity3D ではobject.transform.LookAt(camera.transform).

于 2012-04-04T11:39:38.427 に答える
-1

これはプログラミングの問題ではなく、数学の問題です。答えは、あなたがどこから見ているのか、あなたの「スクリーン」があなたの視点とプレーヤーに対してどこに座っているかによって異なります。

基本的に、視点から 3D の位置まで線を引き、その線と交差する 2D 平面 (画面) 上の x、y 座標を計算する必要があります。- おもう!

于 2012-04-04T11:05:14.307 に答える