我想知道如何准确地将一个位置(X,Y,Z)转换为屏幕上的一个点(X,Y)。
我有一个玩家(你控制的玩家)在(X,Y,Z)坐标中,另一个玩家也在(X,Y,Z)坐标中。
我如何在屏幕上将另一个玩家的X Y Z转换为X Y,以便我可以使用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;
谢谢。
发布于 2012-04-09 17:00:46
你应该能够处理这个问题:
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-04 11:39:38
若要查找与世界中的点相对应的屏幕坐标,请将摄影机变换应用于世界点。您没有说明您使用的是什么3D框架,但几乎可以肯定的是,您可以使用API调用来执行此转换。例如,在Unity3D框架中调用Camera.WorldToScreenPoint
,在OpenGL中调用gluProject
。
然而,这并不一定是渲染“平视”显示的最佳方式。另一种技术是创建广告牌,这是世界上始终面对相机的对象。同样,您的3D框架可能支持这一点:例如,在Unity3D中,您可以调用object.transform.LookAt(camera.transform)
。
发布于 2013-12-05 03:43:45
存在一种在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
}
这段代码将完美地完成这项工作。甚至我已经在flash6中制作了完全基于2d的3d图形。
https://stackoverflow.com/questions/10009771
复制