前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >球体投影到像素空间的大小

球体投影到像素空间的大小

作者头像
charlee44
发布2022-09-28 16:00:34
2.3K0
发布2022-09-28 16:00:34
举报

1. 概述

需要说明的是,球体投影到像素空间的结果可能不是一个正圆,其半径或者直径大小只能估算而没有确定的值。根据参考资料,球体投影到像素空间的半径的计算公式为:

radius_{[clip\_space]} = radius * cot(fov / 2) / Z \tag{0}

其中radius是球体的半径,fov是摄像机视场角,z是球心到摄像机位置的距离。当然,由于最后得到的是裁剪空间的大小,需要换算到屏幕像素空间。

2. 详论

根据我的理解,这个公式也是近似的。本人通过参考文献得到的推导方式如下所示。

使用参考文章4中的插图:

imglink0
imglink0

球体投影到像素空间的半径其实就是h的像素长度。此时,有:

tan\theta = radius_{[clip\_space]} / z_{[clip\_space]} \tag{1}

球体被投影到裁剪空间:

imglink1
imglink1

由投影变换的性质可知:

tan(fovy / 2) = 1 / z_{[clip\_space]} \tag{2}

联立(1)(2)式有,

radius_{[clip\_space]} = tan\theta * cot(fovy / 2) \tag{3}

根据世界空间的集合关系,有:

tan\theta = r / l \tag{4}

式(4)带入式(3)中,有:

radius_{[clip\_space]} = r * cot(fovy / 2) / l \tag{5}

在摄像机距离球心比较远的情况下,可以认为:

l \approx d

也就是式(0)的由来。如果需要计算准确一点,那么:

l = \sqrt{d^2 - r^2} \tag{6}

上式带入式(5),就会有:

radius_{[clip\_space]} = r * cot(fovy / 2) / \sqrt{d^2 - r^2} \tag{7}

最后换算到屏幕像素空间:

radius_{[screen\_space]} = \frac{r \cdot cot(\frac{fovy}{2}) \cdot height} {2\sqrt{d^2 - r^2}} \tag{8}

3. 参考

  1. calculate pixelsize on screen from boundingsphere
  2. Calculating radius of projected sphere
  3. Radius of projected Sphere
  4. Radius of projected sphere in screen space
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 概述
  • 2. 详论
  • 3. 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档