微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 3D 坐标投影到 2D (Python) 上?

如何解决如何将 3D 坐标投影到 2D (Python) 上?

我发布这个问题是想询问是否有人可以帮助我将 3D 点 [xyz] 投影到 2d 平面(屏幕 [x,y])上。

我已经整理了点的旋转和平移,但是我无法成功地将透视正确地放入点中。它要么使 3d 长方体在某些角度像领结一样穿过自身,而在其他角度则很好。

这是我用来处理这些点的代码

### Rotation in X using Y and Z
x_angle = MATH.atan(point[2] - viewing_position[2],point[1] - viewing_position[1])+viewing_angle[0] #current angle from y axis and point

if x_angle > 360: x_angle -= 360
elif x_angle < 0: x_angle += 360
        
rp1d = [
            point[0],viewing_position[1] + (MATH.COS(x_angle) * findManhattan(viewing_position[1:],point[1:])),viewing_position[2] + (MATH.SIN(x_angle) * findManhattan(viewing_position[1:],point[1:]))]  
        
### Rotation in Y using X and Z
y_angle = MATH.atan(rp1d[0] - viewing_position[0],rp1d[2] - viewing_position[2]) + viewing_angle[1]

if y_angle > 360: y_angle -= 360
elif y_angle < 0: y_angle += 360
        
rp2d = [
            viewing_position[0] + (MATH.SIN(y_angle) * findManhattan([viewing_position[0],viewing_position[2]],[rp1d[0],rp1d[2]])),rp1d[1],viewing_position[2] + (MATH.COS(y_angle) * findManhattan([viewing_position[0],rp1d[2]]))]

        
rp3d = rp2d ## add z axis rotation

rp3d.append(1)
translated_point = gTM(viewing_position,rp3d)[:3] #translates points to position relative to the camera,truncates point back to xyz
del rp3d[-1]

### The area not working: VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

pp = mMx([
                    [(1080/1920)*(1/(MATH.TAN(fov/2))),0],[0,1/MATH.TAN(fov/2),far/(far-near),1],(-far*near)/(far-near),0]
                 ],[
                     translated_point[0],translated_point[1],translated_point[2],1
                 ]
                )

        
        
pp = mMx([
                    [1/pp[2],1/pp[2],1,1]
                 ],pp)

           
pp = mMx([
                    [1/pp[3],1/pp[3],pp)
        
        
### ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

projected_points.append([pp[0]*scale + positions[0],pp[1]*scale + positions[1]]) #projected and centralised

上面的代码在屏幕上输出带有 X 和 Y 值的 2D 点,但这不起作用。顺便说一下,我已经处理了渲染。场景应该是相机下方一定距离的紫色地面和相机上方两倍距离的黄色立方体太阳。

以下是一些截图:

不除以 w(引用了第三个预计点变化语句)

Not dividing by w (third projected point change statement quoted out)

The same test run

只除以 w

Only dividing by w

只除以 z

Only dividing by z

不除以 z

Not dividing by z

The same test run,looks somewhat normal here

不使用投影矩阵

Not using projection matrix

仅使用投影矩阵(类似于仅除以 w 但在 y 和右下角不同的颜色中拉伸)

Only using projection matrix (similar to only dividing by w however stretched in the y and different bottom right colour)

使用所有矩阵

Using all matrices

Same test run

不使用矩阵

Using no matrices

请问有人可以帮我吗? 提前致谢:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。