2009-09-03 2 views
2

Я хочу знать способ перевернуть угол по горизонтальной оси, не выполняя много операций. Скажем, у меня есть угол 0 («указывая вправо» в системе координат моего кода), угол поворота должен быть 180 (указывая влево). Если 90 (направленный вверх), перевернутый, все равно должен быть 90. 89 - 91 и т. Д. Я могу работать со скоростями X/Y, подразумеваемыми углом, но это замедлит работу, и я чувствую, что это не правильный путь. Я не знаю много математики, поэтому я мог бы называть вещи неправильным именем ... Может ли кто-нибудь помочь?Отражающий угол по горизонтали

EDIT: К сожалению, я взял длинный, я должен был быть из компьютера на долгое время, OK ... http://img215.imageshack.us/img215/8095/screenshot031v.jpg

Этот снимок экрана может do.The выше структуры являются два спутника и луч связан с белым точка в центре. Два спутника должны унаследовать угол белой точки (это видно для целей отладки), поэтому, если он нацелен под углом, они последуют за ним. Спутник слева зеркальный, поэтому я рассчитал его с углом 180 градусов, как было предложено, хотя это была моя первая попытка. Как вы можете видеть, это не отражается, а переворачивается. И когда белая точка вращается, она вращается назад. Другой делает хорошо.

Это перерасчет угла для чего-то связанного с чем-то другим, pid будет родителем, а id - текущим. pin.ang угол смещения копируется, когда объект связан с другим, так что она сохраняет позицию при повороте:

if(object[id].mirror) object[id].angle = 180 - (object[id].pin.ang + object[pid].angle); else object[id].angle = object[id].pin.ang + object[pid].angle;

И это удельное вращение часть. OpenGL. offx/y для вещей, вращающихся вне центра, подобно лучу, который должен появиться там, он делает все остальное правильным.

glTranslatef(list[index[i]].x, list[index[i]].y, 0); glRotatef(list[index[i]].angle, 0.0, 0.0, 1.0); glTranslatef(list[index[i]].offx, -list[index[i]].offy, 0);

вращение также, как пропустить, когда скорость вращения (целое число добавляется каждый перерисовывать к текущему углу, положительный для вращения по часовой стрелке, как в этом следующем: http://img216.imageshack.us/img216/7/screenshot032ulr.jpg

Так что это, безусловно, а не на 180 градусов, несмотря на то, насколько это было бы очевидно. Зеркалирование выполняется путем простое изменение координат текстуры, поэтому оно не влияет на угол. Я боюсь, что это может быть причуда на предмет вращения GL. Опять же, я извините за плохое объяснение, несмотря на то, что двигатель работает нормально (за исключением неприятностей, подобных этому), я не являюсь частью кода г, просто дизайнер ...

+1

Это звучит для меня, как будто вы хотите «перевернуть вокруг вертикальной оси» – pavium

+0

ли вы хотите лечить, указывая вниз, как 270 или -90? Или это никогда не произойдет? – pavium

+0

Ну, я не слишком уверен в том, что делаю, прошу прощения за плохое объяснение. Моя цель - иметь пушки на персонаже, а также те пушки, которые следуют за состоянием персонажа, поэтому они направлены в противоположном направлении в зависимости от их угла. В основном, переключение справа и слева, чтобы пушки могли следовать за зеркальным флагом. Если при повороте я сделаю 180-угол, они будут перевернуты, поэтому пушка, направленная вниз-направо, будет направлена ​​вверх-влево. Я стараюсь, чтобы он указывал вниз-налево. – 2009-09-03 07:28:38

ответ

8

Отраженное количество (просто глядя на математике) будет (180 - angle)

Angle | Reflection 
------+----------- 
    0 |  180 
    90 |   90 
    89 |   91 
    91 |   89 
    360 |  -180 
    270 |  -90 

Примечания негативов, если вы упадете ниже «горизонтальной плоскости», - который вы могли бы оставить в они являются или обрабатываются как особый случай.

+0

180-угол также будет переворачивать его по вертикали, как 9 и 6. Я должен был заметить, что я использую это для графики. Графика будет перевернута, когда установлен флаг, и я хочу, чтобы у него был противоположный угол, поэтому он сохраняет ту же конструкцию, если база также повернута. Но 180 - угол приводит к тому, что объект перевернется вверх ногами. – 2009-09-03 07:19:29

+1

Вы можете нормализовать углы, чтобы упасть, например, на [0; 360), путем добавления или вычитания кратного на 360 градусов. – starblue

+1

@DalGr: В этом случае нет возможности перевернуть объект, изменив только угол. Вам нужно отразить это, т. Е. Перевернуть каждую точку отдельно в ojbect. – Guffa

3

не Является ли это просто

результат = 180- (ваш угол)

2

Как уже говорилось, вы найдете противоположный угол, вычитая свой угол от 180 градусов. Например:

180 - yourangle 

Непосредственно манипулирование скоростями X/Y не будет очень громоздким. Вы просто меняете направление скорости X, умножая его на минус 1, например: speedx = (-1) * speedx.Это изменит направление влево-вправо, например: что-то перемещение влево начнет двигаться вправо, и наоборот, и вертикальная скорость не будет затронута.

Если вы используете синус/косинус (sin/cos) для пересчета ваших компонентов скорости X/Y, то метод *(-1), вероятно, будет более эффективным. В конечном счете это зависит от контекста вашей программы. Если вы ищете лучшее решение, уточните свой вопрос с более подробной информацией.

0

Ааа, кажется, проблема возникла из-за отрицательных чисел, я обеспечил их положительный и теперь поворот отлично, мне даже не нужно пересчитывать угол ... Спасибо всем, я в конечном итоге выяснил из-за бит каждого ответа.

0

просто 360-angle переворачивает свой угол, но не горизонтально verticaly

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