gpt4 book ai didi

graphics - 旋转3D立方体透视问题

转载 作者:行者123 更新时间:2023-12-01 00:06:41 27 4
gpt4 key购买 nike

自从我 13 岁开始玩 AMOS 3D 以来,我一直想学习如何编写 3D 图形。现在,10 年后,我终于认为我已经积累了足够的数学知识,可以试一试。

我遵循了各种教程,并将 screenX(和 screenY,等效地)定义为

screenX = (pointX * cameraX) / distance

(加上偏移和缩放。)

我的问题是距离变量实际指的是什么。我已经看到距离被定义为相机和点之间 z 的差异。然而,这并不完全正确,因为 x 和 y 对从相机到点的实际距离具有与 z 相同的影响。我实现了距离作为实际距离,但结果给出了一个有点倾斜的视角,好像它有“太多”的视角。

我的“实际距离”实现是这样的:
distance = new Vector(pointX, pointY, cameraZ - pointZ).magnitude()

玩弄代码,我在我的方程中添加了一个额外的变量,一个perspectiveCoefficient,如下所示:
distance = new Vector(pointX * perspectiveCoefficient, 
pointY * perspectiveCoefficient, cameraZ - pointZ).magnitude()

出于某种原因,这超出了我的理解,我倾向于将透视系数设置为 1/sqrt(2) 以获得最佳结果。

我的 3D 测试立方体在 http://vega.soi.city.ac.uk/~abdv866/3dcubetest/3dtest.svg . (在 Safari 和 FF 中测试过。)它会提示您输入透视系数,其中 0 表示不考虑 x/y 距离的透视,1 表示同样考虑 x、y 和 z 距离的透视。默认为 1/sqrt(2)。立方体可以使用箭头键围绕 x 和 y 旋转。 (对于任何感兴趣的人,相关代码在 View.js 文件中的 update() 中。)

感谢您对此的任何想法。

最佳答案

通常,投影是在 Z=0 平面上从该平面后面的眼睛位置完成的。投影点是线 (Pt,Eye) 与 Z=0 平面的交点。最后你会得到类似的东西:

screenX = scaling * pointX / (1 + pointZ/eyeDist)
screenY = scaling * pointY / (1 + pointZ/eyeDist)

我在这里假设相机在 (0,0,0) 处,眼睛在 (0,0,-eyeDist) 处。如果 eyeDist 变得无限大,您将获得平行投影。

关于graphics - 旋转3D立方体透视问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1116152/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com