首先,这个问题并不是我目前正在处理的当前项目独有的,以前也发生过好几次。问题来了。
我有一个Triangle
结构。CCD_ 2是一个具有x和y分量的向量类。
struct Triangle
{
olc::vf2d p1 = { 0.0f, -10.0f };
olc::vf2d p2 = { -5.0f, 5.0f };
olc::vf2d p3 = { 5.0f, 5.0f };
};
我为它创建了一个三角形以及位置和角度
Triangle triangle
olc::vf2d position = { 0.0f, 0.0f };
float angle = 0.0f;
现在,我旋转(并偏移(三角形如下:
float x1 = triangle.p1.x * cosf(angle) - triangle.p1.y * sinf(-angle) + position.x;
float y1 = triangle.p1.x * sinf(-angle) + triangle.p1.y * cosf(angle) + position.y;
float x2 = triangle.p2.x * cosf(angle) - triangle.p2.y * sinf(-angle) + position.x;
float y2 = triangle.p2.x * sinf(-angle) + triangle.p2.y * cosf(angle) + position.y;
float x3 = triangle.p3.x * cosf(angle) - triangle.p3.y * sinf(-angle) + position.x;
float y3 = triangle.p3.x * sinf(-angle) + triangle.p3.y * cosf(angle) + position.y;
当我增加每帧的角度并绘制它时,它会旋转并按预期工作。但现在问题来了。当我试图计算它的移动方向时,就像这样:
position.x -= cosf(angle) * elapsedTime;
position.y -= sinf(-angle) * elapsedTime;
它会移动,但看起来与旋转偏离了90度。例如,它正朝上并向右移动。
到目前为止,我一直通过使用不同的角度值来解决这个问题,即从方向计算中使用的角度中减去3.14159f/2.0f弧度
position.x -= cosf(angle - (3.14159f / 2.0f));
position.y -= sinf(-angle - (3.14159f / 2.0f));
反之亦然,这就解决了问题(现在它正朝着它所面临的方向发展(。
但现在我想知道为什么会发生这种情况,以及解决这个问题的正确方法,非常感谢。
有一些缺失的项目需要诊断。你必须有某种坐标系。它是右手坐标系还是左手坐标系。你可以通过取你的X/Y原点,并用拇指指向你,将你的手放在它上面来确定这一点。当X轴逆时针旋转时,即右手手指卷曲的方式(如图所示(,正X轴是朝着正Y轴移动(右手系统(还是朝着负Y轴(左手系统(移动。
例如,大多数代数绘图都是用右手系统完成的,但在监视器的原始像素上,正Y是down,而不是代数中常见的up。
运动方向应该与旋转角度无关——除非您真的希望它们耦合,但通常情况并非如此。
使用两个不同的运动方向和旋转角度变量可以让你在视觉和心理上将两者解耦,更好地了解正在发生的事情。
现在,通常——想想代数——旋转角度是从"0"开始测量的;东部"——指向右边——是零度;"北方";是90度,指向上,依此类推
如果你想移动";直上";你不是朝着零度方向移动,而是朝着90度方向移动。因此,如果你的旋转是零度,但希望运动是"零度";直上";就像三角形点一样,那么你应该使用90度的偏移来进行你的移动和旋转。
如果将旋转和运动解耦,这种行为将更容易理解和观察。