嗨,伙计我得到了这个数学方程式来移动敌人的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();
}
谢谢!
答案 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是什么以及为什么它被应用。如果您在不理解代码的情况下使用代码,并且我怀疑这一点,那么如果发生错误,您将无法找到错误。或改变工作方式。另外,你应该真的使用类。您的代码看起来会更清晰,特别是如果您使用代表数学向量的类。