Unity3D中二维纹理与球坐标映射 | 您所在的位置:网站首页 › 二维纹理映射怎么做出来的 › Unity3D中二维纹理与球坐标映射 |
Unity3D中二维纹理与球坐标映射
二维纹理坐标到球直角坐标映射球直角坐标到二维纹理坐标映射其他映射关系
二维纹理坐标到球直角坐标映射
在Unity3D中世界坐标系坐标轴如下: 其中z轴正方向正对着屏幕朝外。 二维纹理坐标原点在左下角: 映射到球关系如下: 其中6点代表X轴正方向,0123点代表Y轴正方向,5点代表Z轴正方向。 我们设二维纹理坐标(原点在左下角)为(x,mY),其转换到世界坐标系的球坐标为: //图像宽为w,图像高为h,球半径为l x_pos = x / (float)w * (2 * M_PI) - M_PI; y_pos = mY /(float) h * (M_PI) - M_PI_2;//注意原点在左下角 Nx = (float)(Math.Cos(y_pos) * Math.Cos(x_pos) * l); Nz = -1.0f * (float)(Math.Cos(y_pos) * Math.Sin(x_pos) * l) ; Ny = (float)Math.Sin(y_pos) * l;设纹理宽2048高2048,输入纹理坐标(512,1024)对应渲染效果如下: 球直角坐标到二维纹理坐标映射与二维纹理坐标到球直角坐标映射相对应,我们需要将拿到的球坐标按照6点代表X轴正方向,0123点代表Y轴正方向,5点代表Z轴正方向的关系进行映射: Point = new Vector3(1.0f, 0.0f, 1000.0f); r = (float)Math.Sqrt(Point.x * Point.x + Point.y * Point.y + Point.z * Point.z); double u = Math.Atan(-1.0f * Point.z / Point.x) / 2.000f / PI + 0.500f; double v = Math.Asin(Point.y / r) / PI + 0.500f; uv.x = (float)u; uv.y = (float)v;输入视点坐标(1.0f, 0.0f, 1000.0f),经过映射后其对应的纹理坐标为(512,1024),渲染效果如下: 其他映射关系如果将三维坐标系轴变为右手坐标系,即X轴正方代表6点,Y轴正方向代表7点,Z轴正方向代表0123点。 二维纹理坐标到球直角坐标映射变为: //图像宽为w,图像高为h,球半径为l x_pos = x / (float)w * (2 * M_PI) - M_PI; y_pos = mY /(float) h * (M_PI) - M_PI_2;//注意原点在左下角 Nx = (float)(Math.Cos(y_pos) * Math.Cos(x_pos) * l); Ny = (float)(Math.Cos(y_pos) * Math.Sin(x_pos) * l) ; Nz = (float)Math.Sin(y_pos) * l;球直角坐标到二维纹理坐标映射变为: Point = new Vector3(1.0f, 0.0f, 1000.0f); r = (float)Math.Sqrt(Point.x * Point.x + Point.y * Point.y + Point.z * Point.z); double u = Math.Atan(Point.y / Point.x) / 2.000f / PI ; double v = Math.Asin(Point.z / r) / PI + 0.500f; uv.x = (float)u; uv.y = (float)v; |
CopyRight 2018-2019 实验室设备网 版权所有 |