2013-05-02 2 views
-1

Вводя: Я развивающуюся немного игра обороны башни в OpenGL, в настоящее время я просто отчаявшийся небольшой проблемой ....Регулировка glRotate, используя скалярное произведение

Я хочу, чтобы снаряды от башни до направьте голову на корпус. Так что моя проблема более математическая, но она относится к opengl :)

У меня была следующая идея; Я мог бы использовать точечный продукт, чтобы получить угол, вращающийся вокруг оси х, чтобы получить головку в зависимости от расстояния, прямо или вниз, до земли, а затем дополнительный угол для поворота вокруг оси y, когда голова стрелки каждый раз приспосабливается к единице, на которую он нацелен.

Мой код для угла поворота вокруг оси X (я назвал его m_fYNeigung, потому что высота (Y) изменяется головы путем поворота вокруг оси х) выглядит следующим образом:

plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_fYNeigung = 
RADIANS_TO_DEGREES (acos ((float) 
     (
      (faTowerPosition[0]) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[0]) + 
      (faTowerPosition[1] - 1) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[1]) + 
      (faTowerPosition[2]) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[2]) 
     ) 
     /
     (
      fabs (faTowerPosition[0]) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[0]) + 
      fabs (faTowerPosition[1] - 1) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[1]) + 
      fabs (faTowerPosition[2]) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[2]) 
     ) 
));  

где faTowerPosition является первым вектором, который направлен вниз от вершины башни (стрелка также начинается с faTowerPosition [X/Y/Z]), вторым вектором для точечного произведения является m_faProDirectionVector, который является нормированным вектором направления, описывающим маршрут стрелка от башни к блоку.

программы OpenGL Drawing часть выглядит так же просто, как это:

 for (sizeJ = 0; sizeJ < localTowerArray[sizeI].m_byteProjectilAmount; sizeJ++) 
     { 
      if (localTowerArray[sizeI].Projektils[sizeJ].m_bOnFlight == true) 
      { 
       glPushMatrix(); 
       glTranslatef (localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[0], localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[1], localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[2]); 
       //glRotatef (360.0f - localTowerArray[sizeI].Projektils[sizeJ].m_fXNeigung, 0, 1, 0); 
       glRotatef (localTowerArray[sizeI].Projektils[sizeJ].m_fYNeigung, 1, 0, 0); 
        DrawWaveFrontObject (m_pArrowProjektilObject); 
       glPopMatrix(); 
      } 
     } 

Просто игнорируйте расчеты я делаю на угол, я просто сделал это, чтобы экспериментировать с действующей стрелок, я просто заметил что он выглядит так же, как стрелка будет действовать в зависимости от (я должен сказать: построенная карта масштабируется с помощью x: от -3,4 до 3,4 и z от 4 до -4), на которых башня была построена на -x/z, -z/x, z/x, -z/-x все эти случаи, я думаю, разные и, по крайней мере, в зависимости от того, что блок работает с левой или с правой стороны башни, действие тоже отличается ... так что я забыл Напоминать, используя dot-продукт таким образом?

+1

В коде есть так много ошибок, что трудно ответить на этот вопрос. Зачем использовать размер в качестве префикса для индекса? Что с немецкими именами? Почему так много дубликатов кода? Почему вы не используете структуры для точек? Самое главное, почему даже отправляйте свой код, если вы задаете вопрос о математике? В любом случае. Проверьте это: http://stackoverflow.com/questions/11008303/lookat-implementation-misbehaviors. –

+0

размер префикса, потому что они имеют тип size_t. немецкие имена «s» ... единственное немецкое имя - это «neigung». Я объяснил это. Его ангел и neigung означает что-то вроде смолы. im не уверен, что вы имеете в виду с дублирующимся кодом .... Я просто написал это таким образом, чтобы сохранить форму точечного продукта, что его легче получить то, что я делаю .... и что вы имеете в виду со структурами для точек ? Я отправляю свой код, чтобы объяснить свою проблему, чтобы обратиться к проблеме, потому что я не знаю, что вызывает мою проблему. По крайней мере ... ссылка, которую вы разместили, абсолютно не имеет ничего общего с моей проблемой, но спасибо в любом случае :) – dhein

+0

перед downvoting, может быть, скажите мне, что «так много» не так с моим кодом? код, который он сам запускает без проблем ... его просто работа с точечным продуктом. Почему он не делает то, что должно быть его поведением ?! – dhein

ответ

2

Во-первых, ваш код очень трудно понять, поэтому я угадываю много, чтобы попытаться ответить вам. Если я ошибаюсь, извинитесь за это.

Я предполагаю, что вы хотите использовать поворот углов эйлеров, чтобы правильно выравнивать ваши снаряды. Итак, сначала вы сделаете поворот X, а затем - поворот Y.

Чтобы сделать поворот X, ваши векторы для точечного продукта должны находиться на плоскости YZ и предполагать, что ваш пуск начинается в направлении Z, ваш первый вектор равен (0, 0, 1). Второй вектор, как вы сказали, представляет собой вектор, указывающий на единицу и может быть выражен (px, py, pz). Вы должны проецировать этот вектор в плоскости YZ, чтобы получить второй вектор для вашего скалярного произведения, поэтому этот вектор будет (0, р, пз)

Теперь, чтобы вычислить скалярное произведение вы примените следующие formulė

x1.x2 + y1.y2 + z1.z2 = | p1 |. | P2 | .cos a, где | p1 | и | p2 | представляет собой модуль вектора (его длина)

В этом примере первый вектор является унитарным, а второй нет. Итак, | p2 | = sqrt (py^2 + pz^2). После этого:

экос (а) = пз/SQRT (р^2 + пз^2)

Это даст вам угол вокруг оси X.Сделайте то же вычисление для достижения поворота по углу Y

PS. После того, как я написал этот ответ, я отметил, что вы используете функцию «fabs». Я думаю, вы хотите найти модуль второго вектора, но fabs дают вам абсолютную ценность эскалара. Чтобы вычислить модуль вектора (его длину), вам нужно использовать приведенные выше формулы.

+0

im using fabs, потому что я думал | x | это eq to sqrt (x^2), ваше объяснение звучит довольно красиво и плохо напоминает ваш «как спросить» подсказку в следующий раз :), но это также похоже на то же самое, что и делалось ... ну g2g теперь болен, дайте ему попробовать эта ночь или завтра, может быть, я просто немного подумал: D так плохо, пусть я знаю и спасибо в любом случае :) – dhein

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