2017-01-10 348 views
0

我有一个图像的equirectangular投影,我将其作为一个全景图像载入,我的相机放置在原点处看着-z。我的坐标系是右手的,即x在右边,y在上(北),z从屏幕出来。将经纬度转换为opengl中的世界坐标右手

我想要做的就是选取像素并将其转换为世界坐标xyz。

,我使用来获得纬度和经度的公式是:

double centerX = totalWidth/2; 
double centerY = totalHeight/2; 

double latScaling = centerY/90; 
double lonScaling = centerX/180; 


double longitude = (pixelX-centerX)/lonScaling; 
double latitude = -(pixelY-centerY)/latScaling; 

totalWidth和totalHeight是等距离长方圆柱图像的宽度和高度以及pixelX和pixelY是所选择的像素的坐标。

而且我使用这些经/纬来获得世界坐标为:

double x = sphereRadius * Math.sin(latRadians) * Math.sin(longRadians); 
double y = sphereRadius * Math.cos(latRadians); 
double z = sphereRadius * Math.cos(longRadians) * Math.sin(latRadians); 

sphereRadius是18等于该图像是最后绘制的OpenGL球体的半径。相机在这个球体的起源。 请有人检查我的方法是否正确,以及如果使用的公式适用于右手坐标系统。

对于纬度= 0和经度= 0,使用上述公式得到x = 0,y = 18,z = 0,这不是预期的结果。我错过了什么吗?

编辑:这似乎是为我工作的公式为:

//翻转Y轴 latRadians = Math.PI/2 - latRadians;

double x = sphereRadius * Math.sin(latRadians) * Math.sin(longRadians); 
    double y = -sphereRadius * Math.cos(latRadians); 
    double z = -sphereRadius * Math.sin(latRadians) * Math.cos(longRadians); 

但还是有一些偏移(约850像素)和偏差最小的赤道和本初子午线,因为它包含了真实比例值。我想我需要通过相机的向上和向量之间的角度来计算偏移量。有人能纠正我吗?

有一个扁平的equirectangular投影,我把像素xy的位置。然后这个equirectangular包裹在球体的内部,我的相机在这个球体的原点。我需要计算像素xy的世界坐标。希望澄清一些疑问。

+1

交换sin(lat)和cos(lat) '。 –

+0

根据您的评论我的新公式是: double x = sphereRadius * Math.cos(latRadians)* Math.sin(longRadians); double y = sphereRadius * Math.cos(latRadians); double z = sphereRadius * Math.cos(longRadians)* Math.cos(latRadians); 新值是x = 0,y = 18,z = 18但偏移仍然存在,我的经度从西到东-180到180,纬度从南到北-90到90。 –

回答

0

我的方法有点不对。我不必搜索纬度经度映射,而必须计算纹理的UV映射。 UV贴图与经纬度贴图略有不同。 UV映射不在-PI和PI之间,而是在0.0-1.0之间。纹理被划分成扇形和环形。你可以找到逻辑生成一个球体here

这是我解决了这个问题:

产生从像素

double u = pixelX/totalWidth; 
double v = 1 - pixelY/totalHeight; 

的xy位置的UV贴图并用以下公式来转换到XYZ球体的坐标

double theta = 2 * Math.PI * u; //sector 
double phi = Math.PI * v; //ring 

double x = Math.cos(theta) * Math.sin(phi) * sphereRadius; 
double y = -Math.sin(-Math.PI/2 + phi) * sphereRadius; 
double z = Math.sin(theta) * Math.sin(phi) * sphereRadius; 

该球具有在y轴上的磁极北方上+ VE对-ve y,其中相机处于或y和南部这个球体的igin具有上矢量0,1,0和右矢量1,0,0并且用0,0看,

相关问题