3d点投影到2d屏幕,矩阵计算

  • 背景
    • 算法
    • 完整代码
    • 待更新

背景

最近在优化VIBE输出的3D关节点抖动问题。需要将3D点投影到2D屏幕上。3D点通过相机投影到2D屏幕上,通过一系列矩阵相乘可以求得。但是具体操作实现说明太少,本文用来记录投影流程的实现。附python实现代码

算法

3d 转 2d 的流水线如下:

世界坐标系->相机坐标系->投影矩阵->像素映射->生成图片

  1. 世界坐标系和相机坐标系转换可以通过dcm矩阵计算求出

    def dcm(origin: np.ndarray, target: np.ndarray):"""3 * 3 矩阵 ,{x,y,z}T 将origin坐标系转换到target坐标系的dcm旋转矩阵Args:origin:target:Returns:"""matrix = np.zeros((3, 3))for i in range(3):for j in range(3):matrix[i, j] = np.dot(target[i], origin[j])return matrix.T
    
  2. 投影矩阵,可以参考pyrender.camera.py中的透视投影和正交投影矩阵。也可以根据自己的需求定制
  3. 通过1,2两步计算出的2d投影点,会落在(-1,1)范围内。通过像素映射完成3d点到2d点的投影

完整代码

class Camera:def __init__(self, scale, translation, resolution, znear=0.05, zfar=1000):self.scale = np.array(scale)  # 相机缩放self.translation = np.array(translation)  # 相机位移self.resolution = np.array(resolution)  # 2d 分辨率self.znear = znear  # 近平面self.h_s = self.resolution / 2  # h/2 w/2self.center = self.h_s  # 2d投影面中心点def camera_matrix(self):"""相机外参矩阵,世界坐标系转相机坐标系Returns:"""world = np.eye(3)camera = np.eye(3)camera[-1, -1] = -1matrix = np.eye(4)matrix[:3, :3] = dcm(world, camera)return matrixdef get_projection_matrix(self) -> np.ndarray:"""投影矩阵 业务定制Returns:"""P = np.eye(4)P[0, 0] = self.scale[0]P[1, 1] = self.scale[1]P[0, 3] = self.translation[0] * self.scale[0]P[1, 3] = -self.translation[1] * self.scale[1]P[2, 2] = -1return Pclass Render:def __init__(self, camera: Camera):self.camera = cameradef p_point(self, point: np.ndarray):"""投影点坐标Args:point: 点 4D 例如[0.5,0.5,0.5,1]  3d点需要填充1Returns:"""p = self.camera.get_projection_matrix().dot(self.camera.camera_matrix().dot(point)) p = p[:2] / p[-1] * self.camera.h_s * np.array([1, -1]) + self.camera.centerreturn p

待更新

  1. 图例说明

3d点投影到2d屏幕,矩阵计算相关推荐

  1. D3D坐标系统下3D世界坐标映射到2D屏幕坐标的平移矩阵

    D3D坐标系统下3D世界坐标映射到2D屏幕坐标的平移矩阵,有需要的朋友可以参考下. D3D中绘画3D模型基本上就是靠3个矩阵World, View, Projection来联合进行模型位置定位.视角定 ...

  2. DirectX 11---从空间变换来看3D场景如何转化到2D屏幕

    DirectX 11---从空间变换来看3D场景如何转化到2D屏幕 在看<Introduction to 3D Game Programming with DirectX 11>的时候,发 ...

  3. Python 3D函数图形投影到2D坐标轴上

    1.contourf函数命令 cmap = matplotlib.cm.jetnorm = matplotlib.colors.Normalize(vmin=min(np.array(sol)), v ...

  4. 全息投影,3D全息投影,互动投影,VR虚拟互动投影技术整体解决方案

    1.3D全息投影 全息投影.3D全息互动投影是记录被摄体反射(或透射)光波中所有信息(振幅.相位)的摄影技术,物体反射或透射的光通过记录薄膜,可以实现.通过从不同的方位和角度观看照片,可以看到拍摄的物 ...

  5. 佩京科技 | 3D全息投影宴会厅,最具梦幻神秘的视觉餐厅!

    3D全息宴会厅作为酒店升级的一种手段,吸引了不少酒店企业的关注和引进.它打破了打破传统餐厅设计理念,巧妙融入全息投影技术,打造味觉.听觉.视觉,360度用餐体验. 3D全息沉浸式宴会厅优势: ①裸眼3 ...

  6. [Unity官方文档翻译]2D or 3D Projects Unity中2D和3D项目的区别

    2D or 3D Projects 2D或3D项目 Unity is equally suited to creating both 2D and 3D games. But what's the d ...

  7. 将3D坐标转成2D坐标的方法

    将3D坐标转成2D坐标的方法.3D坐标在Unity中称作World Space,2D坐标称作Screen Space, 是以pixel为基准,以iPad 1024 x 768(4:3)的解析度为例子: ...

  8. iphone投影到电脑屏幕,QuickTime出现报错和黑屏的解决方案

    iPhone投影到电脑屏幕的问题 iphone投影到win10 iphone投影到mac 因为想看的视频在iphone的某个app上才有弹幕显示,于是有了投影iphone屏幕到电脑上的需求.做过以下尝 ...

  9. 3d全息投影技术在教学中有什么好处

    随着3d全息投影技术的日益成熟,许多我们以前无法实现的功能逐渐出现在我们的视野中,小编相信每个人都对3d全息投影技术有一定的了解,新起典文旅科技带大家了解3d全息投影技术在教学中有什么好处? 3d全息 ...

最新文章

  1. Spring中Quartz的配置
  2. cs专业学生对于家乡的思考
  3. 添加组合索引时,做相等运算字段应该放在最前面
  4. 静态html的ajax如何发请求,静态页面ajax - 冥焱的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. 列举python的五个数据类型_python笔记--数据类型--列表
  6. djpython教程_简单介绍Python的Django框架的dj-scaffold项目
  7. 上海高考女生计算机专业,@2020高考:女生最多的15个专业,一辈子的好友就在这里...
  8. 2014 Louis Vuitton 40769 apricot NevadaJack Nicklaus
  9. 新手在前期应该怎样发“外链”(4)之终级外链法
  10. shopex admincore.php,shopex网店系统更换空间后出错:Fatal error: Incompatible file format:...
  11. java读取树形excel,然后入库
  12. ionic emulate实时调试修改
  13. 埃隆·马斯克(Elon Musk)
  14. 游戏辅助 -- 走路call中ecx值分析
  15. 【赛码网 牛客网】输入输出总结(python版)
  16. [TS初学]无法重新声明块范围变量
  17. 安卓熊猫视频压缩器v1.1.51高级版
  18. 1-3 Burpsuite 抓取手机APP流量
  19. iPhone 4的Romurs
  20. 小米手机连接青花瓷抓包(https)

热门文章

  1. 【51Nod四级题】宝石猎人
  2. 封面你来定,给《新程序员·云原生和全面数字化时代》选封面啦
  3. Cocos2d-x初学者教程
  4. 使用shell脚本下载sftp文件
  5. c语言中assert函数是什么
  6. 01、CentOS 7 部署GitLab
  7. 第三部分 数据结构 -- 第四章 图论算法1386:打击犯罪(black)
  8. 连接器ROHS 2.0检测
  9. 视频教程-Excel拨云见日-Office/WPS
  10. 水手猴子和椰子程序matlab,济南少儿编程:编程巧解奥数题 - 水手分椰子,作为家长的你会吗?~山东少儿编程~少儿编程...