计算物品相对于相机的位置

时间:2015-04-27 17:24:15

标签: c++ math 3d position irrlicht

我正在使用C ++和Irrlicht制作3D游戏。这是一款FPS风格的游戏,因此玩家应该能够携带武器。但我一直在努力计算相对于相机的位置。如果相机不旋转,计算将很容易:

// node is camera's child
vector3df modifier = vector3df(2, 0, 2);
node->setPosition(node->getPosition() + modifier);

但是,相机不是静态的而是旋转的物体,因此事情有点复杂。这是一张图片,希望能够证实我想说的内容:

A picture tells more than a thousand words

这应该适用于所有维度,X,Y和Z.我认为这种目的只有两个三角函数,正弦和余弦,用于计算X和Y坐标。我是在错误的道路上还是应用于此?或者Irrlicht本身有解决方案吗?我尝试使用的代码(从SO中找到):

vector3df obj = vector3df(2, 0, 2);
vector3df n = vector3df(0, 0, 0);
n.X = obj.X * cos(60 * DEGTORAD) - obj.Z * sin(60 * DEGTORAD);
n.Z = obj.Z * cos(60 * DEGTORAD) + obj.X * sin(60 * DEGTORAD);
node->setPosition(node->getPosition() + n);

但武器只是向前飞。

我很乐意提供任何帮助或指导。

P.S。希望这个问题比前一个更清楚

1 个答案:

答案 0 :(得分:1)

您的代码存在的问题是旋转是围绕原点执行的,而不是在相机周围执行。

你想要做的是围绕相机旋转角度围绕相机中心旋转物体(武器):

为此,您需要执行以下步骤:

1 - 翻译所有点,使相机中心位于原点

2 - 应用旋转矩阵(角度为alpha):

[cos (alpha)   -sin (alpha)]  
[sin (alpha)    cos (alpha)] 

3 - 撤消旋转点上的步骤1.

示例算法:

Position of the weapon: (xObject, yObject)
Position of the camera: (xCamera, yCamera)
Turning angle: alpha    

  //step 1: 
  xObject -= xCamera;
  yObject -= yCamera;

  // step 2
  xRot = xObject  * cos(alpha) - yObject  * sin(alpha);
  yRot = xObject * sin(alpha) + yObject * cos(alpha);

  // step 3:
  xObject = xRot + xCamera;
  yObject = yRot + yCamera;

此算法在XY平面上,但可以针对XZ平面进行修改。假设在你的代码中obj代表武器的位置。您的代码可以是:

...
// Step 1
obj.X-=cam.X;
obj.Z-=cam.Z;

//Step 2
n.X = obj.X * cos(60 * DEGTORAD) - obj.Z * sin(60 * DEGTORAD);
n.Z = obj.Z * cos(60 * DEGTORAD) + obj.X * sin(60 * DEGTORAD);

// Step 3
obj.X = n.X + cam.X;
obj.Z = n.Z + cam.Z;
...

希望有所帮助!