繁体   English   中英

将opengl中的纬度和经度转换为右手世界坐标

[英]convert latitude and longitude to world coordinates in opengl in right handed

我有一个图像的等角投影,我将其加载为全景图像,其中将相机放在原点(看着-z)。 我的坐标系是右手的,即x在右边,y在上(北),z在屏幕外。

我想要做的是获取所选像素并将其转换为世界坐标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像素),并且赤道和本初子午线的偏差是最小的,因为它包含真实的比例值。 我想我需要通过相机的上矢量和右矢量之间的角度来计算偏移量。 有人可以纠正我吗?

有一个平面等角投影,我将其定位为像素xy位置。 然后将这个等角矩形包裹在球体的内部,而我的相机就位于该球体的原点。 我需要根据像素xy计算世界坐标。 希望这可以澄清一些疑问。

我的方法有点错误。 代替搜索纬度经度映射,我不得不计算纹理的UV映射。 UV映射与纬度/经度映射略有不同。 UV映射介于0.0-1.0之间,而不是-PI和PI之间的值。 纹理分为扇区和环。 您可以在此处找到生成球体的逻辑

这就是我解决此问题的方法:

从像素的xy位置生成UV映射

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

并使用以下公式将球体的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 y上为北,在-ve y上为南,其中相机位于该球体的原点,向上矢量为0,1,0,右侧矢量为1,0,0,外观为-在0,0,-1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM