C ++将3D速度矢量转换为速度值

时间:2018-02-23 07:33:05

标签: c++ 3d game-physics trigonometry angle

在我正在研究的游戏中,我得到了游戏世界对象的速度,如此

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;
}; 

3 个答案:

答案 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矢量的大小计算如下:

Magnitude of vector

因此,在您的代码中,您希望将您的方法实现为:

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。

修改 编辑了错误输入,如评论

中所述