【问题标题】:Calculating position of a item relative to camera计算项目相对于相机的位置
【发布时间】:2015-04-27 17:24:15
【问题描述】:

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

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

但是,相机不是静止的,而是旋转的物体,所以事情有点复杂。这是一张图片,希望能说明我想说的话:

这应该适用于所有维度,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);

但武器只是向前飞。

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

附:希望这个问题比上一个问题更清楚

【问题讨论】:

  • 这不是一个编程问题(本身),这更像是一个数学问题。
  • 是的,确实如此。让我再问一遍?
  • 我建议这样做。那里的用户会更熟悉这种类型的几何(并不是说你不能幸运地在这里找到一些)。一旦您能够在纸上写下方程式,您可以在这里询问您是否在代码中遇到困难。
  • 值得花时间首先澄清这个问题。你有一个水平平移的相机,但不能向上或向下倾斜。你在某处有一个对象。您知道相机和物体的 (x,y) 坐标,以及相机的旋转角度,而您正在尝试计算……什么?
  • 其实我觉得标签已经够清晰了。数学家和程序员都可以看。

标签: c++ math 3d position irrlicht


【解决方案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;
...

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多