1. 数学分析

1) 2D笛卡尔坐标系与2D极坐标系

2D笛卡尔坐标系就是平面直角坐标系,不说了。

2D极坐标系,是用方向和距离来定义2D空间中的点,而非x,y坐标,如下图:

其中极坐标的参数用红色表示,笛卡尔坐标的参数用蓝色字表示。

非常显而易见,他们之间的转换关系如下:

x = r * cos(theta)

y = r * sin(theta)

r = sqrt(x2 + y2)

theta = arctg(y/x)

2) 3D笛卡尔坐标系

在2D笛卡尔坐标系上增加了Z轴,形成3D笛卡尔坐标系。分为左手坐标系和右手坐标系。区分方法:用左手握住Z轴,大拇指伸直,其他四指的指尖方向从X轴转向Y轴,如果大拇指的指向是Z的正半轴,则为左手坐标系,反之为右手。

3) 3D柱面坐标系

3D柱面坐标系和2D的极坐标系对应,只是在2D极坐标系上增加了一条Z轴,所以3D笛卡尔坐标系与3D柱面坐标系的转换也非常简单:x和y以及r和theta都不变,只增加了Z坐标而已。3D柱面坐标系的表示方式是:P(r, theta, z)。

4) 3D球面坐标系

这个是3D坐标系中最复杂的,用P(p, phi, theta)表示。其中p是点P到原点的距离,phi是原点到点P的直线与正Z轴的夹角,theta是原点到点P的线段在X-Y平面上的投影与X轴之间的夹角,其实正好是极坐标theta。由于比较复杂,如图所示:

现在可以推导一下(p,phi,theta)与(x,y,z)的关系了。

由图上可以得知:

OP在X-Y平面上的投影长度r = sqrt(x2+y2)

p = sqrt(x2+y2+z2)

Sin(phi) = r / p,所以

phi = arcsin(r / p)

tg(theta) = y / x

theta = arctg(y/x)

从p,phi,theta如何得到x,y,z呢:

r = p * Sin(phi)

x = r * Cos(theta)

y = r * Sin(theta)

z = p * Cos(phi)

代入整理得:

x = p * Sin(phi) * Cos(theta)

y = p * Sin(phi) * Sin(theta)

z = p * Cos(phi)

弄清楚了上面的关系,就可以建立这些坐标系下点的数据结构,以及转换函数了。

2. 代码实现

1) 结构体定义

// 类型声明
typedef struct POINT2D_TYPE // 2D笛卡尔坐标
{double x;double y;
} POINT2D, *POINT2D_PTR;typedef struct POINT3D_TYPE // 3D笛卡尔坐标
{double x;double y;double z;
} POINT3D, *POINT3D_PTR;typedef struct POLAR2D_TYPE // 2D极坐标
{double r;double theta;
} POLAR2D, *POLAR2D_PTR;typedef struct CYLINDRICAL3D_TYPE // 3D柱面坐标
{double r;double theta;double z;
} CYLINDRICAL3D, *CYLINDRICAL3D_PTR;typedef struct SPHERICAL3D_TYPE
{double p;double phi;double theta;
} SPHERICAL3D, *SPHERICAL_PTR;

2) 转换函数定义

void _CPPYIN_Math::CooTransPOINT2DtoPOLAR2D(POINT2D_PTR point2d, POLAR2D_PTR polar2d)
{polar2d->r = sqrt((point2d->x * point2d->x) + (point2d->y * point2d->y));polar2d->theta = atan((point2d->y) / (point2d->x));
}void _CPPYIN_Math::CooTransPOLAR2DtoPOINT2D(POLAR2D_PTR polar2d, POINT2D_PTR point2d)
{point2d->x = polar2d->r * cos(polar2d->theta);point2d->y = polar2d->r * sin(polar2d->theta);
}void _CPPYIN_Math::CooTransPOINT3DtoCYLINDRICAL3D(POINT3D_PTR point3d, CYLINDRICAL3D_PTR cylindrical3d)
{cylindrical3d->r = sqrt((point3d->x * point3d->x) + (point3d->y * point3d->y));cylindrical3d->theta = atan((point3d->y) / (point3d->x));cylindrical3d->z = point3d->z;
}void _CPPYIN_Math::CooTransCYLINDRICAL3DtoPOINT3D(CYLINDRICAL3D_PTR cylindrical3d, POINT3D_PTR point3d)
{point3d->x = cylindrical3d->r * cos(cylindrical3d->theta);point3d->y = cylindrical3d->r * sin(cylindrical3d->theta);point3d->z = cylindrical3d->z;
}void _CPPYIN_Math::CooTransPOINT3DtoSPHERICAL3D(POINT3D_PTR point3d, SPHERICAL3D_PTR spherical3d)
{spherical3d->p = sqrt((point3d->x * point3d->x) + (point3d->y * point3d->y) + (point3d->z * point3d->z));double r = sqrt((point3d->x * point3d->x) + (point3d->y * point3d->y));spherical3d->phi = asin(r / spherical3d->p);spherical3d->theta = atan(point3d->y / point3d->x);
}void _CPPYIN_Math::CooTransSPHERICAL3DtoPOINT3D(SPHERICAL3D_PTR spherical3d, POINT3D_PTR point3d)
{double r = spherical3d->p * sin(spherical3d->phi);point3d->x = r * cos(spherical3d->theta);point3d->y = r * sin(spherical3d->theta);point3d->z = spherical3d->p * cos(spherical3d->phi);
}

没什么可说的,全是套上面推出来的公式而已。

3. 代码下载

完整项目源代码下载:>>点击进入下载页<<

转自:http://blog.csdn.net/cppyin/archive/2011/02/07/6173860.aspx

转载于:https://www.cnblogs.com/CoolJie/archive/2011/03/03/1970220.html

(转)从零实现3D图像引擎:(5)3D坐标系函数库相关推荐

  1. 从零实现3D图像引擎:(10)Hello3DWorld

    1. 数学分析 前面我们已经把预先想到的可能会用到的数学工具都封装好了,从这篇开始,应该很少出现一大篇都是数学推导的了,终于看见光明了,这次我们将开始第一个3D程序的编写,所以题目就叫Hello3DW ...

  2. (转)从零实现3D图像引擎:(6)向量函数库

    1. 数学分析 1) 基本定义: 向量由多个分量组成,2D/3D向量表示一条有向线段.下面的ux,uy就是两个分量. 向量u = <ux, uy>,如果从点P1(x1, y1)指向点P2( ...

  3. (转)从零实现3D图像引擎:(11)苍井空做客讲解3D变换矩阵的推导

    1. 数学分析 上一篇中间在做旋转的时候我直接用了旋转变换矩阵,当时觉得很尴尬,因为之前没说过是怎么产生的该矩阵. 1) 矩阵和向量的微妙关系 如果您还记得向量加法的几何意义,那么不难看懂下面的等式: ...

  4. 从零实现3D图像引擎:(14)背面消隐的三大陷阱

    1. 为什么要背面消隐 通过之前的DEMO,能够知道如果在渲染过程中多边形越多,那么要不处理的内容就越多,就越消费计算机的处理能力.对于物体来说,一般我们只看到它面对我们的面,可能不是正对着,但是肯定 ...

  5. 【Midjourney】Midjourney Prompt 提示词 ④ ( 纹身设计 | 建筑设图案 | 照片级真实性图像 | 玻璃窗设计图案 | 使用 Blender 制作的 3D 图像 )

    文章目录 一.tattoo 提示词 - 纹身设计 二.architecture / interior design 提示词 - 建筑设图案 三.photorealistic 提示词 - 照片级真实性图 ...

  6. 从零到设计、建模和实现游戏引擎的3D游戏角色模型制作

    从零到设计.建模和实现游戏引擎的游戏角色创建方法的分步指南. 1.. 概念艺术 首先,我们根据描述和风格参考创建粗略的概念艺术.在这个阶段,主要目标是创建角色的总体形状和感觉.所以它可以是黑白的. 如 ...

  7. 如何学好3D游戏引擎编程《转自3D游戏引擎网》

    此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰         --阿哲VS自己 QQ79134054多希望大家一起交流与 ...

  8. PC顶级后次世代和主流次世代图像引擎技术规格表

    作者:零zXr0 只是技术规格,也就是说支持一项效果不等于会在游戏中使用 另外,这里列出的是"原生支持",像UE3那样靠physx去支持的物理算法和靠一堆外部插件去支持的伪dx10 ...

  9. 棒!使用.NET Core构建3D游戏引擎

    原文地址:https://mellinoe.wordpress.com/2017/01/18/net-core-game-engine/ 作者:ERIC MELLINO 翻译:杨晓东(Savorboa ...

最新文章

  1. FATAL ERROR in native method: JDWP No Transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_IN,ec
  2. android 日期相减得天数_Excel日期计算方法大全
  3. (01)Verilog HDL介绍
  4. Redis入门篇(安装与启动)
  5. linux缺页异常处理--用户空间
  6. 实时操作系统与通用操作系统的一些比较
  7. 不出门也能拍好证件照
  8. 使用 Proteus 仿真单片机
  9. 微信小程序UI框架之【weui】怎样使用
  10. java 判断文件编码格式(支持zip)
  11. 【地图】高德静态地图(页面展示和导出Word)
  12. 从零开始学USB(二十四、USB接口HID类设备(六)_物理描述符)
  13. 国产电机驱动芯片TMI8870应用在智能马桶翻盖/翻圈上
  14. 备份方案技术及应用【10】
  15. strstr的用法(转)
  16. CSS的世界(十四)
  17. 微信公众号输入关键字回复WordPress搜索结果
  18. 学生用计算机调整小数点后位数,计算器怎么改小数点位数
  19. 青海出游全年时间表,你要收藏哟!
  20. 三十六、黄眉童儿的真实身份

热门文章

  1. 第二章 变量和基本类型
  2. shuffle的过程分析
  3. SylixOS网络性能测试
  4. Java初级笔记-第一章
  5. (转)android UI进阶之自定义组合控件
  6. 关闭不必要动画,提升 Win 7 运行速度
  7. 粒子群优化算法(2)离散粒子群算法
  8. mysql = 索引_深入MySQL索引
  9. tgp饥荒 服务器无响应,饥荒TGP版常见运行问题有哪些_TGP版礼包领取及邀请添加好友方法详解_快吧单机游戏...
  10. APP自动化测试系列之Desired Capabilities详解