我想知道究竟如何,我可以一个位置(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;
谢谢。
你应该能够对付的是:
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;
}
}
为了找到屏幕坐标对应于世界的一个点,应用相机变换到世界点。 你不说你使用的3D框架,但几乎可以肯定有一个API调用就可以使执行这一转变。 例如,在Unity3D框架,你叫Camera.WorldToScreenPoint
,并在OpenGL,你叫gluProject
。
然而,这并不一定呈现“头抬起”显示像字符名称的最好方式。 另一种方法是创建广告牌 ,这是在世界上的物体总是面对摄像机。 同样,你的3D框架可能有这种支持:例如,在Unity3D你可以称之为object.transform.LookAt(camera.transform)
一个方法来在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
}
此代码将做到完美。 即使我做了闪光灯6的3D图形这是完全基于二维。
这是数学,而不是编程问题。 答案取决于你从寻找和您的“屏幕”正坐在有关你的观点和玩家的位置。
基本上需要绘制从视点到在三维的位置的线,然后计算出x,y坐标上相交的线的2D平面(屏幕)。 - 我认为!
文章来源: Convert a 3D location to a 2D on-screen point. (XYZ => XY)