3

» WarCraft 3 / Ориентация эффекта в пространстве

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
Загруженные файлы
3

» WarCraft 3 / Ориентация эффекта в пространстве

prog:
Drynwhyl, стандартный тест делал?
  • выставить объект в нулевые значения осей
  • выставить рядом объект под управлением классической системы, тоже в нулевые значения осей
  • если ориентация объектов не совпадает, то добавлять оффсеты пока положение не совпадет (менять управляемый стандартной системой объект)
  • проанализировать полученные оффсеты и перенести их на новую систему так чтобы положение объекта совпало с нулем классической системы
Ну и, напоминаю, одна из осей у тебя будет константой, скорее всего нулем. Например, если вверх это к камере, то "не нужная" ось это roll.
Да, я это делал. И в результате этих тестов я понял что для этой функции все 3 угла не будут константами. На скриншоте пример. Там юнит повернут на угол 315 (он же -45) с углом атаки 56. Но yaw pitch и roll крайне странные. Из этих тестов я сделал вывод что каждый угол влияет на все остальные углы.
Загруженные файлы
3

» WarCraft 3 / Ориентация эффекта в пространстве

prog:
Drynwhyl, стоп, а в чем проблема то? Одна из трех поворотных осей не особо нужна для системы снарядов, если не нужны извращения, остается понять какие две соответсвуют тем двум что высчитываются в классическом способе и возможно добавить смещения и/или инверсию, если ноль в другом месте.
Проблема в том что в углах эйлера каждый из поворотов проходит вокруг нового положения объекта а не вокруг статичной оси.
ledoed:
еси в поворотах те сложно используй вектора
чтобы вектора в радианы перевести над нормализовать
пример вектор(40,500,12)
длина = квадратный корень из(40^2+500^2+12^2)
нормализованый = вектор/длина - смори чтобы длина не была 0
я использовал такой способ но в таком случае параметр roll который этот вектор не характеризует принимает странные значения и вращает объект совершенно непредсказуемым образом.
Прикрепил файл карты.
3

» WarCraft 3 / Ориентация эффекта в пространстве

ledoed:
а значения какие они принимаю 0....1. (сильно измениться угол? )или 0....360. ?
Значения принимают в радианах.
3

» WarCraft 3 / Ориентация эффекта в пространстве

ledoed:
SetSpecialEffectOrientation точно ейлера использует мож кватарионы скок там значений 3 или 4?
native BlzSetSpecialEffectOrientation takes effect whichEffect, real yaw, real pitch, real roll returns nothing
3

» WarCraft 3 / Дальность атаки через предмет, триггер или способность

Для увеличения дальности атаки используют улучшение на основе длинностволых мушкетов. Добавить всем героям это улучшение после чего при получении предмета выставляется уровень улучшения функцией SetPlayerTechResearched
3

» WarCraft 3 / Хак на память Warcraft3

Daniil18, уже отвечали на этот вопрос, функция IsKeyPressed, ей же определяется зажата ли кнопка мыши.
3

» WarCraft 3 / утекает ли спецэффект при смерти

Спецэффект не удаляется после смерти\удаления юнита на которого он повешен. Поэтому нужно это делать вручную.
3

» WarCraft 3 / Хак на память Warcraft3

Tumart, есть функция IsKeyPressed. Меня больше интересует расположения адреса текущего разрешения окна, т.к. без этого не получится что либо делать с мышью.