码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 球体投影到像素空间的大小


    1. 概述

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

    r a d i u s [ c l i p _ s p a c e ] = r a d i u s ∗ c o t ( f o v / 2 ) / Z (0) radius_{[clip\_space]} = radius * cot(fov / 2) / Z \tag{0} radius[clip_space]​=radius∗cot(fov/2)/Z(0)

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

    2. 详论

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

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

    imglink0

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

    t a n θ = r a d i u s [ c l i p _ s p a c e ] / z [ c l i p _ s p a c e ] (1) tan\theta = radius_{[clip\_space]} / z_{[clip\_space]} \tag{1} tanθ=radius[clip_space]​/z[clip_space]​(1)

    球体被投影到裁剪空间:
    imglink1

    由投影变换的性质可知:

    t a n ( f o v y / 2 ) = 1 / z [ c l i p _ s p a c e ] (2) tan(fovy / 2) = 1 / z_{[clip\_space]} \tag{2} tan(fovy/2)=1/z[clip_space]​(2)

    联立(1)(2)式有,
    r a d i u s [ c l i p _ s p a c e ] = t a n θ ∗ c o t ( f o v y / 2 ) (3) radius_{[clip\_space]} = tan\theta * cot(fovy / 2) \tag{3} radius[clip_space]​=tanθ∗cot(fovy/2)(3)

    根据世界空间的集合关系,有:
    t a n θ = r / l (4) tan\theta = r / l \tag{4} tanθ=r/l(4)

    式(4)带入式(3)中,有:
    r a d i u s [ c l i p _ s p a c e ] = r ∗ c o t ( f o v y / 2 ) / l (5) radius_{[clip\_space]} = r * cot(fovy / 2) / l \tag{5} radius[clip_space]​=r∗cot(fovy/2)/l(5)

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

    也就是式(0)的由来。如果需要计算准确一点,那么:
    l = d 2 − r 2 (6) l = \sqrt{d^2 - r^2} \tag{6} l=d2−r2 ​(6)

    上式带入式(5),就会有:
    r a d i u s [ c l i p _ s p a c e ] = r ∗ c o t ( f o v y / 2 ) / d 2 − r 2 (7) radius_{[clip\_space]} = r * cot(fovy / 2) / \sqrt{d^2 - r^2} \tag{7} radius[clip_space]​=r∗cot(fovy/2)/d2−r2 ​(7)

    最后换算到屏幕像素空间:
    r a d i u s [ s c r e e n _ s p a c e ] = r ⋅ c o t ( f o v y 2 ) ⋅ h e i g h t 2 d 2 − r 2 (8) radius_{[screen\_space]} = \frac{r \cdot cot(\frac{fovy}{2}) \cdot height} {2\sqrt{d^2 - r^2}} \tag{8} radius[screen_space]​=2d2−r2 ​r⋅cot(2fovy​)⋅height​(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
  • 相关阅读:
    基于WebGL、Cesium技术的三维空间可视化
    EasyNVR视频边缘计算网关硬件设备拔电关闭后不能自动重启的原因分析
    金仓数据库KingbaseES客户端编程开发框架-MyBatis-Plus(4. MyBatis-Plus注意点)
    17.3 实现无管道反向CMD
    2022年夏季《移动软件开发》实验报告六
    2年开发经验去面试,吊打面试官,即将面试的程序员这些笔记建议复习
    【QT小记】QT中QString与常用字符编码转换
    万能曲线公式4800
    Python学习第五篇:操作MySQL数据库
    内网渗透-内网环境下的横向移动总结
  • 原文地址:https://blog.csdn.net/charlee44/article/details/126809428
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号