GetLocalPlayer:
Спасибо, сейчас буду пробовать.
Вот что у меня получилось:
GIF
Как видно все почти работает, однако изменение угла атаки камеры заставляет эффект отклонится в противоположную сторону. Так же при определенном угле эффект резко переворачивает "на спину". Кроме того я не могу понять как мне изменить угол под которым эффект смотрит в камеру (Умножить v1 на матрицу поворота?)
library Test initializer Init
globals
private camerasetup array cameras
private effect e
private real ex = .0
private real ey = .0
private real ez = 150.
private MATRIX3 rotation
endglobals
private function RotationMatrixToEuler takes MATRIX3 R returns VECTOR3
local real x
local real y
local real z
local real sy = SquareRoot(R.m11 * R.m11 + R.m21 * R.m21)
local boolean singular = sy < .000001 or sy == 0 // If
if not singular then
set x = Atan2(R.m32 , R.m33)
set y = Atan2(-R.m31, sy)
set z = Atan2(R.m21, R.m11)
else
set x = Atan2(-R.m23, R.m22)
set y = Atan2(-R.m31, sy)
set z = 0
endif
return VECTOR3.New_1(x, y, z)
endfunction
private function UpdateEffectOrientation takes nothing returns nothing
local VECTOR3 euler
local VECTOR3 v1
local VECTOR3 v2
local VECTOR3 v3
local VECTOR3 X
local VECTOR3 Y
local VECTOR3 Z
local VECTOR3 cX = VECTOR3.New_1(0, 0, 1)
set v1 = VECTOR3.New_1( /*
*/ GetCameraEyePositionX() - ex, /*
*/ GetCameraEyePositionY() - ey, /*
*/ GetCameraEyePositionZ() - ez)
set v2 = Vec3Cross(VECTOR3.New_0(), v1, cX)
set v3 = Vec3Cross(VECTOR3.New_0(), v1, v2)
set X = Vec3Normalize(VECTOR3.New_0(), v1)
set Z = Vec3Normalize(VECTOR3.New_0(), v2)
set Y = Vec3Normalize(VECTOR3.New_0(), v3)
set rotation.m11 = X.x
set rotation.m12 = X.y
set rotation.m13 = X.z
set rotation.m21 = Y.x
set rotation.m22 = Y.y
set rotation.m23 = Y.z
set rotation.m31 = Z.x
set rotation.m32 = Z.y
set rotation.m33 = Z.z
set euler = RotationMatrixToEuler(rotation)
call BlzSetSpecialEffectOrientation(e, euler.x, euler.y, euler.z)
call v1.destroy()
call v2.destroy()
call v3.destroy()
call cX.destroy()
call X.destroy()
call Y.destroy()
call Z.destroy()
endfunction
private function SetCamera takes nothing returns nothing
call CameraSetupApplyForceDuration(cameras[S2I(GetEventPlayerChatString())], false, .5)
endfunction
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterPlayerChatEvent(t, Player(0), "", false)
call TriggerAddAction(t, function SetCamera)
set t = null
set cameras[1] = gg_cam_Camera_001
set cameras[2] = gg_cam_Camera_002
set cameras[3] = gg_cam_Camera_003
set cameras[4] = gg_cam_Camera_004
set cameras[5] = gg_cam_Camera_005
set cameras[6] = gg_cam_Camera_006
set cameras[7] = gg_cam_Camera_007
set cameras[8] = gg_cam_Camera_008
set rotation = MATRIX3.New_0()
set e = AddSpecialEffect("units\\human\\Footman\\Footman.mdl", .0, .0)
call BlzSetSpecialEffectPosition(e, ex, ey, ez)
call TimerStart(CreateTimer(), .03125, true, function UpdateEffectOrientation)
endfunction
endlibrary
выставить рядом объект под управлением классической системы, тоже в нулевые значения осей
если ориентация объектов не совпадает, то добавлять оффсеты пока положение не совпадет (менять управляемый стандартной системой объект)
проанализировать полученные оффсеты и перенести их на новую систему так чтобы положение объекта совпало с нулем классической системы
Ну и, напоминаю, одна из осей у тебя будет константой, скорее всего нулем. Например, если вверх это к камере, то "не нужная" ось это roll.
Да, я это делал. И в результате этих тестов я понял что для этой функции все 3 угла не будут константами. На скриншоте пример. Там юнит повернут на угол 315 (он же -45) с углом атаки 56. Но yaw pitch и roll крайне странные. Из этих тестов я сделал вывод что каждый угол влияет на все остальные углы.
Drynwhyl, стоп, а в чем проблема то? Одна из трех поворотных осей не особо нужна для системы снарядов, если не нужны извращения, остается понять какие две соответсвуют тем двум что высчитываются в классическом способе и возможно добавить смещения и/или инверсию, если ноль в другом месте.
Проблема в том что в углах эйлера каждый из поворотов проходит вокруг нового положения объекта а не вокруг статичной оси. ledoed:
еси в поворотах те сложно используй вектора
чтобы вектора в радианы перевести над нормализовать
пример вектор(40,500,12)
длина = квадратный корень из(40^2+500^2+12^2)
нормализованый = вектор/длина - смори чтобы длина не была 0
я использовал такой способ но в таком случае параметр roll который этот вектор не характеризует принимает странные значения и вращает объект совершенно непредсказуемым образом.
Прикрепил файл карты.
Для увеличения дальности атаки используют улучшение на основе длинностволых мушкетов. Добавить всем героям это улучшение после чего при получении предмета выставляется уровень улучшения функцией SetPlayerTechResearched
Tumart, есть функция IsKeyPressed. Меня больше интересует расположения адреса текущего разрешения окна, т.к. без этого не получится что либо делать с мышью.
» WarCraft 3 / Атакуемый юнит
Ред. Drynwhyl
» WarCraft 3 / Ориентация эффекта в пространстве
Спасибо, сейчас буду пробовать.
Вот что у меня получилось:
» WarCraft 3 / Ориентация эффекта в пространстве
Ред. Drynwhyl
» WarCraft 3 / Ориентация эффекта в пространстве
ledoed: я использовал такой способ но в таком случае параметр roll который этот вектор не характеризует принимает странные значения и вращает объект совершенно непредсказуемым образом.
Прикрепил файл карты.
» WarCraft 3 / Ориентация эффекта в пространстве
Ред. Drynwhyl
» WarCraft 3 / Ориентация эффекта в пространстве
» WarCraft 3 / Дальность атаки через предмет, триггер или способность
Ред. Drynwhyl
» WarCraft 3 / Дальность атаки через предмет, триггер или способность
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / утекает ли спецэффект при смерти
» WarCraft 3 / Хак на память Warcraft3