在3D中计算长方体的角落

如何计算长方体的八个角给定深度和高度以及两点:A(x,y,z)和B(x,y,z)?

图1. Cuboid

只有有限的数据才能计算长方体的八个角/点? 我想通过计算八个vector来制作一个只有两个3Dvector的长方体。

这对A周围的4点是有用的

  • Corner1 =(Ax + Depth / 2,Ay + Height / 2,Az)
  • Corner2 =(Axe-Depth / 2,Ay + Height / 2,Az)
  • Corner3 =(Ax + Depth / 2,Ay – Height / 2,Az)
  • Corner4 =(Axe-Depth / 2,Ay – Height / 2,Az)

而对于B的4点

  • Corner5 =(Bx + Depth / 2,By + Height / 2,Bz)
  • Corner6 =(Bx-Depth / 2,By + Height / 2,Bz)
  • Corner7 =(Bx + Depth / 2,By – Height / 2,Bz)
  • Corner8 =(Bx-Depth / 2,By – Height / 2,Bz)

编辑:正如@ DMGregory指出的,我的解决scheme只适用于与Z轴平行的长方体。

在这里输入图像说明

我假设你有一个Vector3和一个Matrix3类。 首先,我们来定义一个单位立方体:

(-0.5, -0.5, 0) (0.5, -0.5, 0) (0.5, 0.5, 0) (-0.5, 0.5, 0) (-0.5, -0.5, 1) (0.5, -0.5, 1) (0.5, 0.5, 1) (-0.5, 0.5, 1) 

现在,要创建所需的矩形,需要根据高度,深度以及AB之间的距离来缩放vector。 要做到这一点,你需要一个尺度matrix:

  | Depth 0 0 | S = | 0 Height 0 | | 0 0 |A - B| | 

哪里| AB | 是AB向量的长度

现在长方体有正确的大小。 下一步是旋转它。

因为ABvector只定义绕X(俯仰)和Y(偏航)轴的旋转,所以只需要计算这些:

为了方便,让CAB。

偏航可以通过丢弃将vector投影到XY平面的y轴来计算。 然后角度变成

 yaw = atan(Cy / Cx) 

球场有点不同。 你需要vector的长度和z分量:

 pitch = arccos(Cz / |C|) 

现在你有了角度,你需要构造一个旋转matrix:

  | 1 0 0 | | cos(yaw) 0 sin(yaw) | R = | 0 cos(pitch) -sin(pitch) | * | 0 1 0 | | 0 sin(pitch) cos(pitch) | | -sin(yaw) 0 cos(yaw) | 

为了得到长方体的角度,你需要把每个长方体的vector,乘以matrix,并添加到它:

 newPoint = R * S * point + A