我在游戏中有两个对象,为此可以将其视为二维平面上的点,但我使用Vector3s因为游戏本身是3d。
我有一个游戏相机,我想垂直(也在平面上)对齐两个物体,这样它们都可以看到相机。由于游戏的性质,对象可以处于任何可以想象的位置配置,因此它们之间的方向向量可以有任何方向。
第1部分:如何从两个位置矢量得到垂直角度?
我有:
Vector3 object1Position; // x and z are relevant
Vector3 object2Position;
我需要:
float cameraEulerAngleY;
第2部分:现在,由于游戏资产的建模方式,我想只允许摄像机在180度的“锥形”内查看。因此,如果相机通过某个点,它应该使用上述数学可能产生的完全相反的位置。
附上我需要的图像,圆圈是物体,盒子是相机。
我希望这篇文章很清楚,你们不会因为在矢量数学中完全垃圾而活着我:P
问候, Draknir
答案 0 :(得分:1)
您需要从对象行指定distance
,并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()
这样的东西来定位相机。
答案 1 :(得分:1)
假设Y始终为0(您提到“X和Z”是您的相关组件),那么您可以使用一些2-d数学:
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.
答案 2 :(得分:0)
嗯,对于第一位,如果你有描述物体位置的点(x1,y1)和(x2,y2),那就用三角形来思考它。你正在寻找的角度应该用
来描述arctan((y2-y1)/(x2-x1))+90
我不完全理解你想要用第二部分做什么。