Mapping 3d vertex to pixel using pyreder/pyglet/openGL(使用pyreder/pyglet/OpenGL将3D顶点映射到像素)
问题描述
我正在实现使用图像进行3D点估计的新算法,目前我正在尝试在3D虚拟模型上测试它,然后再转向真实对象。
算法输入的是最后一次转换到视区大小之前的像素,因此要在渲染图像上测试算法,我需要知道形状中像素的反向转换([0,witdh],[0,Height])。
据我所知,我正在使用来自库pyrender的透视投影来渲染3D网格的2D图像,并使用OpenGL方法进行渲染。
示例: 我有一个长方体的网格,大小=(3,1,5),中心=(0,0,0),我有投影和视图矩阵
View Matrix= [[ 0.96592583, -0.0669873 , 0.25 , 3. ],
[ 0. , 0.96592583, 0.25881905, 4. ],
[-0.25881905, -0.25 , 0.9330127 , 10. ],
[ 0. , 0. , 0. , 1. ]]
Projection Matrix= [[ 2.4142135, 0. , 0. , 0. ],
[ 0. , 2.41421356, 0. , 0. ],
[ 0. , 0. , -1.0010005 , -0.10005003],
[ 0. , 0. , -1. , 0. ]]
这是我将3D点/顶点映射到像素的计算:
def map_to_pixel(point3d,w,h,projection,view):
p=projectionpoint3d # openGL perspective projection
p=p/p[3] # divide by the w element
p[0]=w/2*p[0]+w/2 # transformation from [-1,1] -> [0,width]
p[1]=h/2*p[1]+h/2 # transformation from [-1,1] -> [0,height]
return p
在框的左上角顶点[-1.5,0.5,2.5,1]上测试它。当VIEPORT_SIZES=(宽度,高度)=(512,512)
结果=
[150.86775635, 4.28475523, 1.00894365, 1. ]
=(151,4)
当此顶点的pyrender的实际结果为像素~(90,342)
如果有人知道pyrender/OpenGL幕后的实际过程,或者知道如何正确映射像素,那将是非常有帮助的。
顺便说一句: 我知道当库使用左上角映射时,我的函数使用左下角映射,但它仍然提供意外的输出。推荐答案
我搞清楚了计算是如何进行的,我不知道为什么,但库pyrender(它使用opengl方法)使用我设置的视图矩阵的逆矩阵作为输入。
设置像素的确切函数为:
from numpy.linalg import inv
def map_to_pixel(point3d,w,h,projection,view):
p=projection@inv(view)@point3d.T
p=p/p[3]
p[0]=(w/2*p[0]+w/2) #tranformation from [-1,1] ->[0,width]
p[1]=h-(h/2*p[1]+h/2) #tranformation from [-1,1] ->[0,height] (top-left image)
return p
我已经通过此函数测试了渲染图像,所有顶点都已完美地映射到像素中。
这篇关于使用pyreder/pyglet/OpenGL将3D顶点映射到像素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用pyreder/pyglet/OpenGL将3D顶点映射到像素
基础教程推荐
- Python h5py-为什么我收到广播错误? 2022-09-21
- 从顶点坐标创建三角网格 2022-09-21
- 如何在hdf5文件的多个组之间拆分数据? 2022-09-21
- 如何将RPC与Volttron配合使用 2022-09-21
- 跟在带量词的前瞻后面有什么作用? 2022-09-22
- 获取多索引中某个级别的最后一个元素 2022-09-22
- 在 pandas 中使用带有多重索引的.loc 2022-09-22
- 在OpenCV中放大后,Python会捕捉图像的特定部分 2022-09-22
- 使用工作区API导入方法导入数据库笔记本(动态内 2022-09-21
- 如何防止Groupby超越指数? 2022-09-22