1

我正在制作一个 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;

一定有更好的东西!

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

4

1 回答 1

4

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

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

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

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

于 2012-05-27T21:38:03.143 回答