C#Math 3D Movement x,y,z等式

时间:2017-03-30 11:33:54

标签: c# math

嗨,伙计我得到了这个数学方程式来移动敌人的x,y,z但是我似乎无法复制我想要的结果x,y我想创造z运动

所以,假设我的敌人的移动速度为1.5,他的位置是

Enemy Position: posX > 119.75013, posY > 12.1830482, posZ > 167.700226

我想把他带到

Enemy Final Position: posX > 119.41893, posY > 11.3724937, posZ > 162.9639

使用这些x,y,z结果:

Enemy movement: posX > 119.645088, posY > 11.9535465, posZ > 166.198029
Enemy movement: posX > 119.539749, posY > 11.7193651, posZ > 164.691589
Enemy movement: posX > 119.479477, posY > 11.54633, posZ > 163.829742

但该功能仅打印

Enemy Movement: posX 119.182753804649, posY 10.7944934646909

注意我没有使用Unity3D所以我需要一个与unity3d一起工作的函数。

当前功能:

static void Main(string[] args)
{
    double startX = 119.75013;
    double startY = 12.1830482;
    double startZ = 167.700226;

    double x = 119.41893;
    double y = 11.3724937;
    double z = 162.9639;

    double endX = x;
    double endY = y;
    double endZ = y;

    double speed = 1.5f;

    Console.WriteLine($"Enemy Position: posX {startX}, posY {startY}, posZ {startZ}");
    Console.WriteLine($"Enemy Final Position: posX {x}, posY {y}, posZ {z}\n");

    double distance = Math.Sqrt(Math.Pow(endX - startX, 2) + Math.Pow(endY - startY, 2));
    double directionX = (endX - startX) / distance;
    double directionY = (endY - startY) / distance;


    double newlat = startX;
    double newLng = startY;


    while (Math.Sqrt(Math.Pow(newlat - startX, 2) + Math.Pow(newLng - startY, 2)) <= distance)
    {

        newlat += directionX * speed;
        newLng += directionY * speed;

        Console.WriteLine($"Enemy Movement: posX {newlat}, posY {newLng}");
    }

    Console.ReadKey();
}

谢谢!

1 个答案:

答案 0 :(得分:1)

这很简单,你使用1.5的速度,这就是你的问题。

你计算

speed = 1.5
Δx = targetx - startx 
positionx = startx
while(distance(position,target) <= distance(start,target)){
    positionx += Δx * speed
}

在第一次迭代中,你已经加速过去目标,你的速度太快而无法达到它。

如果你想在开始和目标之间有3个位置,你需要4个步骤,因此你应该将速度设置为0.25。

这意味着,只需与double speed = 1.5f;交换double speed = 0.25f;

那就是说,我真的非常建议您确保完全理解您的代码所做的事情。这就是我用Δx编写零件的原因。你应该完全理解Δx是什么以及为什么它被应用。如果您在不理解代码的情况下使用代码,并且我怀疑这一点,那么如果发生错误,您将无法找到错误。或改变工作方式。另外,你应该真的使用类。您的代码看起来会更清晰,特别是如果您使用代表数学向量的类。