最近在写GBA的程序。GBA运行的是C的裸机代码,而中途使用的很多小工具则用C#写的,例如:图片转换到.h头文件,制作三角函数表,还有像这次介绍的将圆柱面贴图映射到半球贴图的小工具。这样的小功能,用C#写就是一小会的事,效率非常高。

这时候就能体现出来——各语言有各自的用途,C用来做硬件开发,C++做软件开发,C#做快速功能。

这次要解决的问题是:

制作3D时,一个球体的贴图,我们通常映射成一个柱面,就像我们常见的世界地图一样。如图(这张图片是从NASA上下载的卫星图)

但是如果我们想用半球映射来贴图,例如分成北半球和南半球分别映射,那不一定能找到合适的贴图。

但我们可以很简单的将柱面贴图转换成半球贴图。如图(半球之外的区域我也映射了):

代码如下:

using System;
using System.Drawing;
using System.Drawing.Imaging;  

public void ToSphereMap(int spWidth, int spHeight)
{
//加载bmp柱面贴图
Bitmap bmp = newBitmap("CylinderMap.png");
//创建球面贴图
Bitmap sphereMap = new Bitmap(spWidth, spHeight * 2); int clHeight = bmp.Height;
int clWidth = bmp.Width; double a, b; //半球面贴图平面上xy坐标(a,b)
double z; //对应球体上点(x,y,z)的z轴坐标
double s; //轴面角度
int clX, clY1, clY2;

  for (int spY = 0; spY < spHeight; spY++)
  {
    for (int spX = 0; spX < spWidth; spX++)
    {
      //r = sqrt(a^2+b^2) = x^2+y^2 = 1-z^2
      a = spX * 2 / (float)spWidth - 1;
      b = spY * 2 / (float)spHeight - 1;
      z = 1 - Math.Sqrt(a * a + b * b);
      //if (z < 0) z = -Math.Sqrt(-z);
      //else z = Math.Sqrt(z);       s = Math.Atan2(y, x) + Math.PI;
      clX = s * clWidth / (2 * Math.PI);
      clY1 = (int)((1 - z) * clHeight * 0.5);
      clY2 = (int)((1 + z) * clHeight * 0.5);       if (clX < 0) clX = 0;
      else if (clX > clWidth - 1) clX = clWidth - 1;
      if (clY1 < 0) clY1 = 0;
      else if (clY1 > clHeight - 1) clY1 = clHeight - 1;
      if (clY2 < 0) clY2 = 0;
      else if (clY2 > clHeight - 1) clY2 = clHeight - 1;       sphereMap.SetPixel(spX, spY, bmp.GetPixel(clX, clY1));
      sphereMap.SetPixel(spX, spY + spHeight, bmp.GetPixel(clX, clY2));       }
    }

  //保存图片
  sphereMap.Save("SphereMap.png", ImageFormat.Png);
}

  

补充一些注释:

1、转换后的半球贴图分上下两部分,分别是北南半球。

2、转换的主要思路是从半球贴图上的位置寻找对应的柱面贴图坐标。

  (a, b)是半球平面上的坐标,对应于球体上的点坐标(x, y, z);

3、具体的映射转换根据柱面映射和半球映射的方法有所区别,需要按情况分析。

  这里使用的映射方法稍后我会上一张图解释。

用C#写小工具:将圆柱面贴图映射到半球贴图的更多相关文章

  1. SQL查询条件生成小工具

    最近运维数据,经常遇到需要在sql条件中个In('',''....)个字符串的情况,于是在网上找了个小工具改造一下,先用着: 效果如图: using System; using System.Coll ...

  2. 写个C#命令行参数解析的小工具

    最近测试工作做的比较多因此时常要创建一些控制台类型的应用程序.因为程序有不同的参数开关,需要在程序启动的时候通过命令行来给程序传递各种开关和参数.直接操作args有些不方便,所以就写了个解析参数的小工 ...

  3. 分享一个很早之前写的小工具DtSpyPlus

    几年前写的一个获取windows窗体基本信息和屏幕取色的小工具 ,一直在用. 下载地址 http://files.cnblogs.com/dint/SpyPlus.zip

  4. 用C#Winform写个简单的批量清空文件内容和删除文件的小工具

    用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013 ...

  5. 应急分析异常通信的小思路和自己写的小工具(查询CNAME和A记录)

    一.背景: 在很多时候,应急会发现.卧槽,异常连接,只有一个域名或者IP. 怎么办?上防火墙看记录,查域名对应的记录累成狗,自己把之前的代码改了改,写了个小工具,一条命令查询DNS相关记录,也可以指定 ...

  6. 用Python写个自动ssh登录远程服务器的小工具

    很多时候我们喜欢在自己电脑的终端直接ssh连接Linux服务器,而不喜欢使用那些有UI界面的工具区连接我们的服务器.可是在终端使用ssh我们每次都需要输入账号和密码,这也是一个烦恼,所以我们可以简单的 ...

  7. 自己动手写一个U盘拷贝小工具

    这是五一期间,参照知乎上一篇的文章<十行代码--用python写一个USB病毒>写成的,最初只是单纯的想写成死循环,直到文件占满硬盘为止,第一个遇到的问题是,拷贝到硬盘之后,由于要无限次拷 ...

  8. 开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码

    开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码. 开源地址: https://github.com/jkpang/PPRows

  9. 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}

    1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...

随机推荐

  1. Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作

    ChuanGoing 2019-09-10 距离上一篇近一个月时间,断断续续才把本篇码完,后面将加快进度,争取年度内把本系列基本介绍完成,同时督促本人持续学习. 本篇学习曲线: 1.初识Dapper ...

  2. Pycharm创建项目时 自动添加头部信息

    1.打开PyCharm,选择File--Settings 2.依次选择Editor---Code Style-- File and Code Templates---Python Script 3.. ...

  3. python关于urllib库与requests

    对于这两个库来说个人推荐使用requests库 下面用实例来说明 urllib库: requests库: 实现同样功能: 实现同样的功能下urllib比request步骤更复杂,这个对于我们编程来说是 ...

  4. nsq (三) 消息传输的可靠性和持久化[二]diskqueue

    上一篇主要说了一下nsq是如何保证消息被消费端成功消费,大概提了一下消息的持久化,--mem-queue-size 设置为 0,所有的消息将会存储到磁盘. 总有人说nsq的持久化问题,消除疑虑的方法就 ...

  5. 软件 ---- idea启动

    1.将配置转移到别的盘符,避免重做系统后,之前的配置就没了 找到安装的位置,默认安装的话地址一般是 C:\Program Files\JetBrains\IntelliJ IDEA 2017.2 ID ...

  6. 解决 scp 和rsync 同步失败【rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.2]】

    解决 scp 和rsync 同步失败 报错信息截图: 解决问题的步骤: 1.检查对方的scp和rsync 是否能使用. rsync 在使用的时候,需要客户端和服务端都有rsync工具.scp 和 rs ...

  7. Zabbix-(三)监控主机CPU、磁盘、内存并创建监控图形

    Zabbix-(三)监控主机CPU.磁盘.内存并创建监控图形 一.前言 前文中已经讲述了两种方式对Zabbix的搭建,本文将讲述如何在zaibbx上添加需要监控的主机,以及使用Zabbix自带模板和自 ...

  8. 11.13的C++##不想写结构,更不爱指针

    //2019.11.13 卑微的Loving-Q瞎写的程序 报错请更改VS中的SDL检查// 我要去嗨了,在线卑微 1 #include<iostream> #include<std ...

  9. SpringSecurity退出功能实现的正确方式

    本文将介绍在Spring Security框架下如何实现用户的"退出"logout的功能.其实这是一个非常简单的功能,我见过很多的程序员在使用了Spring Security之后, ...

  10. Java虚拟机详解(九)------类文件结构

    我们知道计算机是由晶体管.电路板等组装而成的电子设备,而这些电子设备其实只能识别0与1的信号. 那么问题来了,我们在操作系统上编写的Java代码(由字母.数字等各种符号组成),打包后部署到服务器上,是 ...