我有一个图像的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的世界坐标。希望澄清一些疑问。
交换sin(lat)和cos(lat) '。 –
根据您的评论我的新公式是: 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。 –