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



我有一个图像的等矩形投影,我将其加载为全景图像,我的相机放置在原点,观察-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=数学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贴图的值不是在-PI和PI之间,而是在0.0-1.0之间。纹理分为扇形和环形。你可以在这里找到生成球体的逻辑

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

从像素的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 观察

最新更新