在我正在研究的游戏中,我得到了游戏世界对象的速度,如此
void getObjectVelocity(int objectID, vec3_t *velocityOut);
所以如果我像这样调用这个函数
vec3_t storeObjectVelocity;
getObjectVelocity(21/* just an example ID */, &storeObjectVelocity);
ID为21的对象的速度将存储在storeObjectVelocity
。
出于测试目的,我试图根据游戏画面中间的速度打印此对象的速度。
这里有一个例子,只是为了让您更好地了解我想要实现的目标
int convertVelocityToSpeed(vec3_t velocity)
{
//This is where I am having issues.
//Converting the objects 3D velocity vector to a speed value
}
int testHUDS()
{
char velocityToSpeedBuffer[32] = { 0 };
vec3_t storeObjectVelocity;
getObjectVelocity(21, &storeObjectVelocity);
strcpy(velocityToSpeedBuffer, "Speed: ");
strcat(velocityToSpeedBuffer, system::itoa(convertVelocityToSpeed(storeObjectVelocity), 10));
render::text(SCREEN_CENTER_X, SCREEN_CENTER_Y, velocityToSpeedBuffer, FONT_SMALL);
}
如果您想知道
,这是我的vec3_t
结构
struct vec3_t
{
float x, y, z;
};
答案 0 :(得分:4)
矢量的长度计算为 √(x²+y²+z²)
所以在你的程序中,这样的东西会起作用:
std::sqrt( velocity.x * velocity.x + velocity.y * velocity.y + velocity.z * velocity.z )
正如@Nelfeal评论的那样,最后一种方法可能会溢出。使用std::hypot
可以避免此问题。由于更安全且更清晰,如果C ++ 17可用,这应该是第一个选项。即使知道效率较低。请记住避免过早的微观优化。
std::hypot(velocity.x, velocity.y, velocity.z)
此外,您应该考虑将velocity
作为const引用传递给函数。
答案 1 :(得分:1)
速度是由速度矢量|velocity|
的大小给出的标量。 3D矢量的大小计算如下:
因此,在您的代码中,您希望将您的方法实现为:
int convertVelocityToSpeed(vec3_t velocity)
{
return std::sqrt(velocity.x * velocity.x + velocity.y * velocity.y + velocity.z * velocity.z);
}
您可能需要包含数学标题#include <cmath>
并且我假设您的vec3_t
保留int
值,尽管这在物理模拟中是不寻常的速度,它们通常是浮点类型。如果不是,您需要检查您的退货类型。
答案 2 :(得分:0)
#include <cmath>
using namespace std;
sqrt(pow(velocity.x,2), pow(velocity.y,2), pow(velocity.x,2));
使用来自cmath的sqrt和来自cmath的pow。
修改强> 编辑了错误输入,如评论
中所述