使角色看着球员
Make character look at player?
我需要制作一个函数,该函数将计算出使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);
注意acosf
和atan2f
返回弧度,而不是学位。如果您需要学位,请从:
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均匀变换矩阵而不是欧拉角。无论如何,您都会创建矩阵,所以为什么不使用它
-
创建/使用NPC变换矩阵
M
我的赌注是,您将其在网眼附近的某个地方放在某个地方,并且正在使用它进行渲染。如果您使用Euler Angles进行一组旋转和翻译,结果是
M
。 -
将玩家转换为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))
-
旋转角度或构造新的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')
但是要将其转换为欧拉角是另一个故事...
使用变换矩阵,您可以轻松地制作出很酷的东西,例如相机跟随,对象坐标系统之间的简单计算,简单的物理运动模拟等等。
- 具有文本角色扮演功能的移动系统
- 开发C++/地图中的控制台角色扮演游戏
- 如何在接触时重置我的角色位置?
- 为什么玩家控制器"own"偏航俯仰和滚动,但角色"owns"它的位置?
- 我的角色向左走,但不向右走(主机游戏)
- 我应该使用多个角色还是一个角色,将实际属性推迟到将数据包装/公开为其属性的QObject
- C++:将主指针传递给辅助角色
- 在C++中,我的主机游戏角色在游戏场数组内移动时不会停止
- 如何将自定义角色添加到 QFileSystemModel
- 使用C 发布到服务器时,欧洲角色切换到奇怪的字符
- 通过Addch获得意外的角色
- 为什么Arduino对Mega 2560和ESP8266的角色指针处理有两种不同的行为
- 调整我的std :: string时,角色缓冲区会发生什么
- std :: ifstream的开头角色是什么
- 如何在 c++ 中动态创建(游戏角色)类的多个对象
- 如何让球员摄像机管理器的摄像机连接到角色的弹簧臂上?
- 在循环时输入特定的角色
- 我是在构建正确的组织角色的方式,以便我可以计数它们
- 在字符串中的角色之后,我如何忽略所有内容
- C 拖拖与原始角色的比较失败