如何解决如何将 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 但在 y 和右下角不同的颜色中拉伸)
使用所有矩阵
请问有人可以帮我吗? 提前致谢:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。