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

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。由于比较复杂,如图所示:

3D球面坐标系

现在可以推导一下(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) 结构体定义

 

2) 转换函数定义

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

 

 

3. 代码下载

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

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值