这将是一个相当复杂的解释,所以请耐心等待。在 3D 空间中,玩家有 2 个旋转值用于观察周围,即绕 x 轴和 y 轴的旋转。给定一个 View 距离,我计算了玩家视口(viewport)中心的点,即 View 距离(如下所示)。
- 'vd'是视距
- “c”是值持有者
- '(x,y,z)'是要计算的点
- “rot.x”和“rot.y”分别是绕 x 轴和 y 轴的旋转。
给定这个点(x,y,z),我需要计算相对于这个位置的四个点(如下所示)
- “(x2,y2,z2)”、“(x3,y3,z3)”等是我需要计算的点。
- 果岭平面的宽度和高度已知。让我们分别将每个称为“w”和“h”。
现在,鉴于我仍然可以访问第一个图表中的所有值(例如旋转等),我如何计算四个点中的每一个?
一点背景知识..我这样做是为了一种称为截头体剔除的剔除方法。我正在尝试使用 LWJGL 来实现此目的,以加快渲染速度并减少 GPU 的负担。我一直无法计算出这个计算的三角函数,在过去的几个小时里我一直在尝试。任何帮助表示赞赏。如果需要更多解释/澄清,请告诉我。谢谢。
编辑:此外,这些点必须位于同一平面上,并与点 (x,y,z) 绕 x 和 y 轴旋转。
最佳答案
假设旋转顺序为先 X 旋转,然后 Y 旋转,则矩阵计算为:
V*Ry*Rx
自从V vector 建立以来。
V = [view_distance, tan(22.5)*view_distance, tan(22.5)*view_distance*(WIDTH/HEIGHT)]
那么这意味着:
X2 = cos(rot.Y) * view_distance -
(tan(22.5) * WIDTH * view_distance * sin(rot.Y))/HEIGHT
Y2 = tan(22.5) * cos(rot.X) * view_distance +
(tan(22.5) * WIDTH * cos(rot.Y) * view_distance * sin(rot.X))/HEIGHT +
view_distance * sin(rot.X) * sin(rot.Y)
Z2 = (tan(22.5) * WIDTH * cos(rot.X) * cos(rot.Y) * view_distance)/HEIGHT -
tan(22.5) * view_distance * sin(rot.X) +
cos(rot.X) * view_distance * sin(rot.Y)
表达式可以进一步简化,因为例如 View 距离可以从所有表达式中分解出来。由于计算这个有点毫无意义并且容易出错,所以我更喜欢使用带有数值的矩阵函数,因为它更容易。
PS:矩阵表示法对您的眼睛和编程体验来说更容易。
关于java - 计算 3D 空间中相对于另一个点的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13781233/