gpt4 book ai didi

c++ - 计算元素相对于相机的位置

转载 作者:行者123 更新时间:2023-11-30 05:44:11 25 4
gpt4 key购买 nike

我正在使用 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);

但武器只是向前飞。

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

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

最佳答案

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

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

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

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;
...

希望对您有所帮助!

关于c++ - 计算元素相对于相机的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29902211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com