Kilobyte | Дата: Четверг, 01 Ноября 2012, 11:51 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| У меня есть код, который в дальнейшем будет системой управления огнем для БМП. Или для сотни таких) Именно поэтому я реализовал класс.
Пушки поворачиваются вместе с корпусом. Это да. Но когда корпус поворачивается, пушки должны несколько сместиться. А он торчат на месте и получается нехорошо. Поковырять надо там, где стоит отметка "ЗДЕСЬ ЗАРЫТА СОБАКА", помогите
Что я имею: Что должно получиться: Что получается:
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 |
|
| |