Jump to content
Korean Random

Мод "Эмулятор сервера World of Tanks".


Recommended Posts

И ещё раз потревожу «зал» по вопросу загадочных цифр. В account есть два set с одинаковыми названиями — unlocks и eliteVehicles. Одна пара сидит в account.stats, другая в account.economics. Оба содержат идентификаторы танков и их модулей. В чём разница, кроме их размера?

Link to comment
Short link
Share on other sites

И так, возвращаюсь к тому, на чём застрял ещё в самом начале. Сервер присылает клиенту через функцию 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? Что за скорость?

Link to comment
Short link
Share on other sites

@ktulho Так направление выстрела или скорость? Как в одном векторе объединить две разных величины? У меня предположение, что это точка на ландшафте. Проверить не могу, cellapp пока что не может делать рейкаст (или как эта штука называется). И ландшафт при дампе уехал куда-то, поэтому не понятно, заканчивается точка на ландшафте или где-то ещё.

А начальная точка примерно отсюда начинается.

image.thumb.png.a56116aef6c6c21abc30124ca85e8d60.png

Link to comment
Short link
Share on other sites

2 часа назад, Dragon armor сказал:

Сервер присылает клиенту через функцию updateGunMarker некие вектора,

 

shotPos - координаты точки крепления пушки (опорной точки орудия) в глобальном пространстве на сервере игры (именно эта точка считается началом баллистической траектории снаряда)

shotVec - вектор начальной скорости на сервере игры в точке shotPos (это типа вот так shotDir*ShotSpeed)

 

Вот тут можно немного почитать о коде прицела в игре - тыц.

Edited by StranikS_Scan
Link to comment
Short link
Share on other sites

startPoint += player.vehicleTypeDescriptor.hull.turretPositions[0] + player.vehicleTypeDescriptor.turret.gunPosition

А так можно? А то матрицы тут перемножаю, чтобы точку получить.

11 минут назад, StranikS_Scan сказал:

это типа вот так shotDir*ShotSpeed

Ясно. А зачем так? У клиента же есть скорость снаряда. Почему просто не передать направление?

Link to comment
Short link
Share on other sites

4 hours ago, Dragon armor said:

dot - скалярное умножение векторов, тут что хотят проверить? Что вектор не нулевой?

dot двух нормированных векторов вернет cos между ними, видимо эта логика не нужна, если cos <= 0.0

 

возможно это такой culling маркеров...

Edited by SkepticalFox
Link to comment
Short link
Share on other sites

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

Link to comment
Short link
Share on other sites

3 часа назад, Dragon armor сказал:

А зачем так? У клиента же есть скорость снаряда

 

Может есть, а может и нет. Серверу виднее.

 

Только что, DrWeb7_1 сказал:

Это касается снайперского или артиллерийского прицела, так?

 

К прицелу отношения не имеет. Это же опорная точка орудия. Это к модели танка имеет прямое отношение и к баллистике снаряда.

Edited by StranikS_Scan
  • Upvote 1
Link to comment
Short link
Share on other sites

Микроскопическая проблема и полный тупик. У меня не получается. Не понимаю, что надо сделать, чтобы получить вектор направления. Если у меня есть 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 by Dragon armor
Link to comment
Short link
Share on other sites

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 by StranikS_Scan
Link to comment
Short link
Share on other sites

2 часа назад, StranikS_Scan сказал:

В примере на выходе точка выстрела, вектор направления умноженный на скорость и вектор гравитации.

Либо знаки препинания потерялись, либо я не понял. Этот вектор представляет собой направление полёта снаряда, т.е. туда, куда он полетит, и конечная точка является точкой, где снаряд прекратит своё движение?

Link to comment
Short link
Share on other sites

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) #Гравитация в векторной форме

image.thumb.png.0c99a5c5ef8d00fbe551c8edd53bdf59.png

Edited by StranikS_Scan
  • Upvote 2
Link to comment
Short link
Share on other sites

  • 2 months later...
  • 1 month later...

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...