我的目标是创建 3D 线,提供线上所述线的单位测量。我已经获得了要渲染的线条和文本,但我想要某种方法将文本的旋转锁定到线条并使其面向玩家。我尝试使用玩家的俯仰和偏航旋转来让文本面向他们;然而,以这种方式旋转它会导致它很容易与附近的测量单位重叠。此外,我还需要判断玩家是在线条前面还是后面才能翻转渲染的文本。 我尝试过围绕矩阵旋转向量,但运气不佳。要么我做得不对,要么我使用的方法不是解决方案。如果有人有任何建议,请告诉我。我已经束手无策了。 到目前为止我所拥有的
我尝试获取垂直于中点的点,这样我就可以获取中点、垂直点和玩家相机的角度。然后,通过角度,我可以旋转文本。但每次我尝试在这个网站和其他网站上找到的不同解决方案时,它们似乎从未始终保持垂直于直线。当线的方向向量为 1,0,0 时它会起作用,但一旦 y 或 z 轴发生偏移,它就会中断。
我不太清楚你的文本是由什么组成的(点、线、顶点),但是如果你有一种方法可以在 3d 中旋转文本(z 轴旋转和 x 轴旋转),那么你可以找到2 个角度如下。
请注意,在此示例中,Z 轴朝上,因此请根据您的需要调整任何值。
首先计算从您想要旋转的形状(在本例中是您的文字)到您想要将其旋转到的任何点(在本例中是玩家)的 x、y 和 z 距离。 x 距离和 y 距离将用于使用三角学计算 z 轴旋转(沿 x 和 y 轴制作三角形并求解角度)。您可以使用 Math.atan2(y_dist, x_dist) 函数来查找 z 轴旋转。然后你必须找到从形状(你的文本)到玩家的距离,忽略 z 距离。您可以通过减去形状和玩家之间的 z 差异,然后对结果点和玩家执行距离公式来完成此操作。这将得到 x-y 平面上的对角线距离,忽略 z 距离。然后,您可以再次使用 Math.atan2(zdist, distance_ignoring_Z) 来查找 x 轴旋转。我包含了一些为我的 3d 引擎编写的代码,我在其中解决了同样的问题。
//turns the shape about itself torwards a point
public void turnTowards(Point3D p) {
Point3D centroid = this.getCentroid();
//finds the x, y, and z distances to the point from the centroid of this shape
double xdiff = centroid.getX()-p.getX();
double ydiff = centroid.getY()-p.getY();
double zdiff = centroid.getZ()-p.getZ();
//then finds a point that is on the same z level as the point it is rotating towards
Point3D sameZLevelPoint = centroid.add(new Point3D(0, 0, -zdiff));
//then finds the distance from the same z level point to the point we are rotating to. this is so when we do the atan2 function, we are performing it on a triangle directly between the two points rather than axis aligned to the x or y axes
double diagdiff = sameZLevelPoint.distance(p);
//finds the two angles it needs to rotate by
double zrot = Shape.radtodeg(Math.atan2(ydiff, xdiff));
double xrot = Shape.radtodeg(Math.atan2(zdiff, diagdiff));
}
我知道这有点晚了,我试图帮助将来可能会看到这篇文章的任何人,但如果您仍在尝试解决这个问题,请提出您需要的任何澄清问题。