DrWeb7_1 Posted February 15, 2022 Share Posted February 15, 2022 И ещё раз потревожу «зал» по вопросу загадочных цифр. В account есть два set с одинаковыми названиями — unlocks и eliteVehicles. Одна пара сидит в account.stats, другая в account.economics. Оба содержат идентификаторы танков и их модулей. В чём разница, кроме их размера? @ Quote Link to comment Short link Share on other sites More sharing options...
Dragon armor Posted February 16, 2022 Author Share Posted February 16, 2022 И так, возвращаюсь к тому, на чём застрял ещё в самом начале. Сервер присылает клиенту через функцию 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? Что за скорость? @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted February 16, 2022 Share Posted February 16, 2022 57 минут назад, Dragon armor сказал: prevVelocity = shotVec - так что такое shotVec? Что за скорость? Направление вектора выстрела (скорости)? @ Quote Link to comment Short link Share on other sites More sharing options...
Dragon armor Posted February 16, 2022 Author Share Posted February 16, 2022 @ktulho Так направление выстрела или скорость? Как в одном векторе объединить две разных величины? У меня предположение, что это точка на ландшафте. Проверить не могу, cellapp пока что не может делать рейкаст (или как эта штука называется). И ландшафт при дампе уехал куда-то, поэтому не понятно, заканчивается точка на ландшафте или где-то ещё. А начальная точка примерно отсюда начинается. @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted February 16, 2022 Share Posted February 16, 2022 17 минут назад, Dragon armor сказал: Так направление выстрела или скорость? Вектор скорости. Скорее вектор начальной скорости @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted February 16, 2022 Share Posted February 16, 2022 (edited) 2 часа назад, Dragon armor сказал: Сервер присылает клиенту через функцию updateGunMarker некие вектора, shotPos - координаты точки крепления пушки (опорной точки орудия) в глобальном пространстве на сервере игры (именно эта точка считается началом баллистической траектории снаряда) shotVec - вектор начальной скорости на сервере игры в точке shotPos (это типа вот так shotDir*ShotSpeed) Вот тут можно немного почитать о коде прицела в игре - тыц. Edited February 16, 2022 by StranikS_Scan @ Quote Link to comment Short link Share on other sites More sharing options...
Dragon armor Posted February 16, 2022 Author Share Posted February 16, 2022 startPoint += player.vehicleTypeDescriptor.hull.turretPositions[0] + player.vehicleTypeDescriptor.turret.gunPosition А так можно? А то матрицы тут перемножаю, чтобы точку получить. 11 минут назад, StranikS_Scan сказал: это типа вот так shotDir*ShotSpeed Ясно. А зачем так? У клиента же есть скорость снаряда. Почему просто не передать направление? @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 16, 2022 Share Posted February 16, 2022 (edited) 4 hours ago, Dragon armor said: dot - скалярное умножение векторов, тут что хотят проверить? Что вектор не нулевой? dot двух нормированных векторов вернет cos между ними, видимо эта логика не нужна, если cos <= 0.0 возможно это такой culling маркеров... Edited February 16, 2022 by SkepticalFox @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted February 16, 2022 Share Posted February 16, 2022 3 часа назад, Dragon armor сказал: А так можно? Вот так нужно, если модель видна: startPoint = BigWorld.entity(BigWorld.player().playerVehicleID).appearance.compoundModel.node(GUN).position и вот так, если модель игрока не видна: startPoint = BigWorld.player().getOwnVehiclePosition() startPoint += BigWorld.player().vehicleTypeDescriptor.hull.turretPositions[0] + BigWorld.player().vehicleTypeDescriptor.turret.gunPosition @ Quote Link to comment Short link Share on other sites More sharing options...
DrWeb7_1 Posted February 16, 2022 Share Posted February 16, 2022 1 минуту назад, StranikS_Scan сказал: и вот так, если модель игрока не видна: Это касается снайперского или артиллерийского прицела, так? @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted February 16, 2022 Share Posted February 16, 2022 (edited) 3 часа назад, Dragon armor сказал: А зачем так? У клиента же есть скорость снаряда Может есть, а может и нет. Серверу виднее. Только что, DrWeb7_1 сказал: Это касается снайперского или артиллерийского прицела, так? К прицелу отношения не имеет. Это же опорная точка орудия. Это к модели танка имеет прямое отношение и к баллистике снаряда. Edited February 16, 2022 by StranikS_Scan 1 @ Quote Link to comment Short link Share on other sites More sharing options...
MegaNagibator112 Posted February 23, 2022 Share Posted February 23, 2022 Здравствуйте,можно ли как-то попасть на ваш сервер? @ Quote Link to comment Short link Share on other sites More sharing options...
yepev Posted February 23, 2022 Share Posted February 23, 2022 @MegaNagibator112 нет пока ещё никакого сервера. В теме обсуждается как разработать эмулятор. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Dragon armor Posted February 26, 2022 Author Share Posted February 26, 2022 (edited) Микроскопическая проблема и полный тупик. У меня не получается. Не понимаю, что надо сделать, чтобы получить вектор направления. Если у меня есть yaw и pitch, как из них сделать вектор направления? Или не так надо? А нужно из матрицы? Или это отдельный параметр? Но turret_yaw используется для получения координат крепления орудия. Что надо сделать, чтобы получить вектор направления? При этом, если отдельно отправлять yaw/pitch в gunAnglesPacked для остальной техники, башня вращается почти правильно (зацикливается на переходе 180 градусов, пока причину бага не искал). 17.02.2022 в 01:10, StranikS_Scan сказал: Вот так нужно, если модель видна: startPoint = BigWorld.entity(BigWorld.player().playerVehicleID).appearance.compoundModel.node(GUN).position и вот так, если модель игрока не видна: startPoint = BigWorld.player().getOwnVehiclePosition() startPoint += BigWorld.player().vehicleTypeDescriptor.hull.turretPositions[0] + BigWorld.player().vehicleTypeDescriptor.turret.gunPosition У меня не получится так сделать. Только из модели (либо 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 можно сложить? Они же не изменяются в локальной системе координат? Или надо перейти в локальную систему (точку прицеливания перевести в локальную) и считать углы там? Кто-нибудь объясните, что надо сделать. Edited February 26, 2022 by Dragon armor @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted February 26, 2022 Share Posted February 26, 2022 (edited) 8 часов назад, Dragon armor сказал: xml находятся локальные Да, локальные. Точка отсчета - опорная точка всей модели танка - это vType.chassis.hullPosition Переход из локальных в глобальные координаты и наоборот я в своих модах осуществляю так: def __worldToVehMatrix(self, point, matrix=None): #Из глобального в локальное пространство worldMatrix = Matrix(self.__entity.matrix if matrix is None else matrix) worldMatrix.invert() return worldMatrix.applyPoint(point) def __vehToWorldMatrix(self, point, matrix=None): #Из локального в глобальное пространство return Matrix(self.__entity.matrix if matrix is None else matrix).applyPoint(point) Всё крутиться вокруг матрицы модели танка, например BigWorld.entity(BigWorld.player().playerVehicleID).matrix 8 часов назад, Dragon armor сказал: Если у меня есть yaw и pitch, как из них сделать вектор направления? Может вот этот пример тебе поможет: def calcShotParams(entity): #Расчёт точки выстрела, величины и направления вектора скорости снаряда видимого танка angles = entity.gunAnglesPacked turretYaw, gunPitch = decodeGunAngles(angles if type(angles) == int else angles[0], entity.typeDescriptor.gun.pitchLimits['absolute']) turretOffs = entity.typeDescriptor.hull.turretPositions[0] + entity.typeDescriptor.chassis.hullPosition turretWorldMatrix = Matrix() turretWorldMatrix.setRotateY(turretYaw) turretWorldMatrix.translation = turretOffs turretWorldMatrix.postMultiply(Matrix(entity.matrix)) gunWorldMatrix = Matrix() gunWorldMatrix.setRotateX(gunPitch) gunWorldMatrix.postMultiply(turretWorldMatrix) if BigWorld.new_Vehicles: vInfo = BigWorld.new_Vehicles.Info[entity.id] shellID = vInfo['vehicleType'].activeGunShotIndex return turretWorldMatrix.applyPoint(entity.typeDescriptor.turret.gunPosition), gunWorldMatrix.applyVector(Vector3(0, 0, vInfo['shells']['speed'][shellID]/0.8)), Vector3(0.0, -vInfo['shells']['gravity'][shellID]/0.64, 0.0) В примере на выходе точка выстрела, вектор направления умноженный на скорость и вектор гравитации. Edited February 26, 2022 by StranikS_Scan @ Quote Link to comment Short link Share on other sites More sharing options...
DrWeb7_1 Posted February 26, 2022 Share Posted February 26, 2022 2 часа назад, StranikS_Scan сказал: В примере на выходе точка выстрела, вектор направления умноженный на скорость и вектор гравитации. Либо знаки препинания потерялись, либо я не понял. Этот вектор представляет собой направление полёта снаряда, т.е. туда, куда он полетит, и конечная точка является точкой, где снаряд прекратит своё движение? @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted February 27, 2022 Share Posted February 27, 2022 (edited) 6 часов назад, DrWeb7_1 сказал: Либо знаки препинания потерялись, либо я не понял. Этот вектор представляет собой направление полёта снаряда, т.е. туда, куда он полетит, и конечная точка является точкой, где снаряд прекратит своё движение? def calcShotParams(entity): angles = entity.gunAnglesPacked #Закодированные данные об текущем значении угла поворота башни и угла возвыщения орудия, присланные на клиент игры сервером turretYaw, gunPitch = decodeGunAngles(angles if type(angles) == int else angles[0], entity.typeDescriptor.gun.pitchLimits['absolute']) #Декодирование этих углов с учетом ограничений по наводки орудия из ТТХ танка turretOffs = entity.typeDescriptor.hull.turretPositions[0] + entity.typeDescriptor.chassis.hullPosition #Опорная точка башни в локальных координатах корпуса танка, т.е. относительно опорной точки корупуса, которая является опорной точкой всей модели в целом turretWorldMatrix = Matrix() turretWorldMatrix.setRotateY(turretYaw) turretWorldMatrix.translation = turretOffs #Матрица ориентации башни в локальном пространстве turretWorldMatrix.postMultiply(Matrix(entity.matrix)) #Переход из локального пространства в глобальное gunWorldMatrix = Matrix() gunWorldMatrix.setRotateX(gunPitch) gunWorldMatrix.postMultiply(turretWorldMatrix) #Матрица ориентации пушки в глобальном пространстве if BigWorld.new_Vehicles: vInfo = BigWorld.new_Vehicles.Info[entity.id] shellID = vInfo['vehicleType'].activeGunShotIndex return turretWorldMatrix.applyPoint(entity.typeDescriptor.turret.gunPosition), #Положение опорной точки орудия танка в глобальных координатах (из этой точки строится и вычисляется баллист. траектория полета снаряда) gunWorldMatrix.applyVector(Vector3(0, 0, vInfo['shells']['speed'][shellID]/0.8)), #Вектор начальной скорости снаряда в опорной точке орудия Vector3(0.0, -vInfo['shells']['gravity'][shellID]/0.64, 0.0) #Гравитация в векторной форме Edited February 27, 2022 by StranikS_Scan 2 @ Quote Link to comment Short link Share on other sites More sharing options...
niktoplay11 Posted May 21, 2022 Share Posted May 21, 2022 Проект ещё жив? @ Quote Link to comment Short link Share on other sites More sharing options...
апасная рука Posted June 28, 2022 Share Posted June 28, 2022 (edited) .... Edited January 24 by AGS1730 @ Quote Link to comment Short link Share on other sites More sharing options...
DrWeb7_1 Posted June 28, 2022 Share Posted June 28, 2022 14 минут назад, AGS1730 сказал: Dragon armor, Расскажи пожалуйста как собрать твой проект Как можно собрать то, чего нет? @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.