首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pyreder/pyglet/openGL将3d顶点映射到像素

使用pyreder/pyglet/openGL将3d顶点映射到像素
EN

Stack Overflow用户
提问于 2021-05-13 18:37:40
回答 1查看 136关注 0票数 0

我正在实现使用图像进行3d点估计的新算法,现在我正尝试在移动到真实对象之前在3d虚拟模型上测试它。

算法输入是最后一次转换到视口大小之前的像素,因此要在渲染图像上测试算法,我需要知道形状中像素的反向转换(0,witdh,0,height)。

我正在使用pyrender库中的透视投影来渲染3d网格的2d图像,据我所知,这个库使用OpenGL方法进行渲染。

例如:我有一个长方体的网格,其中sizes=(3,1,5),center=(0,0,0),我有投影和视图矩阵

代码语言:javascript
复制
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点/顶点映射到像素的计算:

代码语言:javascript
复制
def map_to_pixel(point3d,w,h,projection,view):
    p=projection@view@point3d # 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。当viewport_sizes=(宽度,高度)=(512,512)

results= [150.86775635, 4.28475523, 1.00894365, 1. ]= (151,4)

当pyrender对此顶点的实际结果为像素~ (90,342)时

如果有人知道pyrender/OpenGL幕后的实际过程,或者知道如何正确地映射像素,这将是非常有帮助的。

顺便说一下:我知道我的函数在库使用左上角映射时使用左下角映射,但它仍然会给出意想不到的输出。

EN

回答 1

Stack Overflow用户

发布于 2021-05-14 20:53:52

我搞清楚了计算是如何进行的,我不知道为什么,但是pyrender库(它使用OpenGL方法)使用我设置的视图矩阵的逆矩阵作为输入。

设置像素的确切函数是:

代码语言:javascript
复制
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

我已经通过这个函数测试了渲染的图像,所有的顶点都被完美地映射到像素中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67517809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档