【问题标题】:Calculating point relative to another point in 3D space计算相对于 3D 空间中另一个点的点
【发布时间】:2012-12-08 19:47:43
【问题描述】:

这将是一个相当复杂的解释,请耐心等待。在 3D 空间中,玩家有 2 个用于环顾四周的旋转值,即围绕 x 轴和 y 轴的旋转。给定一个视距,我计算了玩家视口中心的点,即视距(如下所示)。

  • '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 轴旋转。

【问题讨论】:

  • 通过将位置形成为矩阵然后将其与投影矩阵相乘,使用矩阵数学进行计算不是很简单吗?还是您的问题实际上是如何形成投影矩阵?所以在这种情况下,只需制作旋转矩阵和位置矩阵,然后将它们与投影矩阵相乘。
  • 我对矩阵没有任何经验。到目前为止,我已经设法使用它们。因此,无需提取透视矩阵或任何计算点的答案将是可取的。
  • 问题是使用矩阵的确切意义在于实际上消除了完全理解数学的需要。矩阵就是很好地打包成矩阵形式的三角函数。因为矩阵可以组合在一起形成一个实体,可以一次性完成整个事情。这消除了一起执行所有步骤的需要,因为您一次只能设计任何一个子步骤。事实上,furstrum culling 可以表示为矩阵形式,就好像点在 furstrum 空间 -1 到 1 之外一样。为您节省大量计算。
  • 但我真的宁愿不使用矩阵。必须使用矩阵的“加法”、“减法”等方法完成的内部计算对计算几乎没有改进。只用一种方法就可以更轻松地完成所有数学运算。这与查找一个点是否位于平截头体空间内是一样的。所以没有矩阵的方法会很好..
  • 只是简单的旧三角法

标签: java 3d rotation trigonometry lwjgl


【解决方案1】:

假设旋转顺序是先X再Y旋转,那么矩阵计算为:

V*Ry*Rx

自从V向量成立以来。

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)

表达式可以再简化一点,因为例如可以从所有表达式中考虑视图距离。由于计算这有点毫无意义且容易出错,所以 id 更喜欢使用带有数值的矩阵函数作为更容易的东西。

PS:矩阵表示法对你的眼睛和你的编程体验来说更容易。

【讨论】:

  • 谢谢!但是三角仍然更好:P
  • @MrDoctorProfessorTyler 是的,很快就会变得复杂。 ;) 使用 wolfram alpha。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
相关资源
最近更新 更多