2011-11-21 171 views
2

我正在与源sdk(它使用C++)工作,我想旋转一个实体的角度,所以它看起来在另一个实体。3D矢量(X,Y,Z)看矢量

一个实体可以看作是一个游戏对象或类似物,并且在世界以及角度(矢量)中都有一个位置(矢量)。

我可以使用SetAbsAngles旋转实体,它使用QAngle(基本矢量)作为参数。

Explanation of what I want and have

+0

如果您想要不知道源SDK的人的答案,您可能想要解释SetAbsAngles实际上在做什么,以及SDK提供的其他方式来改变实体在功能和参数方面的方向。 – sellibitze

回答

3

下面是一些伪代码:

vec3 p = entity2->getPosition(); 
vec3 r = entity1->getPosition(); 
float xdistance = p[0] - r[0]; 
float ydistance = p[1] - r[1]; 
float zdistance = p[2] - r[2]; 
float xzdistance = sqrt(xdistance * xdistance + zdistance * zdistance); 
entitity1->setHeading(atan2(xdistance, zdistance)); // rotation around y 
entitity1->setPitch(-atan2(ydistance, xzdistance)); // rotation around x 
entitity1->setBank(0); // rotation around z 

的z旋转设定为0,因为它不能被确定。如果你喜欢,你可以随意设置。

这适用于z向前,y向上且x向右的坐标系。如果您使用不同的系统,您可能需要调整一些标志。

+0

什么是setHeading,setPitch和setBank? 我似乎没有在我的实体中使用这些方法。 – Dumpen

+0

Heading/Pitch/Bank是描述y/x/z旋转的术语(按此顺序)。如果我正确理解源sdk文档,则标题对应于-Yaw,Pitch to Pitch和Bank to Roll。所以你将不得不使用像SetAbsAngles(QAngle(pitch,-heading,bank)); –