DrWeb7_1 181 #516397 Posted February 15, 2022 И ещё раз потревожу «зал» по вопросу загадочных цифр. В account есть два set с одинаковыми названиями — unlocks и eliteVehicles. Одна пара сидит в account.stats, другая в account.economics. Оба содержат идентификаторы танков и их модулей. В чём разница, кроме их размера? Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516435 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 Share this post Link to post Short link Share on other sites
ktulho 5,790 #516440 Posted February 16, 2022 57 минут назад, Dragon armor сказал: prevVelocity = shotVec - так что такое shotVec? Что за скорость? Направление вектора выстрела (скорости)? Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516441 Posted February 16, 2022 @ktulho Так направление выстрела или скорость? Как в одном векторе объединить две разных величины? У меня предположение, что это точка на ландшафте. Проверить не могу, cellapp пока что не может делать рейкаст (или как эта штука называется). И ландшафт при дампе уехал куда-то, поэтому не понятно, заканчивается точка на ландшафте или где-то ещё. А начальная точка примерно отсюда начинается. Quote Share this post Link to post Short link Share on other sites
ktulho 5,790 #516442 Posted February 16, 2022 17 минут назад, Dragon armor сказал: Так направление выстрела или скорость? Вектор скорости. Скорее вектор начальной скорости Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #516447 Posted February 16, 2022 (edited) 2 часа назад, Dragon armor сказал: Сервер присылает клиенту через функцию updateGunMarker некие вектора, shotPos - координаты точки крепления пушки (опорной точки орудия) в глобальном пространстве на сервере игры (именно эта точка считается началом баллистической траектории снаряда) shotVec - вектор начальной скорости на сервере игры в точке shotPos (это типа вот так shotDir*ShotSpeed) Вот тут можно немного почитать о коде прицела в игре - тыц. Edited February 16, 2022 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516448 Posted February 16, 2022 startPoint += player.vehicleTypeDescriptor.hull.turretPositions[0] + player.vehicleTypeDescriptor.turret.gunPosition А так можно? А то матрицы тут перемножаю, чтобы точку получить. 11 минут назад, StranikS_Scan сказал: это типа вот так shotDir*ShotSpeed Ясно. А зачем так? У клиента же есть скорость снаряда. Почему просто не передать направление? Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #516451 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 Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #516459 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 Share this post Link to post Short link Share on other sites
DrWeb7_1 181 #516460 Posted February 16, 2022 1 минуту назад, StranikS_Scan сказал: и вот так, если модель игрока не видна: Это касается снайперского или артиллерийского прицела, так? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #516461 Posted February 16, 2022 (edited) 3 часа назад, Dragon armor сказал: А зачем так? У клиента же есть скорость снаряда Может есть, а может и нет. Серверу виднее. Только что, DrWeb7_1 сказал: Это касается снайперского или артиллерийского прицела, так? К прицелу отношения не имеет. Это же опорная точка орудия. Это к модели танка имеет прямое отношение и к баллистике снаряда. Edited February 16, 2022 by StranikS_Scan 1 Quote Share this post Link to post Short link Share on other sites
MegaNagibator112 0 #516759 Posted February 23, 2022 Здравствуйте,можно ли как-то попасть на ваш сервер? Quote Share this post Link to post Short link Share on other sites
yepev 287 #516760 Posted February 23, 2022 @MegaNagibator112 нет пока ещё никакого сервера. В теме обсуждается как разработать эмулятор. 1 Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516909 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 Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #516952 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 Share this post Link to post Short link Share on other sites
DrWeb7_1 181 #516956 Posted February 26, 2022 2 часа назад, StranikS_Scan сказал: В примере на выходе точка выстрела, вектор направления умноженный на скорость и вектор гравитации. Либо знаки препинания потерялись, либо я не понял. Этот вектор представляет собой направление полёта снаряда, т.е. туда, куда он полетит, и конечная точка является точкой, где снаряд прекратит своё движение? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #516967 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 Share this post Link to post Short link Share on other sites
niktoplay11 0 #517675 Posted May 21, 2022 Проект ещё жив? Quote Share this post Link to post Short link Share on other sites
апасная рука 0 #520556 Posted June 28, 2022 (edited) .... Edited January 24 by AGS1730 Quote Share this post Link to post Short link Share on other sites
DrWeb7_1 181 #520558 Posted June 28, 2022 14 минут назад, AGS1730 сказал: Dragon armor, Расскажи пожалуйста как собрать твой проект Как можно собрать то, чего нет? Quote Share this post Link to post Short link Share on other sites