Jump to content
Korean Random
Dragon armor

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

Recommended Posts

7 минут назад, SkepticalFox сказал:

у тебя там похоже матрица, или кватернион, сам смотри)

У меня сейчас только положение башни и орудия. Матрица будет позже, кватернион не нужен здесь, поворот вокруг одной оси только.

Как мне угол узнать, на какой нужно повернуть башню и орудие?

1 минуту назад, SkepticalFox сказал:

с вектором поворота gun/turret

Это какой столбец матрицы? Или как его получить, если это не столбец?

Share this post


Link to post

Short link
Share on other sites
3 минуты назад, SkepticalFox сказал:

с вектором поворота gun/turret

У меня есть какая-то функция по переводу матрицы в вектор поворота. Только это перевод в yaw, pitch, roll, мне же один параметр нужен. Yaw для башни и Pitch для орудия.

1 минуту назад, SkepticalFox сказал:

dot product двух нормированных векторов даст cos угла, а чтобы получить угол нужен acos

Как угол между векторами узнать - легко. Для меня не понятно, как угол для башни и орудия найти. Повернуть надо по одной оси для башни и орудия. Вот эти углы надо найти.

Share this post


Link to post

Short link
Share on other sites
7 minutes ago, Dragon armor said:

Как угол между векторами узнать - легко. Для меня не понятно, как угол для башни и орудия найти. Повернуть надо по одной оси для башни и орудия. Вот эти углы надо найти.

так формулы те же, просто вектора надо собрать правильно

лучше визуализируй это как-то, можно в blender через constraints

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites
Только что, SkepticalFox сказал:

просто вектора надо собрать правильно

Вот это мне и надо. Трудности с этим возникли непреодолимые.

Башня поворачивается в xz, ось Y не надо учитывать? Как итоговый вектор должен выглядеть? Занулить по оси?

turret_vector.Angle_Between(Math.Vector3(vector3[0], 0, vector3[2]))

Получается ерунда. И надо для вектора башни тоже какие-то манипуляции делать?

Share this post


Link to post

Short link
Share on other sites

тебе такое нужно?

тут короче надо нормировать точку относительно origin'ов башни и орудия, и залочить оси, по которым осуществлять поворот, вроде ничего хитрого

Share this post


Link to post

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

тебе такое нужно?

Да. Подумал, что надо в 2d считать. Ведь поворот будет в одной плоскости. Получается, что нужен угол между двумя векторами, но два 2D вектора, у одного нет оси Y, у другого Z что-ли от изначальной точки прицеливания. И всё-равно ерунда получается. Игра любезно сообщает, что при координатах (-600.0, 11.7943, 35.0167999) должен быть результат (0.0630506500602, 0.027105294168) turretYaw и gunPitch. В радианах, так понимаю. У меня получается 1.62909153346.

Координаты для башни оставил XZ. И ерунда получилась. Либо в координатах какая-то ошибка, хотя у меня в блендере собран танк и координаты совпадают.

Share this post


Link to post

Short link
Share on other sites

Ну да, тангаж для орудия и рыскание для башни, 2d самое настоящее 

Edited by SkepticalFox

Share this post


Link to post

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

Как узнать угол между точкой и башней и между точкой и орудием?

 

Если бы это был клиент игры, то я бы сделал так:

image.png.0ff0a28f6a111fae7819a2b2fb8042fd.png

 

turretDir = TurretPoint - TargetPoint

turretDir.normalise()

gunDir = gunPoint - TargetPoint

gunDir.normalise()

acosAngle = turretDir,dot(gunDir)

 

9 часов назад, Dragon armor сказал:

Yaw для башни и Pitch для орудия.

 

Напиши более конкретно ситуацию, что ты хочешь? Ты хочешь повернуть башню в сторону нужной точки или что?

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

@StranikS_Scan Тут получается угол между башней и орудием. Мне надо другое.

image.png.6e918adaa264cb4613dcdc3fcf887581.png

Вид сверху и сбоку. Точка прицеливания где-то. Для башни не нужна высота точки, нужны только координаты в плоскости XZ (в блендере система координат XYZ, в игре используется XZY).

image.thumb.png.02c84d20372631ddeeb15391bc94c5b2.png

Для орудия не нужна координата X.

image.thumb.png.7c70e78f2c68a13f2a23d6aeceae7c0d.png

Мне надо два угла, один между башней и точкой прицеливания, второй между орудием и точкой прицеливания. Вчера попробовал 2D сделать. Опять что-то непонятное выходит.

Сейчас сделал в блендере точку прицеливания. А результат-то более-менее правдоподобен. Только должно быть немного меньше 90 (где-то 87), а получается чуть больше (где-то 93).

image.png.e5967ad1b17a8b7adbcd97a5f582794b.png

Share this post


Link to post

Short link
Share on other sites

В клиенте игры, если мне нужно узнать угол поворота по вертикальной оси между вектором направления корпуса моего танка и вектором на точку Point, то делаю вот так:

 

image.png.934d640a105a9767bc388e4275440e6f.png

 

playerPos = BigWorld.player().getOwnVehiclePosition()

playerMatrix = Matrix(BigWorld.player().getOwnVehicleMatrix())

pointDir = Point - playerPos
pointDir .normalise()
yawAngle = pointDir.yaw - playerMatrix.yaw #Угол в радианах

 

Если делать расчет относительно башни, то так будет Matrix(vehicle.appearance.compoundModel.node(TURRET)).yaw вместо playerMatrix.yaw

 

В Блендер будет по аналогии с той лишь разницей, что надо учесть Y <----> Z

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

@StranikS_Scan Получилось 86, только со знаком минус. Уже ближе похоже. И 2D не нужно, получается. Позже попробую посмотреть, как в игре это выглядеть будет.

Share this post


Link to post

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

@StranikS_Scan Получилось 86, только со знаком минус. Уже ближе похоже. И 2D не нужно, получается. Позже попробую посмотреть, как в игре это выглядеть будет.

 

Вполне возможно, что тебе нужно playerMatrix.yaw - pointDir.yaw. Для твоих нужд.

Share this post


Link to post

Short link
Share on other sites

Беру подсказку «Помощь зала», скорее в целях понять, что происходит (да и тема ожила внезапно). Вот есть дерево исследований, в нём модули, которые надо исследовать. У клиента есть команда для сервера.

# Python bytecode 2.7 (decompiled from Python 2.7)
# Embedded file name: scripts/client/account_helpers/Stats.py, строки 113-124

def unlock(self, vehTypeCompDescr, unlockIdx, callback=None):
    if self.__ignore:
        if callback is not None:
            callback(AccountCommands.RES_NON_PLAYER)
        return
    else:
        if callback is not None:
            proxy = lambda requestID, resultID, errorStr, ext={}: callback(resultID)
        else:
            proxy = None
        self.__account._doCmdInt3(AccountCommands.CMD_UNLOCK, vehTypeCompDescr, unlockIdx, 0, proxy)
        return

vehTypeCompDescr — тут понятно, танк, на котором мы что-то исследуем. А что за загадочная переменная unlockIdx? Ковырнул DAAPI, получил такие интересные данные:

# Python bytecode 2.7 (decompiled from Python 2.7)
# Embedded file name: scripts/client/gui/Scaleform/daapi/view/lobby/techtree/settings.py, строки 148-154

class UnlockProps(namedtuple('UnlockProps', 'parentID unlockIdx xpCost required')):

    def makeTuple(self):
        return (self.parentID,
         self.unlockIdx,
         self.xpCost,
         list(self.required))
      
# Вывод в python.log:
1809-0-1025-[1809, 3090]
1809-1-120-[1809, 2325]
1809-2-400-[1809, 2581, 2325]
1809-3-850-[1809, 2581, 2325, 2837]
1809-4-3600-[1809, 2839]
1809-5-5600-[1809, 1559, 2839]
1809-6-3400-[1809, 2579, 4372]
1809-7-12435-[1809, 2579, 4372]
1809-8-3800-[1809, 2579, 4372]
     ^ - это индекс элемента листа, обозначающий модуль, который надо исследовать

Вопрос: что (или какая функция) в клиенте создаёт лист модулей для исследования, из которого достают индекс и посылают его серверу?

Share this post


Link to post

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

всмысле кто xml отсюда читает?

Осмелюсь предположить, что это items.vehicles._readUnlocks, в нём есть некоторые операции над листом, но мне кажется, что это не то и не туда.

Share this post


Link to post

Short link
Share on other sites
22 минуты назад, DrWeb7_1 сказал:

в нём есть некоторые операции над листом

Возможно, это предположение имеет право на жизнь, unlocksDescrs выдаёт такую информацию:

[(1940, 'vehicleChassis', 'T-34_mod_1943', 2), (1940, 'vehicleChassis', 'T-34_mod_1943', 2), (5000, 'vehicleEngine', 'V-2-34', 5), (5000, 'vehicleEngine', 'V-2-34', 5)]

Опыт, тип предмета, его техническое имя и... какое-то requiredItems. Очередной загадочный индекс, который, по логике, должен обозначать требуемый для исследования предмет. Тогда вопрос: почему тут две ходовых Т-34 образца 1943 года?

Share this post


Link to post

Short link
Share on other sites

Окей, доктору нужен доктор, и, видимо, это окулист (у меня -3.5 дпт, очки на -3 ношу, хотя рецепт на новые линзы уже на руках давно лежит). Всё оказалось проще, это атрибут unlocksDescrs для объекта items.vehicles.VehicleType.

В случае с МС-1 последовательность такова: пушка 45 мм, АТ-1, Т-60, БТ-2, Т-26, СУ-18. Надеюсь, что очерёдность я понял правильно.

[(40, 9220, 6147, 5892),
 (270, 5121, 5892, 6147, 9220),
 (270, 15361, 5892, 6147, 9220),
 (270, 1025, 5892, 6147, 9220),
 (270, 4609, 5892, 6147, 9220),
 (270, 3841, 5892, 6147, 9220)]

Что ж, @SkepticalFox, спасибо за наводку. :rolleyes:

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