我正在使用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);
但武器只是向前飞。
我很乐意提供任何帮助或指导。
P.S。希望这个问题比前一个更清楚
答案 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;
...
希望有所帮助!