2

我在游戏中有两个对象,为此可以将其视为 2d 平面上的点,但我使用 Vector3s,因为游戏本身是 3d。

我有一个游戏摄像机,我想垂直(也在平面上)对齐两个对象,以便它们都在摄像机的视野中。由于游戏的性质,对象可以处于任何可以想象的位置配置,因此它们之间的方向向量可以具有任何方向。

Part1:如何从两个位置向量中得到垂直角?

我有:

Vector3 object1Position; // x and z are relevant
Vector3 object2Position;

我需要:

float cameraEulerAngleY;

第 2 部分:现在,由于游戏资产的建模方式,我只想让摄像机在 180 度“锥体”内查看。因此,如果相机通过某个点,它应该使用与上述数学可能产生的完全相反的位置。

附上我需要的图像,圆圈是物体,盒子是相机。

示例案例

我希望这篇文章很清楚,你们不会因为在矢量数学上完全是垃圾而活活烧死我:P

问候,德拉克尼尔

4

3 回答 3

1

您需要distance从对象线指定 a 和up矢量:

Vector3 center = 0.5 * (object2position + object2position)
Vector3 vec12 = object2position - object1position

Vector3 normal = Cross(vec12, up)
normal.Normalize()
Vector3 offset = distance * normal

Vector3 cameraA = center + offset
Vector3 cameraB = center - offset
< choose which camera position you want >

除了使用欧拉角,您应该使用类似的东西LookAt()来定位您的相机。

于 2012-07-30T17:09:14.420 回答
1

假设 Y 始终为 0(您提到“X 和 Z”是您的相关组件),那么您可以为此使用一些二维数学:

1.找到任何垂直向量(有两个)。您可以通过计算两个向量之间的差异、交换分量并取反其中一个来得到它。

Vector3 difference = (object1Position - object2Position);
Vector3 perpendicular = new Vector3(difference.z, 0, -difference.x);

2.使用分离平面的法线,如果新矢量指向与预期相反的方向,则翻转它的方向。

Vector3 separatingPlaneNormal = ...; // down?
if(Vector3.Dot(separatingPlaneNormal, perpendicular ) < 0)
{
    perpendicular = -perpendicular ;
}

// done.
于 2012-07-30T17:26:59.580 回答
0

好吧,首先,如果你有点 (x1, y1) 和 (x2, y2) 来描述你的对象的位置,只需用三角形来考虑它。您正在寻找的角度应该被描述为

arctan((y2-y1)/(x2-x1))+90

不过,我不完全理解你想对第二部分做什么。

于 2012-07-30T15:40:34.397 回答