Понедельник, 11 Ноября 2024, 09:35

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Синхронный поворот нескольких SkinMesh
KilobyteДата: Четверг, 01 Ноября 2012, 11:51 | Сообщение # 1
почетный гость
Сейчас нет на сайте
У меня есть код, который в дальнейшем будет системой управления огнем для БМП. Или для сотни таких) Именно поэтому я реализовал класс.

Пушки поворачиваются вместе с корпусом. Это да. Но когда корпус поворачивается, пушки должны несколько сместиться. А он торчат на месте и получается нехорошо. Поковырять надо там, где стоит отметка "ЗДЕСЬ ЗАРЫТА СОБАКА", помогите king

Что я имею:

Что должно получиться:

Что получается:


Code

int KRACKEN_CORP = OBJ_22;  //Корпус "Кракена"
int KRACKEN_RIGHT_GUN_TP3A2 = OBJ_88;  //Правый ТП3А2 "Кракена"
int KRACKEN_LEFT_GUN_TP3A2 = OBJ_110;  //Левый ТП3А2 "Кракена"

///---------КЛАСС БМП "КРАКЕН"
class KRACKEN
{                       
      Vector3 Position;                 //Позиция                    
      Quaternion Orientation;           //Ориентация
      int Number;                       //Порядковый номер
      Vector3 Target;                   //Координаты цели
      Vector3 DeltaRTP3A2Location;      //Смещение правого пулемета относительно корпуса
      Vector3 DeltaLTP3A2Location;      //Смещение левого пулемета относительно корпуса
      Vector3 RTP3A2Location;           //Положение правого пулеиета
      Vector3 LTP3A2Location;            //Положение левого пулемета
      Quaternion RTP3A2Orientation;      //Ориентация правого пулемета
      Quaternion LTP3A2Orientation;      //Ориентация левого пулемета

           //Инициализация БМП
       void Initialize(){       
        Vector3 loc2, loc3;      
        iObjectLocation(OBJ_22, this.Position);                       
        iObjectOrientation(OBJ_22, this.Orientation);  //крадем данные о положении     
        iObjectOrientation(OBJ_88, this.RTP3A2Orientation);        //из оригинала
        iObjectOrientation(OBJ_110, this.LTP3A2Orientation);      
        //ПЫЩЬ!1 ЭТУ СТРОЧКУ Я ОСТАВЛЮ, ПОЛЕЗНАЯ ДЛЯ МОЗГА                      
        //iQuaternionFromEulerAngles(this.Orientation,0,0,0,"xyz");;                        
        this.Number = 0;   //я нулевой
        iObjectLocation(OBJ_88, loc2);   //берем координаты пушек     
        iObjectLocation(OBJ_110, loc3);
        this.DeltaRTP3A2Location = loc2 - this.Position;   //и высчитываем смещения
        this.DeltaLTP3A2Location = loc3 - this.Position;
        //Теперь я существую! збс!
                          
       }                       
            //Обновление характеристик
       void Refresh(){   //даже кэп знает, что рефреш есть рефреш
iObjectImposterSet(KRACKEN_CORP, this.Number, this.Orientation, this.Position); //ставим корпус
iQuaternionMultiply(RTP3A2Orientation,RTP3A2Orientation,this.Orientation);     //складываем
iQuaternionMultiply(LTP3A2Orientation,LTP3A2Orientation,this.Orientation);//координаты пушек и корпуса, дабы получить синхронный поворот всех частей
iObjectImposterSet(KRACKEN_LEFT_GUN_TP3A2, this.Number, LTP3A2Orientation, this.LTP3A2Location);    //и раскладываем пушки
       iObjectImposterSet(KRACKEN_RIGHT_GUN_TP3A2, this.Number, RTP3A2Orientation, this.RTP3A2Location);
       }
            //Постановка на карту
       void Spawn(Vector3 spawn_loc, Quaternion spawn_or){  //СПАВН!11
       Quaternion ori;  //промежуточная, не заостряйте внимания
       iObjectImposterSet(KRACKEN_CORP, this.Number, spawn_or, spawn_loc);// спавним корпус
       this.SetPosition(spawn_loc);  //записываем все в свойства класса
       this.SetOrientation(spawn_or);
       iObjectImposterShadowEnable(KRACKEN_CORP, this.Number, true); //тени включим, что-ли
       //оружейная возня
//складываем координаты пушек
// и корпуса, дабы получить синхронный поворот всех частей
iQuaternionMultiply(this.RTP3A2Orientation,this.RTP3A2Orientation,this.Orientation);
iQuaternionMultiply(this.LTP3A2Orientation,this.LTP3A2Orientation,this.Orientation);
//расчет положения пулеметов, учитывая смещение
this.LTP3A2Location = spawn_loc + this.DeltaLTP3A2Location;
this.RTP3A2Location = spawn_loc + this.DeltaRTP3A2Location;
//ставим пушки
iObjectImposterSet(KRACKEN_LEFT_GUN_TP3A2, this.Number, LTP3A2Orientation,this.LTP3A2Location);
       iObjectImposterSet(KRACKEN_RIGHT_GUN_TP3A2, this.Number, RTP3A2Orientation, this.RTP3A2Location);

       //Я ЗАСПАВНИЛСЯ!1
       }

            //Нахождение направления на цель.О дааааааааа ВОТ ЗДЕСЬ-ТО И СОБАКА ЗАРЫТА-----------------------------
       void SetDirectionOfKracken(Vector3 target, int cam){
       Quaternion orientation;
       Vector3 up = Vector3(0,1,0);
          target.y  = 0;
          Vector3 direction = target - this.Position;
              
          iQuaternionLookAt(orientation,direction,up);//вот она, функция моей мечты
//складываем координаты пушек
// и корпуса, дабы получить синхронный поворот всех частей
      iQuaternionMultiply(this.RTP3A2Orientation,this.RTP3A2Orientation,this.Orientation);
iQuaternionMultiply(this.LTP3A2Orientation,this.LTP3A2Orientation,this.Orientation);

       this.SetOrientation(orientation);
//записываем все в свойства класса
       this.SetRTP3A2Orientation(this.RTP3A2Orientation);
       this.SetLTP3A2Orientation(this.LTP3A2Orientation);

       this.Refresh();//рефрееш
}

            //Установка позиции(Вызвыть refresh() не забудьте)
       void SetPosition(Vector3 pos){
          this.Position = pos;
       }

            //Установки ориентации(Вызвыть refresh() не забудьте)
        void SetOrientation(Quaternion ori){
          this.Orientation = ori;
       } //Установки ориентации(Вызвыть refresh() не забудьте)
        void SetRTP3A2Orientation(Quaternion ori){
          this.RTP3A2Orientation = ori;
       }
     //Установки ориентации(Вызвыть refresh() не забудьте)
        void SetLTP3A2Orientation(Quaternion ori){
          this.LTP3A2Orientation = ori;
       }

          

}                       
///----------КОНЕЦ КЛАССА БМП "КРАКЕН"

///ГЛАВНЫЙ ТЕАТР||||||||||||||||||||||||||||||||||||||||||||||||||
///|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
void Main()
{                       
       ///ПЕРЕМЕННЫЕ
       int fileHandle;
       string kracken = "";
       float kracken_col;
       Quaternion orient, ori;
       Vector3 coords, co;

        ///КОНЕЦ ПЕРЕМЕННЫХ

             //открытие файла сохранения
       if (iInitializing())
       {                       
               
          fileHandle = iFileReadOpen(".\\Save.txt");
          if (fileHandle != -1)
          {                       
             iFileStringRead(fileHandle,kracken);
             iFileClose(fileHandle);
          }                       
                //назначаем количество "кракенов"
           kracken_col = iStringVal(kracken);
//создаем массив класса "кракен"
KRACKEN [] MyKrackens(kracken_col);
//Создаем корпуса
iObjectImpostersCreate(OBJ_22,kracken_col);
iObjectImpostersCreate(OBJ_88,kracken_col);
iObjectImpostersCreate(OBJ_110,kracken_col);
//снимаем наддые положения
iObjectLocation(OBJ_44, coords);
iObjectLocation(OBJ_22, co);
iObjectOrientation(OBJ_22, ori);
//скрываем оригинал, ибо нехрен торчать посреди карты
co.y += 6;

//а теперь нитересное...нацеливаем на здание 66
for(int i=0;i<kracken_col;i++)

{      
MyKrackens[i].Initialize();                       
MyKrackens[i].Number = i;
MyKrackens[i].Spawn(Vector3(co.x+i*10 + 10, co.y, co.z + i*10 + 10), ori);
MyKrackens[i].Refresh();
MyKrackens[i].SetDirectionOfKracken(coords, OBJ_66);
}       

                          

       }                       
       }                       

Добавлено (01.11.2012, 11:51)
---------------------------------------------
Получилось!1111
iVectorRotate(this.RTP3A2Location,this.DeltaRTP3A2Location,this.Orientation);
iVectorRotate(this.LTP3A2Location,this.DeltaLTP3A2Location,this.Orientation);
this.RTP3A2Location += this.Position;
this.LTP3A2Location += this.Position;
и все)




Сообщение отредактировал Kilobyte - Четверг, 01 Ноября 2012, 11:32
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг