我正在编写2D游戏。我取得的是基于自定义路径移动精灵。 路径可以在数学上表示为:y = sin(x)..因此运动是波。 我想以这种方式旋转这个波浪,所以运动不是水平的,而是垂直的,或者有一些自定义角度相对于原点。 我数学上有点弱。抱歉。有人可以帮忙。 我的代码就是这个
for (int i=0; i<300; i++) {
coordinatesX[i] = i;
coordinatesY[i] = (float) (50 * Math.sin(coordinatesX[i]));
}
createpath (coordinatesX, coordinatesY);
...
答案 0 :(得分:4)
嗯,您的对象用一些起始坐标(x,y)^ t表示。为了在2D空间中旋转,您将使用旋转矩阵
R = [ cos(a) -sin(a)]
[ sin(a) cos(a) ]
由于您还想执行平移T(沿正弦波移动),您可以通过将2D坐标扩展到3D同质坐标来构成仿射变换。假设您的平移将是(tx,ty)并且您的旋转角度(以弧度表示)为a,转换矩阵将为
T = [ cos(a) -sin(a) tx
sin(a) cos(a) ty
0 0 1 ]
将原始(x,y)点转换为(x,y,1)时,简单
T * (x,y,1)^t
会做到这一点。
你可以通过将所有元素除以最后一个(即你松散一个维度),从同质坐标回到笛卡尔坐标。因为在这个简单的情况下,它们总是1,你可以简单地删除最后一个坐标并返回2D。
编辑: 多重T和(x,y,1)^ t得到:
T*(x,y,1)^t = [ cos(a) -sin(a) tx ] [ x ]
[ sin(a) cos(a) ty ]*[ y ] =
[ 0 0 1 ] [ 1 ]
= [ cos(a)*x - sin(a)*y + tx ]
[ sin(a)*x + cos(a)*y + ty ] =
[ 1 ]
= (cos(a)*x - sin(a)*y + tx, sin(a)*x + cos(a)*y + ty, 1)^t