Javascript 如何更有效地执行此坐标系操作?

Javascript 如何更有效地执行此坐标系操作?,javascript,math,optimization,2d,three.js,Javascript,Math,Optimization,2d,Three.js,我正在制作一个3D游戏,玩家的背部应该始终面对摄像机,并且应该朝那个方向移动。我还没有谈到“背对着摄影机”的部分,但我相信,一旦我弄清楚如何将玩家移动到正确的方向,事情就会变得简单 虽然它是一个3D坐标系,但高度可以忽略(z轴),因为无论相机有多高,玩家都应该以相同的速度前进(相机系统的功能与魔兽世界的游戏非常相似) 现在,我已经总结了我的问题到这个 点(0,0)是球员的位置 点(x,y)是相机的位置 相机距离播放机(dx,dy)单位(因为播放机位于(0,0),所以相机距离播放机(x,y)单位

我正在制作一个3D游戏,玩家的背部应该始终面对摄像机,并且应该朝那个方向移动。我还没有谈到“背对着摄影机”的部分,但我相信,一旦我弄清楚如何将玩家移动到正确的方向,事情就会变得简单

虽然它是一个3D坐标系,但高度可以忽略(z轴),因为无论相机有多高,玩家都应该以相同的速度前进(相机系统的功能与魔兽世界的游戏非常相似)

现在,我已经总结了我的问题到这个

  • 点(0,0)是球员的位置
  • 点(x,y)是相机的位置
  • 相机距离播放机(dx,dy)单位(因为播放机位于(0,0),所以相机距离播放机(x,y)单位,尽管这是一个位置向量,而不是平移向量)
问题:如何在这个2D空间中得到一个点(a,b),它位于圆r=1上,但与(0,0)和(x,y)在同一条线上

可视化:

通过这样做,我应该有一个2D向量(a,b),当乘以-30时,它将作为播放器的速度

我知道如何做到这一点,但使用毕达哥拉定理、平方根和所有那些毫无疑问的工具(使用Javascript),成本非常高,效率也很低

基本上是这样的:

c = sqrt(dx*dx + dy*dy); //Get the length of the line
rat = 1/c; //How many times is the desired length (1) bigger than the actual length

a = x*rat;
b = y*rat;
一定有更好的


作为参考,我正在用Javascript制作游戏,使用Three.js引擎。

这里没有什么比这更有效的了,这些计算是3D场景的标准内容

不要过早地优化。这不可能成为你应用程序的瓶颈

请记住,即使这些计算在每个
render()
上发生,它们仍然只会每隔几毫秒发生一次—假设每秒60帧,则为17毫秒,这是非常多的
Math.sin()
/
Math.cos()
/
Math.sqrt()
非常有效,并且在每个
render()
上都会进行许多其他计算,这些计算要复杂得多


你现在拥有的一切都会很好。

这里没有什么比这更有效的了,这些计算是3D场景的标准内容

不要过早地优化。这不可能成为你应用程序的瓶颈

请记住,即使这些计算在每个
render()
上发生,它们仍然只会每隔几毫秒发生一次—假设每秒60帧,则为17毫秒,这是非常多的
Math.sin()
/
Math.cos()
/
Math.sqrt()
非常有效,并且在每个
render()
上都会进行许多其他计算,这些计算要复杂得多


你现在所拥有的一切都会很好。

是的,这就是你必须要做的。您需要多久计算一次?如果只是在帧速率下,听起来没什么大不了的…我想每次鼠标移动的时候。没有别的办法了?你可以给函数添加一些记忆,这样你就可以缓存函数+参数的结果,如果它是纯函数的话@马克萨特:伙计们,事情是这样的,不过测试起来真的很简单@Shay Well不是一些琐碎的CPU操作,而是突然需要访问内存。这会将其他有用的东西从缓存中逐出,这意味着在最坏的情况下,我们必须等待整个内存访问(再见几百个CPU周期)。另一方面,使用SSE的4次乘法、1次除法、1次加法和1次QRT在最坏情况下(单标量操作延迟)比对三级缓存的单次内存访问少4*5+14+14+3=51个周期。显然,这是假设一个合理的编译器和JS性能是出了名的糟糕,所以谁知道呢。但在C语言中,记忆将是一个非常糟糕的主意。是的,这几乎是你必须要做的。您需要多久计算一次?如果只是在帧速率下,听起来没什么大不了的…我想每次鼠标移动的时候。没有别的办法了?你可以给函数添加一些记忆,这样你就可以缓存函数+参数的结果,如果它是纯函数的话@马克萨特:伙计们,事情是这样的,不过测试起来真的很简单@Shay Well不是一些琐碎的CPU操作,而是突然需要访问内存。这会将其他有用的东西从缓存中逐出,这意味着在最坏的情况下,我们必须等待整个内存访问(再见几百个CPU周期)。另一方面,使用SSE的4次乘法、1次除法、1次加法和1次QRT在最坏情况下(单标量操作延迟)比对三级缓存的单次内存访问少4*5+14+14+3=51个周期。显然,这是假设一个合理的编译器和JS性能是出了名的糟糕,所以谁知道呢。但在C语言中,记忆将是一个非常糟糕的主意。