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;

Unity3D中二维纹理与球坐标映射相关推荐

  1. 二维纹理 Texture 2D

    二维纹理 Texture 2D 原文链接http://www.ceeger.com/Manual/Textures.html Textures bring your Meshes, Particles ...

  2. C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结

    转自:http://blog.163.com/tianhit@yeah/blog/static/165747821201052195212719/ #include<iostream> u ...

  3. 微信小程序长按图片,实现保存、转发、识别图中二维码

    在小程序image组件中二维码/小程序码图片不支持长按识别,仅在 wx.previewImage 中支持长按识别 但是通过wx.previewImage只能实现保存,转发,小程序 只能识别 小程序二维 ...

  4. Java中二维数组的用法(不定长二维数组)

    Java中二维数组的用法(不定长二维数组),即每个第二维的数组长度不一样. 1>代码如下: package com.demo.test;public class Test {public Tes ...

  5. 网页中二维码识别规则

    识别规则 这里采用的逻辑是截屏识别,当客户端发现用户在网页的img标签内进行长按操作时,会立刻截屏并且启动二维码识别算法.所以这里用于二维码识别的图片是截屏,而不是之前有人提到的img标签中的图片. ...

  6. c语言动态的申请矩阵存储空间,C语言中二维数组如何申请动态分配内存

    C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include #include int main() { int **a; int i ...

  7. php二维数组取交集,PHP中二维数组怎么取交集

    PHP中二维数组取交集的方法:首先循环其中一个数组:然后使用in_array()函数判断被循环数组的每个元素是否在另外一个数组中:最后输出$out_arr即可. PHP二维数组怎么取交集? 思路,循环 ...

  8. 【Unity3D】图片纹理压缩方式,干货走起!

    Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式. 在Texture2D的设置选项中,你可以针对不同的平台,设 ...

  9. Unity3D for Android 纹理压缩支持

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术交流QQ群:[119706192]本文链接地址: Unity3D for Android 纹理压缩支持 首先附图:U ...

最新文章

  1. 二流四流神经网路(模型融合矩阵乘法理论实践)
  2. SAP Cloud for Customer(C4C)前台显示的数据是如何从后台读取的
  3. http 使用curl发起https请求
  4. 怎样使用C# 获取WIFI的连接状态?
  5. 哪些网站在+1s后有神奇的功能
  6. C++primer第十一章 关联容器 11.1使用关联容器 11.2 关联容器概述
  7. 8 iSCSI网络存储服务
  8. 再记AE与AO的区别与联系
  9. 记录自定义view的基本使用
  10. Dialog的半透明背景的灰度
  11. 学生选课管理系统(Java)
  12. 计算机一级最强大脑,计算机入侵人类 《最强大脑》选手完败?
  13. 外事不决问元芳,内事不决找搜狗------简评搜狗语音助手
  14. 2022年贵州省职业院校技能大赛中职组网络安全赛项规程
  15. _id随机的 es_ES再现偷ID事件?仅与阿水ID相差1个字,玩家却释怀,原是系统作梗...
  16. 微博图床php上传,微博图床 - shitalpig的个人空间 - OSCHINA - 中文开源技术交流社区...
  17. 数据库的备份恢复和SQL语句
  18. Linux 网络唤醒
  19. 框架指针的省略(FPO)
  20. 青云QingCloud与陕中二院联手打造智慧医院范本

热门文章

  1. 失眠不仅仅是睡不着,出现这些情况也算失眠
  2. 如何快速查询SOLIDWORKS官方教程
  3. 人工智能专栏第十一讲——指代消歧
  4. 在Debian 10上安装和配置Samba服务器共享
  5. PostMessage Vue中使用
  6. 考研复试-操作系统面试题
  7. 用vue实现一个根据不同百分比显示不同背景颜色的日历
  8. Qt/C++编写地图综合应用48-地球模式、三维模式、地铁模式
  9. 当Android SDK连接不上夜神模拟器时
  10. UE4 TRPG制作日志12