使角色看着球员

Make character look at player?

本文关键字:角色      更新时间:2023-10-16

我需要制作一个函数,该函数将计算出使NPC查看播放器中心所需的学位。但是,我无法找到有关3个维度的任何结果,这就是我所需要的。只有2个维方程。我正在用C 编程。

信息:

数据类型:float。

垂直轴:90正在直视,-90望向向下看,0望向前方。

水平轴:0到360之间的正值,北部为0,东部为90,南180,西270。

请参阅Wikipedia的这些转换方程。但是请注意,由于您希望"高程"或"垂直轴"在XY平面上为零,因此您需要在" theta测量参考平面的高程而不是从Zenith的倾斜度上"。p>首先,找到从NPC到播放器的向量以获取值x, y, z,其中x对东方是正面的,y对北部是正的,z是正的。

然后您有:

float r = sqrtf(x*x+y*y+z*z);
float theta = asinf(z/r);
float phi = atan2f(x,y);

,否则您可以将第一个声明替换为

的精确度
float r = hypotf(hypotf(x,y), z);

注意acosfatan2f返回弧度,而不是学位。如果您需要学位,请从:

开始
theta *= 180./M_PI;

theta现在是您的"垂直轴"角。

此外,Wikipedia的phi = arctan(y/x)在正x轴上假定为零的方位角,在正y轴上为pi/2。由于您希望在北方方向零的方位角,而在东方方向为90,因此我切换到atan2f(x,y)(而不是更常见的atan2f(y,x))。另外,atan2f还将一个值从-pi返回到PI(包括PI),但您需要严格的正值。所以:

if (phi < 0) {
    phi += 2*M_PI;
}
phi *= 180./M_PI;

现在phi是您所需的"水平轴"角度。

我对涉及旋转和3D设想的数学不太熟悉,但是您不能从坐标绘制一条线,从坐标到NPC的坐标或Vise Versa,反之亦然,并且具有近似功能正确旋转到该线,直到在接受/-范围内?这样,它就是通过增加和减少垂直和水平值直到范围降低的,这只是一个问题,这只是什么原因首先增加或减少的问题,您可以根据NPC的位置状态确定。但是我觉得这是真正la脚的方式。

为此使用4x4均匀变换矩阵而不是欧拉角。无论如何,您都会创建矩阵,所以为什么不使用它

  1. 创建/使用NPC变换矩阵M

    我的赌注是,您将其在网眼附近的某个地方放在某个地方,并且正在使用它进行渲染。如果您使用Euler Angles进行一组旋转和翻译,结果是M

  2. 将玩家转换为NPC LCS笛卡尔位置

    GCS 表示全局坐标系和 LCS 是指本地坐标系统。位置是 3D 向量xyz = (x,y,z,1)转换位置将是其中之一(取决于您使用的约定)

    xyz'=M*xyz
    xyz'=Inverse(M)*xyz
    xyz'=Transpose(xyz*M)
    xyz'=Transpose(xyz*Inverse(M))
    
  3. 旋转角度或构造新的NPC矩阵

    您知道您的 NPC 的旧坐标系统,因此您可以从中提取X,Y,Z,O向量。现在,您只需将视图方向(通常是-Z)设置为指向播放器的轴即可。这很容易

    -Z = normalize( xyz' - (0,0,0) )
     Z = -xyz' / |xyz'|
    

    现在只是利用交叉产品并使其他轴再次垂直于z,因此:

    X = cross(Y,Z)
    Y = cross(Z,X)
    

    并将向量馈回您的 NPC 的矩阵。这样,移动对象也容易得多。同样要锁定侧面旋转,您可以在此之前将其中一个向量设置为Up

    如果您仍然想计算旋转,则是:

    ang = acos(dot(Z,-xyz')/(|Z|*|xyz'|))
    axis = cross(Z,-xyz')
    

    但是要将其转换为欧拉角是另一个故事...

使用变换矩阵,您可以轻松地制作出很酷的东西,例如相机跟随,对象坐标系统之间的简单计算,简单的物理运动模拟等等。