Jump to content
Korean Random
Dragon armor

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

Recommended Posts

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

Share this post


Link to post

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? Что за скорость?

Share this post


Link to post

Short link
Share on other sites
57 минут назад, Dragon armor сказал:

prevVelocity = shotVec - так что такое shotVec? Что за скорость?

Направление вектора выстрела (скорости)?

Share this post


Link to post

Short link
Share on other sites

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

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

image.thumb.png.a56116aef6c6c21abc30124ca85e8d60.png

Share this post


Link to post

Short link
Share on other sites
17 минут назад, Dragon armor сказал:

Так направление выстрела или скорость?

Вектор скорости.

Скорее вектор начальной скорости 

Share this post


Link to post

Short link
Share on other sites
2 часа назад, Dragon armor сказал:

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

 

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

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

 

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

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites
startPoint += player.vehicleTypeDescriptor.hull.turretPositions[0] + player.vehicleTypeDescriptor.turret.gunPosition

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

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

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

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

Share this post


Link to post

Short link
Share on other sites
4 hours ago, Dragon armor said:

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

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

 

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

Edited by SkepticalFox

Share this post


Link to post

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

Share this post


Link to post

Short link
Share on other sites
1 минуту назад, StranikS_Scan сказал:

и вот так, если модель игрока не видна:

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

Share this post


Link to post

Short link
Share on other sites
3 часа назад, Dragon armor сказал:

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

 

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

 

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

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

 

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

Edited by StranikS_Scan
  • Upvote 1

Share this post


Link to post

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

Share this post


Link to post

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

Share this post


Link to post

Short link
Share on other sites
2 часа назад, StranikS_Scan сказал:

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

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

Share this post


Link to post

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

Share this post


Link to post

Short link
Share on other sites

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...