我有一个图像的等距矩形投影,我加载为全景图像,我的相机放在原点,看着-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是equirectangular图像的宽度和高度,pixelX和pixelY是选定的像素坐标。
此外,我正在使用这些lat / long来获得世界坐标:
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球体的半径。相机是这个球体的起源。 请有人检查我的方法是否正确,以及使用的公式对于右手坐标系是否正确。
使用上面的公式,我得到x = 0,y = 18,z = 0表示纬度= 0,经度= 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位置。然后这个equirectangular包裹在球体的内部,我的相机在这个球体的原点。我需要从像素xy计算世界坐标。希望这澄清了一些疑问。
答案 0 :(得分:0)
我的做法有点不对劲。我没有搜索纬度经度映射,而是必须计算纹理的UV映射。 UV映射与纬度/长度映射略有不同。而不是-PI和PI之间的值,UV映射在0.0-1.0之间。纹理分为扇区和环。您可以找到生成球体here
的逻辑这就是我解决这个问题的方法:
从像素的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
查看