2015-05-04 2 views
0

Я работаю над игрой, в которой вы являетесь космическим кораблем. Этот космический корабль должен быть способен вращаться. Прямоугольник имеет два массива 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]); 

    } 

} 

Если это поможет, я использую LWJGL/OpenGL в Java для всех графических и Slick2d для загрузки и запустите спрайты, которые я использую.

ответ

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; 

    } 

} 

вы должны вращаться вокруг центра прямоугольника. В противном случае центр находится в х = 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++){ 
     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

+0

Это продолжалось лучше, но просто перепрыгивая через сам – Devtons

+0

я скоро опубликую видео ... – Devtons

+0

https://youtu.be/Gn0vibSvVPw – Devtons

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; 
+0

Вы проверяли этот код? – Devtons

+0

Похоже, что корабль просто вращается/масштабируется и переворачивается по оси x. – Devtons

+0

Этот код, как исходный для каждого намерения, добавляет угол, заданный как аргумент существующего вращения. Масштаб должен оставаться неизменным, не должно быть (зеркальных) переворотов. Если вы хотите сделать заданный угол новым абсолютным углом, тогда установите «угол = угол - вращение»; вращение = вращение + угол; Грех = Math.sin (угол); сов = Math.cos (угол) '. Или сохранить локальные и глобальные координаты отдельно. – LutzL

Смежные вопросы