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.

但是,这不一定是渲染“抬头”显示(如角色名称)的最佳方式。另一种技术是创建广告牌,它们是世界上始终面向相机的对象。同样,您的 3D 框架可能对此提供支持:例如,在 Unity3D 中,您可能会调用object.transform.LookAt(camera.transform).

于 2012-04-04T11:39:38.427 回答
0

存在一种在 2d 中绘制 3d 点的方法。您将必须定义焦距参数。以下代码正确执行

int 3D_2Dx(int pt[3]){
int focallength = ;//your focal length parameter i.e. 30,45,60,....
float multiplier =  focallength/(focallength+pt[2]) ;// pt[2] is its z co-ordinate
return (pt[0]*multiplier); //got the x co-ordinate
}
int 3D_2Dy(int pt[3]){
int focallength = ;//your focal length parameter i.e. 30,45,60,....
float multiplier =  focallength/(focallength+pt[2]) ;// pt[2] is its z co-ordinate
return (pt[1]*multiplier); //got the y co-ordinate
}

这段代码将完美地做到这一点。甚至我在完全基于 2d 的 flash 6 中制作了 3d 图形。

于 2013-12-05T03:43:45.260 回答
-1

这是一道数学题,不是编程题。答案取决于您从哪里观看,以及您的“屏幕”相对于您的视点和玩家所在的位置。

本质上,您需要从视点到 3D 位置绘制一条线,然后计算与该线相交的 2D 平面(屏幕)上的 x,y 坐标。- 我想!

于 2012-04-04T11:05:14.307 回答