Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Shagg_E

Страницы: 1 2 [3] 4 5 ... 47
31
Флуд / Re: Флудильная
« : Июль 11, 2020, 09:13:54 pm »

33
Отличная работа!
Тебе обязательно нужно продвигать также этот плагин на gtaforums.com
Так будет больше шансов раскрутить проект.

34
пользуюсь только ВК
Жаль. В Дискорде есть много спецов. Целые группы, полные опытными модмейкерами.

35
а не подскажешь пожалуйста участок кода который отвечает за посадку игрока в Авто когда он нажимает F
Пока это не разбирал, к сожалению. Ты есть на Discord сервере SDK? Там могут помочь найти этот участок.

36
Общие вопросы / Re: Опкоды 0179 и 023B
« : Март 05, 2020, 12:51:33 am »
Вот база для трехи, а вот - Opcodes Restoration Project, в котором уже восстановили эти опкоды.

37
Общие вопросы / Re: Ротация и Матрица
« : Февраль 26, 2020, 09:54:40 pm »
Лучше тогда отправлять на сервер матрицу поворота или кватернион, вместо углов Эйлера. Понятно, что это довольно затратно, но что поделать...

38
Общие вопросы / Re: Ротация и Матрица
« : Февраль 26, 2020, 08:24:12 pm »
так как же мне сделать именно так как надо? есть вариант?
Ну это зависит от твоих целей. Если X 180 Y 180 Z 0 и X 0 Y 0 Z 180 с технической стороны - это одно и то же, почему тебе это не подходит?

39
Общие вопросы / Re: Ротация и Матрица
« : Февраль 26, 2020, 08:13:29 pm »
Ну это не ошибка, а известная проблема углов Эйлера.
Именно поэтому, а также из-за так называемого Gimbal lock в реальных расчетах в 3D юзают кватернионы и матрицы поворота.

40
Общие вопросы / Re: Ротация и Матрица
« : Февраль 26, 2020, 07:56:42 pm »
Попробуй так:
Код: C++
  1.         float fRot[3];
  2.  
  3.         GetObjectRotation((float *)fRot);
Ну и в самой функции, соответственно, заюзать так:
Код: C++
  1. void CObject::GetObjectRotation(float * fRotXYZ)
  2. {//------------------------------------------------------------------------------------------------------------------------
  3.  
  4.         //...
  5.  
  6.         fRotXYZ[0] = VehicleAngleXaYaZa[0];
  7.         fRotXYZ[1] = VehicleAngleXaYaZa[1];
  8.         fRotXYZ[2] = VehicleAngleXaYaZa[2];
  9.  
  10.         }

41
Общие вопросы / Re: Ротация и Матрица
« : Февраль 26, 2020, 07:01:50 pm »
да то я немного тупанул, не увидел твой последний ответ (усталость)
Знакомая история) Береги здоровье и сон, чувак!

42
Общие вопросы / Re: Ротация и Матрица
« : Февраль 26, 2020, 06:55:00 pm »
Да, вектором в RW называется последовательность трех значений XYZ. Не всегда это стоит воспринимать как буквально координаты XYZ, просто привыкни, что это 3 значения.

43
Хз, впервые о таком слышу. Советую еще раз проверить идентичность копий игры и их настроек. Речь же не о стим версиях?

44
Общие вопросы / Re: Ротация и Матрица
« : Февраль 24, 2020, 03:27:12 am »
и как мне это применить к моей матрице?

Это тоже самое, просто у тебя она подписана, а у меня сразу берутся значения из адресов. Вот, смотри:

Код: C++
  1.         // Это вектор vLookRight:
  2.         VehicleRotMatrix[0] = *(float *)(VehicleStruct + 0x04);
  3.         VehicleRotMatrix[1] = *(float *)(VehicleStruct + 0x04 + 0x04);
  4.         VehicleRotMatrix[2] = *(float *)(VehicleStruct + 0x04 + 0x08);
  5.  
  6.         // float  pad_r нам не нужен(он то ли не используется, то ли юзается для какой-то фигни - где-то на SannyBuilder то ли Seeman то ли Listener об этом писали), поэтому оффсет *(float *)(VehicleStruct + 0x04 + 0x0C) я пропустил.
  7.  
  8.         // Далее - ветор vLookUp:
  9.         VehicleRotMatrix[3] = *(float *)(VehicleStruct + 0x04 + 0x10);
  10.         VehicleRotMatrix[4] = *(float *)(VehicleStruct + 0x04 + 0x14);
  11.         VehicleRotMatrix[5] = *(float *)(VehicleStruct + 0x04 + 0x18);
  12.  
  13.         // опять же - пропускаем float  pad_u, поэтому оффсет *(float *)(VehicleStruct + 0x04 + 0x1C) идет лесом
  14.  
  15.         // ну и наконец - последние 3 значения матрицы поворота - vLookAt:
  16.         VehicleRotMatrix[6] = *(float *)(VehicleStruct + 0x04 + 0x20);
  17.         VehicleRotMatrix[7] = *(float *)(VehicleStruct + 0x04 + 0x24);
  18.         VehicleRotMatrix[8] = *(float *)(VehicleStruct + 0x04 + 0x28);
  19.  
  20.         // опять же - пропускаем float  pad_a, поэтому оффсет *(float *)(VehicleStruct + 0x04 + 0x2C) идет туда же, что и предыдущие
  21.  

У тебя представлена полная матрица позиции и поворота(4x4, 16 значений), поэтому внизу затесались еще VECTOR vPos и последняя "пустышка" float  pad_p, поэтому в данном случае просто не юзай их.

45
Общие вопросы / Re: Ротация и Матрица
« : Февраль 24, 2020, 12:42:33 am »
Вот пример опкодов получения/задания поворотов транспорта в New Epic Opcodes(всё то же самое применимо для педов и объектов):

Код: C++
  1. //0E24=4,store_vehicle %1d% rotation_to %2d% %3d% %4d%
  2. eOpcodeResult WINAPI StoreVehicleRotation(CScript* script)
  3. {
  4.         script->Collect(1);
  5.         unsigned int VehicleStruct = _GetVehicleStructByHandle(Params[0].nVar);
  6.         float VehicleRotMatrix[9];
  7.         VehicleRotMatrix[0] = *(float *)(VehicleStruct + 0x04);
  8.         VehicleRotMatrix[1] = *(float *)(VehicleStruct + 0x04 + 0x04);
  9.         VehicleRotMatrix[2] = *(float *)(VehicleStruct + 0x04 + 0x08);
  10.         VehicleRotMatrix[3] = *(float *)(VehicleStruct + 0x04 + 0x10);
  11.         VehicleRotMatrix[4] = *(float *)(VehicleStruct + 0x04 + 0x14);
  12.         VehicleRotMatrix[5] = *(float *)(VehicleStruct + 0x04 + 0x18);
  13.         VehicleRotMatrix[6] = *(float *)(VehicleStruct + 0x04 + 0x20);
  14.         VehicleRotMatrix[7] = *(float *)(VehicleStruct + 0x04 + 0x24);
  15.         VehicleRotMatrix[8] = *(float *)(VehicleStruct + 0x04 + 0x28);
  16.         float VehicleAngleXaYaZa[3];
  17.         RotationMatrixToEulerianAngle((float *)VehicleRotMatrix, (float *)VehicleAngleXaYaZa);
  18.         EulerianAngleNormalize360((float *)VehicleAngleXaYaZa);
  19.         Params[0].fVar = VehicleAngleXaYaZa[0];
  20.         Params[1].fVar = VehicleAngleXaYaZa[1];
  21.         Params[2].fVar = VehicleAngleXaYaZa[2];
  22.         script->Store(3);
  23.         return OR_CONTINUE;
  24. }
  25.  
  26. //0E25=4,set_vehicle %1d% rotation %2d% %3d% %4d%
  27. eOpcodeResult WINAPI SetVehicleRotation(CScript* script)
  28. {
  29.         script->Collect(4);
  30.         unsigned int VehicleStruct = _GetVehicleStructByHandle(Params[0].nVar);
  31.         float VehicleAngleXaYaZa[3];
  32.         VehicleAngleXaYaZa[0] = Params[1].fVar;
  33.         VehicleAngleXaYaZa[1] = Params[2].fVar;
  34.         VehicleAngleXaYaZa[2] = Params[3].fVar;
  35.         float VehicleRotMatrix[9];
  36.         EulerianAngleToRotationMatrix((float *)VehicleAngleXaYaZa, (float *)VehicleRotMatrix);
  37.         *(float *)(VehicleStruct + 0x04) = VehicleRotMatrix[0];
  38.         *(float *)(VehicleStruct + 0x04 + 0x04) = VehicleRotMatrix[1];
  39.         *(float *)(VehicleStruct + 0x04 + 0x08) = VehicleRotMatrix[2];
  40.         *(float *)(VehicleStruct + 0x04 + 0x10) = VehicleRotMatrix[3];
  41.         *(float *)(VehicleStruct + 0x04 + 0x14) = VehicleRotMatrix[4];
  42.         *(float *)(VehicleStruct + 0x04 + 0x18) = VehicleRotMatrix[5];
  43.         *(float *)(VehicleStruct + 0x04 + 0x20) = VehicleRotMatrix[6];
  44.         *(float *)(VehicleStruct + 0x04 + 0x24) = VehicleRotMatrix[7];
  45.         *(float *)(VehicleStruct + 0x04 + 0x28) = VehicleRotMatrix[8];
  46.         return OR_CONTINUE;
  47. }

Как видно из кода, там происходит перевод матриц поворота в углы Эйлера, и обратно.
Для этих нужд были написаны на основе примеров в инете и частей кода SA(т.к. у GTA "своя атмосфера" и не всё из интернета к ней применимо) следующие функции:

Код: C++
  1. void RotationMatrixToEulerianAngle(float* RotMx, float* EulAng)
  2. {
  3.         //double rm00 = RotMx[3*0+0];
  4.         //double rm01 = RotMx[3*0+1];
  5.         double rm02 = RotMx[3*0+2];
  6.         double rm10 = RotMx[3*1+0];
  7.         double rm11 = RotMx[3*1+1];
  8.         double rm12 = RotMx[3*1+2];
  9.         //double rm20 = RotMx[3*2+0];
  10.         //double rm21 = RotMx[3*2+1];
  11.         double rm22 = RotMx[3*2+2];
  12.         EulAng[2] = (float)(-atan2(rm10, rm11) * 57.295776);
  13.         EulAng[0] = (float)(-asin(-rm12) * 57.295776);
  14.         EulAng[1] = (float)(-atan2(rm02, rm22) * 57.295776);
  15. }
  16.  
  17. void EulerianAngleNormalize360(float* EulAng)
  18. {
  19.         if(EulAng[0]<0) EulAng[0] = EulAng[0] + 360;
  20.         if(EulAng[0]>=360) EulAng[0] = EulAng[0] - 360;
  21.         if(EulAng[1]<0) EulAng[1] = EulAng[1] + 360;
  22.         if(EulAng[1]>=360) EulAng[1] = EulAng[1] - 360;
  23.         if(EulAng[2]<0) EulAng[2] = EulAng[2] + 360;
  24.         if(EulAng[2]>=360) EulAng[2] = EulAng[2] - 360;
  25. }
  26.  
  27. void EulerianAngleToRotationMatrix(float* EulAng, float* RotMx)
  28. {
  29.         double cosx = cos(EulAng[0] / 57.295776);
  30.         double sinx = sin(EulAng[0] / 57.295776);
  31.         double cosy = cos(EulAng[1] / 57.295776);
  32.         double siny = sin(EulAng[1] / 57.295776);
  33.         double cosz = cos(EulAng[2] / 57.295776);
  34.         double sinz = sin(EulAng[2] / 57.295776);
  35.         RotMx[3*0+0] = (float)(cosz * cosy - sinz * sinx * siny);
  36.         RotMx[3*0+1] = (float)(cosz * sinx * siny + sinz * cosy);
  37.         RotMx[3*0+2] = (float)(-cosx * siny);
  38.         RotMx[3*1+0] = (float)(-sinz * cosx);
  39.         RotMx[3*1+1] = (float)(cosz * cosx);
  40.         RotMx[3*1+2] = (float)(sinx);
  41.         RotMx[3*2+0] = (float)(sinz * sinx * cosy + cosz * siny);
  42.         RotMx[3*2+1] = (float)(sinz * siny - cosz * sinx * cosy);
  43.         RotMx[3*2+2] = (float)(cosx * cosy);
  44. }

Страницы: 1 2 [3] 4 5 ... 47