Jump to content
Korean Random

Dragon armor

User
  • Content Count

    404
  • Joined

  • Last visited

  • Days Won

    3

Dragon armor last won the day on July 29 2021

Dragon armor had the most liked content!

Community Reputation

61

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Микроскопическая проблема и полный тупик. У меня не получается. Не понимаю, что надо сделать, чтобы получить вектор направления. Если у меня есть yaw и pitch, как из них сделать вектор направления? Или не так надо? А нужно из матрицы? Или это отдельный параметр? Но turret_yaw используется для получения координат крепления орудия. Что надо сделать, чтобы получить вектор направления? При этом, если отдельно отправлять yaw/pitch в gunAnglesPacked для остальной техники, башня вращается почти правильно (зацикливается на переходе 180 градусов, пока причину бага не искал). У меня не получится так сделать. Только из модели (либо xml файла) могу получить координаты. Правильно понимаю, что координаты техники - это глобальные координаты. А в xml находятся локальные. Соответственно, чтобы получить локальные (или это уже глобальные будут, если умножить на позицию техники?) координаты орудия и башни, делать надо так. turret_pos = vd.chassis.hullPosition + vd.hull.turretPositions[0] turret_matrix = Math.Matrix() turret_matrix.Set_Pos(turret_pos) turret_matrix.Rotate_Y(self.turret_yaw) turret_matrix.postMultiply(veh.matrix) gun_matrix = Math.Matrix() gun_matrix.Rotate_X(self.gun_pitch) gun_matrix.Set_Pos(vd.turrets[0][0].gunPosition) gun_matrix.postMultiply(turret_matrix) veh.matrix - это предполагается положение техники, пока что единичная матрица. Их не надо в данном шаге вычислений? hullPosition и turretPositions можно сложить? Они же не изменяются в локальной системе координат? Или надо перейти в локальную систему (точку прицеливания перевести в локальную) и считать углы там? Кто-нибудь объясните, что надо сделать.
  2. startPoint += player.vehicleTypeDescriptor.hull.turretPositions[0] + player.vehicleTypeDescriptor.turret.gunPosition А так можно? А то матрицы тут перемножаю, чтобы точку получить. Ясно. А зачем так? У клиента же есть скорость снаряда. Почему просто не передать направление?
  3. @ktulho Так направление выстрела или скорость? Как в одном векторе объединить две разных величины? У меня предположение, что это точка на ландшафте. Проверить не могу, cellapp пока что не может делать рейкаст (или как эта штука называется). И ландшафт при дампе уехал куда-то, поэтому не понятно, заканчивается точка на ландшафте или где-то ещё. А начальная точка примерно отсюда начинается.
  4. И так, возвращаюсь к тому, на чём застрял ещё в самом начале. Сервер присылает клиенту через функцию updateGunMarker некие вектора, назначение которых мне не ясно. shotPos, shotVec Реальный пример значений векторов. shotPos x = 43.00 y = 9.18 z = 412.46 shotVec x = -17.71 y = 20.38 z = -350.96 Из названия как бы всё понятно, но по коду, в котором используется, всё не однозначно. shotPos - либо конец орудия, либо начало точки стрельбы, которая где-то в башне находится. Ну пусть. А что второй вектор? Из updateGunMarker сразу идёт вызов setShotPosition. dirToTarget = predictedTargetPos - shotPos dirToTarget.normalise() shotDir = Math.Vector3(shotVec) shotDir.normalise() if shotDir.dot(dirToTarget) > 0.0: return dot - скалярное умножение векторов, тут что хотят проверить? Что вектор не нулевой? Ну ладно, идём в функцию __getGunMarkerPosition. А там уже не ясно мне ничего. Начало. def __getGunMarkerPosition(self, shotPos, shotVec, dispersionAngles): shotDescr = self.__avatar.getVehicleDescriptor().shot gravity = Math.Vector3(0.0, -shotDescr.gravity, 0.0) maxDist = shotDescr.maxDistance testStartPoint = shotPos testEndPoint = shotPos + shotVec * 10000.0 testVehicleID = self.getAttachedVehicleID() testEntities = ProjectileMover.getCollidableEntities((testVehicleID,), testStartPoint, testEndPoint) collideVehiclesAndStaticScene = ProjectileMover.collideVehiclesAndStaticScene collideWithSpaceBB = self.__avatar.arena.collideWithSpaceBB prevPos = shotPos prevVelocity = shotVec dt = 0.0 maxDistCheckFlag = False testEndPoint = shotPos + shotVec * 10000.0 - но вектор не единичный, его не нормализуют. prevVelocity = shotVec - так что такое shotVec? Что за скорость?
  5. @StranikS_Scan Поменял координату X на положительную, знак сменился тоже. Так что всё нормально.
  6. @StranikS_Scan Получилось 86, только со знаком минус. Уже ближе похоже. И 2D не нужно, получается. Позже попробую посмотреть, как в игре это выглядеть будет.
  7. @StranikS_Scan Тут получается угол между башней и орудием. Мне надо другое. Вид сверху и сбоку. Точка прицеливания где-то. Для башни не нужна высота точки, нужны только координаты в плоскости XZ (в блендере система координат XYZ, в игре используется XZY). Для орудия не нужна координата X. Мне надо два угла, один между башней и точкой прицеливания, второй между орудием и точкой прицеливания. Вчера попробовал 2D сделать. Опять что-то непонятное выходит. Сейчас сделал в блендере точку прицеливания. А результат-то более-менее правдоподобен. Только должно быть немного меньше 90 (где-то 87), а получается чуть больше (где-то 93).
  8. Да. Подумал, что надо в 2d считать. Ведь поворот будет в одной плоскости. Получается, что нужен угол между двумя векторами, но два 2D вектора, у одного нет оси Y, у другого Z что-ли от изначальной точки прицеливания. И всё-равно ерунда получается. Игра любезно сообщает, что при координатах (-600.0, 11.7943, 35.0167999) должен быть результат (0.0630506500602, 0.027105294168) turretYaw и gunPitch. В радианах, так понимаю. У меня получается 1.62909153346. Координаты для башни оставил XZ. И ерунда получилась. Либо в координатах какая-то ошибка, хотя у меня в блендере собран танк и координаты совпадают.
  9. Вот это мне и надо. Трудности с этим возникли непреодолимые. Башня поворачивается в xz, ось Y не надо учитывать? Как итоговый вектор должен выглядеть? Занулить по оси? turret_vector.Angle_Between(Math.Vector3(vector3[0], 0, vector3[2])) Получается ерунда. И надо для вектора башни тоже какие-то манипуляции делать?
  10. У меня есть какая-то функция по переводу матрицы в вектор поворота. Только это перевод в yaw, pitch, roll, мне же один параметр нужен. Yaw для башни и Pitch для орудия. Как угол между векторами узнать - легко. Для меня не понятно, как угол для башни и орудия найти. Повернуть надо по одной оси для башни и орудия. Вот эти углы надо найти.
  11. У меня сейчас только положение башни и орудия. Матрица будет позже, кватернион не нужен здесь, поворот вокруг одной оси только. Как мне угол узнать, на какой нужно повернуть башню и орудие? Это какой столбец матрицы? Или как его получить, если это не столбец?
  12. @SkepticalFox Будет вектор направления. А что с ним делать дальше?
  13. @SkepticalFox Формула, нужна формула. Нормализовать вектора? Что отнормировать?
  14. Опять настало время задавать вопросы. Проблемы мелкие, а решить их не могу. В 3d совсем не понимаю. Есть башня и орудие. Есть их положение в виде векторов. Есть точка, на которую орудие должно быть направлено. Как узнать угол между точкой и башней и между точкой и орудием? Просто угол между векторами не даст нужного результата, потому что и башня, и орудие поворачиваются в одной плоскости (каждый в своей). К примеру, координаты. Башня 0.000000, 1.382792, -1.968760 Орудие 0.000000, 2.807242, -2.682675 Точка наведения -600.0, 11.7943, 35.0167999 Начальное положение танка в нулевых координатах. Правильно понимаю, что в данном случае можно не переводить координаты в локальные для танка?
  15. Тогда вопрос отпадает сам собой. У меня выбор си был вызван тем, что мне нравится этот язык. Но это было, не в полной мере, но несколько ошибочно. Хотя бы с++ надо, надоедает базовые вещи реализовывать самому (типа контейнеров, векторов и прочее, что есть уже реализовано в стандартной библиотеке). Зато в нём всё просто и понятно, в отличие от с++. Только это немножко, слегка так, тяжеловато сделать. Там есть сетевой протокол свой собственный с реализацией (утрированно) TCP на UDP. Контроль целостности, ретрансмитты, шифрование. Его надо сделать. На питоне. А потом надо в дизассемблере подсмотреть, что клиент ожидает от сервера и повторить у себя.
×
×
  • Create New...