0

我去过这个网站试图整理我的汽车运动。http://www.helixsoft.nl/articles/circle/sincos.htm

由于我使用过的 sin 和 cos,我一直在将汽车绕一圈移动时遇到问题,尽管该站点确实使用定点数并且我想使用浮点数,但我认为我已经正确完成了。

这是我的代码

    if(myEngine->KeyHeld(Key_W))
    {
        length -= carSpeedIncrement;
    }
    if(myEngine->KeyHeld(Key_S))
    {
        length += carSpeedIncrement;
    }
    if(myEngine->KeyHeld(Key_A))
    {
        angle -= 0.01f;
    }
    if(myEngine->KeyHeld(Key_D))
    {
        angle += 0.01f;
    }

    carVolocityX = length * (sin(angle));
    carVolocityZ = length * (cos(angle));

    carPositionX += carVolocityX; 
    carPositionZ += carVolocityZ; 

    car[0]->MoveX((carPositionX * sin(angle)) * frameTime);
    car[0]->MoveZ((carPositionZ * cos(angle)) * frameTime);

我对如何做这个动作的新想法持开放态度,但它必须使用向量。任何人都可以看到我在哪里出错了。

任何帮助表示赞赏。

4

2 回答 2

1

根据您对 MoveX 和 MoveZ 的看法,我认为问题在于您试图将绝对位置传递给期望速度的函数。尝试

car[0]->MoveX(carVolocityX * frameTime);
car[0]->MoveZ(carVolocityZ * frameTime);
于 2012-04-05T20:40:05.577 回答
0

为什么在计算速度矢量和计算汽车的新位置时都应用 sin 和 cos?

您的代码看起来像是在尝试使用键盘驾驶汽车。如果是这种情况,试试这个

car[0]->MoveX((carPositionX) * frameTime);
car[0]->MoveZ((carPositionZ) * frameTime);

请注意,我发现在实际计算距离期间应用 frameTime 更清楚,并建议进行此编辑:

carPositionX += carVolocityX * frameTime; 
carPositionZ += carVolocityZ * frameTime; 

car[0]->MoveX((carPositionX));
car[0]->MoveZ((carPositionZ));

相反,如果您只想将其绕一圈移动,并且不允许“A”和“D”影响角度,

car[0]->MoveX((carPositionX * sin(angularVelocity * totalTime)));
car[0]->MoveZ((carPositionZ * cos(angularVelocity * totalTime)));

您可以使用键来调整(新)变量 angularVelocity,或者只是分配一个常数来查看它的工作情况。变量 totalTime 是自模拟开始以来的总时间。

于 2012-04-05T18:48:54.960 回答