SkepticalFox 1,445 #516237 Posted February 12, 2022 @Dragon armor acos() взять от dot product этого вектора с вектором поворота gun/turret Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516238 Posted February 12, 2022 7 минут назад, SkepticalFox сказал: у тебя там похоже матрица, или кватернион, сам смотри) У меня сейчас только положение башни и орудия. Матрица будет позже, кватернион не нужен здесь, поворот вокруг одной оси только. Как мне угол узнать, на какой нужно повернуть башню и орудие? 1 минуту назад, SkepticalFox сказал: с вектором поворота gun/turret Это какой столбец матрицы? Или как его получить, если это не столбец? Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #516239 Posted February 12, 2022 dot product двух нормированных векторов даст cos угла, а чтобы получить угол нужен acos Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516241 Posted February 12, 2022 3 минуты назад, SkepticalFox сказал: с вектором поворота gun/turret У меня есть какая-то функция по переводу матрицы в вектор поворота. Только это перевод в yaw, pitch, roll, мне же один параметр нужен. Yaw для башни и Pitch для орудия. 1 минуту назад, SkepticalFox сказал: dot product двух нормированных векторов даст cos угла, а чтобы получить угол нужен acos Как угол между векторами узнать - легко. Для меня не понятно, как угол для башни и орудия найти. Повернуть надо по одной оси для башни и орудия. Вот эти углы надо найти. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #516242 Posted February 12, 2022 (edited) 7 minutes ago, Dragon armor said: Как угол между векторами узнать - легко. Для меня не понятно, как угол для башни и орудия найти. Повернуть надо по одной оси для башни и орудия. Вот эти углы надо найти. так формулы те же, просто вектора надо собрать правильно лучше визуализируй это как-то, можно в blender через constraints Edited February 12, 2022 by SkepticalFox Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516243 Posted February 12, 2022 Только что, SkepticalFox сказал: просто вектора надо собрать правильно Вот это мне и надо. Трудности с этим возникли непреодолимые. Башня поворачивается в xz, ось Y не надо учитывать? Как итоговый вектор должен выглядеть? Занулить по оси? turret_vector.Angle_Between(Math.Vector3(vector3[0], 0, vector3[2])) Получается ерунда. И надо для вектора башни тоже какие-то манипуляции делать? Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #516245 Posted February 12, 2022 тебе такое нужно? Blender 2022-02-12 12-14-17_Trim.mp4 тут короче надо нормировать точку относительно origin'ов башни и орудия, и залочить оси, по которым осуществлять поворот, вроде ничего хитрого Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516246 Posted February 12, 2022 21 минуту назад, SkepticalFox сказал: тебе такое нужно? Да. Подумал, что надо в 2d считать. Ведь поворот будет в одной плоскости. Получается, что нужен угол между двумя векторами, но два 2D вектора, у одного нет оси Y, у другого Z что-ли от изначальной точки прицеливания. И всё-равно ерунда получается. Игра любезно сообщает, что при координатах (-600.0, 11.7943, 35.0167999) должен быть результат (0.0630506500602, 0.027105294168) turretYaw и gunPitch. В радианах, так понимаю. У меня получается 1.62909153346. Координаты для башни оставил XZ. И ерунда получилась. Либо в координатах какая-то ошибка, хотя у меня в блендере собран танк и координаты совпадают. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #516247 Posted February 12, 2022 (edited) Ну да, тангаж для орудия и рыскание для башни, 2d самое настоящее Edited February 12, 2022 by SkepticalFox Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #516259 Posted February 13, 2022 (edited) 9 часов назад, Dragon armor сказал: Как узнать угол между точкой и башней и между точкой и орудием? Если бы это был клиент игры, то я бы сделал так: turretDir = TurretPoint - TargetPoint turretDir.normalise() gunDir = gunPoint - TargetPoint gunDir.normalise() acosAngle = turretDir,dot(gunDir) 9 часов назад, Dragon armor сказал: Yaw для башни и Pitch для орудия. Напиши более конкретно ситуацию, что ты хочешь? Ты хочешь повернуть башню в сторону нужной точки или что? Edited February 13, 2022 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516260 Posted February 13, 2022 @StranikS_Scan Тут получается угол между башней и орудием. Мне надо другое. Вид сверху и сбоку. Точка прицеливания где-то. Для башни не нужна высота точки, нужны только координаты в плоскости XZ (в блендере система координат XYZ, в игре используется XZY). Для орудия не нужна координата X. Мне надо два угла, один между башней и точкой прицеливания, второй между орудием и точкой прицеливания. Вчера попробовал 2D сделать. Опять что-то непонятное выходит. Сейчас сделал в блендере точку прицеливания. А результат-то более-менее правдоподобен. Только должно быть немного меньше 90 (где-то 87), а получается чуть больше (где-то 93). Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #516264 Posted February 13, 2022 (edited) В клиенте игры, если мне нужно узнать угол поворота по вертикальной оси между вектором направления корпуса моего танка и вектором на точку Point, то делаю вот так: 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 February 13, 2022 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516267 Posted February 13, 2022 @StranikS_Scan Получилось 86, только со знаком минус. Уже ближе похоже. И 2D не нужно, получается. Позже попробую посмотреть, как в игре это выглядеть будет. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #516272 Posted February 13, 2022 49 минут назад, Dragon armor сказал: @StranikS_Scan Получилось 86, только со знаком минус. Уже ближе похоже. И 2D не нужно, получается. Позже попробую посмотреть, как в игре это выглядеть будет. Вполне возможно, что тебе нужно playerMatrix.yaw - pointDir.yaw. Для твоих нужд. Quote Share this post Link to post Short link Share on other sites
Dragon armor 67 #516274 Posted February 13, 2022 @StranikS_Scan Поменял координату X на положительную, знак сменился тоже. Так что всё нормально. 1 Quote Share this post Link to post Short link Share on other sites
DrWeb7_1 181 #516338 Posted February 14, 2022 Беру подсказку «Помощь зала», скорее в целях понять, что происходит (да и тема ожила внезапно). Вот есть дерево исследований, в нём модули, которые надо исследовать. У клиента есть команда для сервера. # 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] ^ - это индекс элемента листа, обозначающий модуль, который надо исследовать Вопрос: что (или какая функция) в клиенте создаёт лист модулей для исследования, из которого достают индекс и посылают его серверу? Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #516340 Posted February 14, 2022 16 minutes ago, DrWeb7_1 said: лист модулей для исследования scripts/item_defs/vehicles всмысле кто xml отсюда читает? вот вроде https://github.com/StranikS-Scan/WorldOfTanks-Decompiled/blob/1.16/source/res/scripts/common/items/vehicles.py 1 Quote Share this post Link to post Short link Share on other sites
DrWeb7_1 181 #516341 Posted February 14, 2022 5 минут назад, SkepticalFox сказал: всмысле кто xml отсюда читает? Осмелюсь предположить, что это items.vehicles._readUnlocks, в нём есть некоторые операции над листом, но мне кажется, что это не то и не туда. Quote Share this post Link to post Short link Share on other sites
DrWeb7_1 181 #516343 Posted February 14, 2022 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 года? Quote Share this post Link to post Short link Share on other sites
DrWeb7_1 181 #516346 Posted February 14, 2022 Окей, доктору нужен доктор, и, видимо, это окулист (у меня -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, спасибо за наводку. Quote Share this post Link to post Short link Share on other sites