【问题标题】:How to do this coordinate system operation more efficiently?如何更有效地进行这个坐标系操作?
【发布时间】:2012-05-27 11:38:57
【问题描述】:

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

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

现在,我已经将我的问题总结为...

  • Point (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;

一定有更好的东西!

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

【问题讨论】:

  • 是的,这就是你必须做的。您需要多久计算一次?如果只是帧率的话,听起来没什么大不了的……
  • 我猜是每次移动鼠标。没有别的办法了吗?无赖。
  • 你可以给函数添加一些记忆,如果它是一个纯函数,你可以缓存函数+参数的结果! addyosmani.com/blog/faster-javascript-memoization
  • @MaxArt : 伙计们,问题是,它真的很容易测试!
  • @Shay 好吧,你突然不得不访问内存,而不是一些琐碎的 CPU 操作。这会将其他有用的东西从缓存中驱逐出去,这意味着在最坏的情况下我们必须等待整个内存访问(再见几百个 CPU 周期)。另一方面,使用 SSE 进行 4 次乘法、1 次除法、1 次加法和 1sqrt 需要最坏的情况(单标量操作延迟) 4*5+14+14+3=51 个周期,即少于对 L3 高速缓存的单个内存访问。显然,这是假设一个明智的编译器和 JS 性能是出了名的糟糕,所以谁知道呢。但是在 C 中,记忆化是一个非常糟糕的主意。

标签: javascript math optimization 2d three.js


【解决方案1】:

这里没有什么可以提高效率,这些计算是 3D 场景的标准计算。

不要过早优化。这些东西绝不会成为您应用程序的瓶颈。

请记住,即使这些计算发生在每个 render() 上,它们仍然仅每隔几毫秒发生一次 - 假设 60 FPS 为 17 毫秒,这很多Math.sin() / Math.cos() / Math.sqrt() 非常高效,并且每个 render() 都会发生许多其他计算,这些计算要复杂得多

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2014-08-03
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多