我正在创建一个自定义3D抛物面网格,通过对每个顶点应用以下算法来扭曲2D平面:
function transformVertex(v) {
var lat = toRad(v.y - height/2),
lon = toRad(v.x - width/2)/cos(lat);
lat = lat*cos(lon/1.5);
v.x = radius * cos(lat) * cos(lon);
v.y = radius * cos(lat) * sin(lon);
v.z = radius * sin(lat);
}
我的问题是,我该如何扭转这个过程?我需要在抛物面上取一个3D点并将其转换为相对于该平面PRE扭曲的2D坐标。
答案 0 :(得分:1)
计算过程中变量有一些变化,所以让我们对变量进行版本控制并确定它们的函数关系:
1- lat_0 = f(v_0.y)
2- lon_0 = f(v_0.x, lat_0)
3- lat_1 = f(lat_0, lon_0)
4- v_1.x = f(lat_1, lon_0)
5- v_1.y = f(lat_1, lon_0)
6- v_1.z = f(lat_1)
现在从6回到1,
lat_1 = asin(v_1.z / radius)
lon_0 = asin(v_1.y / radius / cos(lat_1)) OR lon_0 = acos(v_1.x / radius / cos(lat_1))
此时,lon_0依赖于v_0.x和lat_0,而lat_0依赖于v_0.y,这会锁定整个事物。它看起来不可逆转。