如何更有效地进行坐标系操作?

时间:2012-05-27 11:38:57

标签: javascript math optimization 2d three.js

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

虽然它是一个3D坐标系,但是可以忽略高度(z轴),因为无论摄像机有多高,玩家都应该始终以相同的速度行进(摄像机系统的运行方式与游戏“魔兽世界”)。

现在,我总结了我的问题......

  • 点(0,0)是球员的位置。
  • Point(x,y)是相机的位置。
  • 相机是(dx,dy)单位远离玩家(因为玩家在(0,0),它也是(x,y)单位,虽然这是位置向量,而不是翻译)

问题:如何在这个2D空间中得到一个点(a,b),它位于圆圈r = 1但与(0,0)和(x,y)在同一条线上?

可视化:

enter image description here

通过这样做,我应该有一个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中制作游戏。

1 个答案:

答案 0 :(得分:4)

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

不要过早优化。这个东西绝不是你应用程序的瓶颈。

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

你现在的状况会很好。