我正在做一个你是宇宙飞船的游戏。这艘宇宙飞船必须能够旋转。矩形有两个数组x[]
,y[]
包含矩形的所有角位置。但是当我应用旋转公式时,我得到一个相当奇怪的旋转。为了解释它,它看起来像是在屏幕的左下方旋转。
要制作这些角落阵列,我需要处于x位置,y位置,宽度和高度。
制作角落阵列
public Vertex2f(float x, float y, float w, float h){
this.x[0] = x;
this.y[0] = y;
this.x[1] = x+w;
this.y[1] = y;
this.x[2] = x+w;
this.y[2] = y+h;
this.x[3] = x;
this.y[3] = y+h;
}
我的轮换功能
public void rotate(float angle){
this.rotation = angle;
double cos = Math.cos(rotation);
double sin = Math.sin(rotation);
for(int i = 0; i < x.length; i++){
x[i] = (float)(cos * x[i] - sin * y[i]);
y[i] = (float)(sin * x[i] + cos * y[i]);
}
}
如果有帮助我在java中使用LWJGL / OpenGL来获取所有图形,并使用Slick2d来加载和初始化我正在使用的精灵。
答案 0 :(得分:0)
试试这个:
public void rotate(float angle){
this.rotation = angle;
double cos = Math.cos(rotation);
double sin = Math.sin(rotation);
double xOffset = (x[0]+x[2])/2;
double yOffset = (y[0]+y[2])/2;
for(int i = 0; i < 3; i++){
x[i] = (float)(cos * (x[i]-xOffset) - sin * (y[i]-yOffset)) + xOffset;
y[i] = (float)(sin * (x[i]-xOffset) + cos * (y[i]-yOffset)) + yOffset;
}
}
你必须围绕矩形的中心旋转。否则中心位于x = 0且y = 0
编辑:
public void rotate(float angle){
this.rotation = angle;
double cos = Math.cos(rotation);
double sin = Math.sin(rotation);
double xOffset = (x[0]+x[2])/2;
double yOffset = (y[0]+y[2])/2;
for(int i = 0; i < 3; i++){
double newX = (float)(cos * (x[i]-xOffset) - sin * (y[i]-yOffset)) + xOffset;
double newY = (float)(sin * (x[i]-xOffset) + cos * (y[i]-yOffset)) + yOffset;
x[i] = newX;
y[i] = newY;
}
}
请参阅other thread
答案 1 :(得分:0)
公式的问题
x[i] = (float)(cos * x[i] - sin * y[i]);
y[i] = (float)(sin * x[i] + cos * y[i]);
除了丢失的旋转中心之外,您在第一个公式中更改了x[i]
,但希望在第二个公式中使用原始值。因此,您需要使用
lx, ly
float lx = x[i] - xcenter;
float ly = y[i] - ycenter;
x[i] = xcenter + (float)(cos * lx - sin * ly);
y[i] = ycenter + (float)(sin * lx + cos * ly);
如果对象已经以rotation
的角度旋转,则此代码会将角度angle
添加到总旋转角度。相反,如果给定的参数angle
是新的总旋转角度,则需要使用角度差来计算sin
和cos
值。也就是说,例如,使用
public void rotate(float angle){
double cos = Math.cos(angle - rotation);
double sin = Math.sin(angle - rotation);
this.rotation = angle;