Подскажите, есть ли сейчас нормальный способ получить экранные координаты ? Перенес на луа библиотеки math и camera из dgui, и решил попробовать, проблема оказалось с небом...
Способ из сетки фреймов не рассматриваю - слишком сильно бъет по fps
В итоге получилось что-то на подобии этого... есть идеи, как сделать это более плавнее ?

Вот в итоге что получилось:
Использовал фреймы, небольшая сетка, 8 вправо, 8 влево, вверх и вниз по 6. world2win - работает с погрешностью, потому что камера реальная и которая должна устанавливается имеют небольшое смещение. У меня, изменение положение камеры не мгновенные (вроде каждый 0.01 сек, меняется положение камеры на 10% от разницы, на сколько она должна поменяться)
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
38
Камера в той либе тоже есть
И там есть интерполяции Эрмита, можно их заюзать
7
Да я ее использовал в примере. Да проблема, как я понял в BlzGetTriggerPlayerMouseX/Y(), а точнее в срабатывании триггера. Передавая положение мыши из вне, каждые 0.01 сек работает так как нужно. Все таки придется использовать фреймы, но их количество жестко ограничу
CAMERA
local TypeUnit = FourCC("dgui")
local GL4Cam = Location(0,0)
local AtUnit = null
local DeltaZ = 0

local  WidthScreen = 0.544
local  HeightScreen = 0.302
local AspectRatio = WidthScreen/HeightScreen

CAMERA = {}
function CAMERA:New()
    local obj = {}
    self.__index = self
    local OBB = setmetatable(obj, self)
    obj.CostumValue = 0
    obj.change = true
    obj.Eye = VECTOR3:New_1(0.0,-922.668,DeltaZ+1367.912)
    obj.At = VECTOR3:New_1(0, 0, DeltaZ)
    obj.Distance = 0
    obj.Yaw = 0
    obj.Pitch = 0
    obj.Roll = 0
    obj.AxisX = VECTOR3:new()
    obj.AxisY = VECTOR3:new()
    obj.AxisZ = VECTOR3:new()
    obj.View  = MATRIX4:new()
    obj.Projection = Matrix4Perspective2(MATRIX4:new(), 0.5, 10000, -WidthScreen/2, WidthScreen/2, -HeightScreen/2, HeightScreen/2)
    OBB:UpdateDistanceYawPitch()
    OBB:UpdateAxisMatrix()

    return setmetatable(obj, self)
end
function CAMERA:Win2World(X,Y,Range)
    local VECTOR3 Output = VECTOR3:new()
    Output.x = self.Eye.x+self.AxisZ.x*Range+X*self.AxisX.x*WidthScreen*Range+Y*self.AxisY.x*HeightScreen*Range
    Output.y = self.Eye.y+self.AxisZ.y*Range+X*self.AxisX.y*WidthScreen*Range+Y*self.AxisY.y*HeightScreen*Range
    Output.z = self.Eye.z+self.AxisZ.z*Range+X*self.AxisX.z*WidthScreen*Range+Y*self.AxisY.z*HeightScreen*Range
    return Output
end
function CAMERA:Win2World (X,Y,Range)
    local VECTOR3 Output = VECTOR3:new()
    Output.x = self.Eye.x+self.AxisZ.x*Range+X*self.AxisX.x*WidthScreen*Range+Y*self.AxisY.x*HeightScreen*Range
     Output.y =self.Eye.y+self.AxisZ.y*Range+X*self.AxisX.y*WidthScreen*Range+Y*self.AxisY.y*HeightScreen*Range
    Output.z = self.Eye.z+self.AxisZ.z*Range+X*self.AxisX.z*WidthScreen*Range+Y*self.AxisY.z*HeightScreen*Range
    return Output
end
function CAMERA:World2Win (X,Y,Z)
    local Pos = VECTOR3:New_1(X, Y, Z)
    local b
    Vec3Transform_2(Pos, Pos, self.View)
    b = Pos.z < 0
    Vec3Transform_2(Pos, Pos, self.Projection)
    if b then
     Pos.z = -Pos.z
    end
    return Pos
end
function CAMERA:UpdateDistanceYawPitch ()
    local  dx = self.At.x-self.Eye.x
    local  dy = self.At.y-self.Eye.y
    local  dz = self.At.z-self.Eye.z
    local  len2d
    self.Distance = SquareRoot(dx*dx+dy*dy+dz*dz)
    self.Yaw = Atan2(dy, dx)
    len2d = SquareRoot(dx*dx+dy*dy)
    self.Pitch = Atan2(dz, len2d)
end
function CAMERA:UpdateAxisMatrix ()
    local  mat

    Vec3Normalize(self.AxisZ, Vec3Subtract(self.AxisZ, self.At, self.Eye))
    mat = Matrix3RotationAxis(MATRIX3:new(), self.AxisZ, -self.Roll)

    Vec3Normalize(self.AxisX, Vec3Cross(self.AxisX, self.AxisZ, VECTOR3.oneZ))

    Vec3Transform_1(self.AxisY, Vec3Cross(self.AxisY, self.AxisX, self.AxisZ), mat)

    Vec3Transform_1(self.AxisX, self.AxisX, mat)

    Matrix4Look(self.View, self.Eye, self.AxisX, self.AxisY, self.AxisZ)

    mat = nil
end
function CAMERA:ApplyCameraForPlayer (p,IgnorChange)
    if GetLocalPlayer() == p then
        SetCameraField(CAMERA_FIELD_ROTATION, self.Yaw*bj_RADTODEG, 0)
        SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, self.Pitch*bj_RADTODEG, 0)
        SetCameraField(CAMERA_FIELD_ROLL, self.Roll*bj_RADTODEG, 0)
        SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, self.Distance, 0)
        SetCameraTargetController(AtUnit, self.At.x, self.At.y, false)
        SetCameraField(CAMERA_FIELD_ZOFFSET, self.At.z-DeltaZ, 0)
    end
    if self.change or IgnorChange then
        self.change = false
         return true
    end
    return false
end
function CAMERA:SetPosition (x,y,z)
    local  dx = x-self.At.x
    local  dy = y-self.At.y
    local  dz = z-self.At.z
    self.Eye.x = self.Eye.x+dx
    self.Eye.y = self.Eye.y+dy
    self.Eye.z = self.Eye.z+dz
    self.At.x = x
    self.At.y = y
    self.At.z = z
    self.change = true
end
function CAMERA:SetEyeAndAt (ex,ey,ez,tx,ty,tz)
    self.Eye.x = ex
    self.Eye.y = ey
    self.Eye.z = ez
    self.At.x = tx
    self.At.y = ty
    self.At.z = tz
    self:UpdateDistanceYawPitch()
    self:UpdateAxisMatrix()
    self.change = true
end
function CAMERA:SetYawPitchRoll (yaw,pitch,roll,EyeLock)
    local  Z = self.Distance*Sin(pitch)
    local  XY =self.Distance*Cos(pitch)
    local  X = XY*Cos(yaw)
    local  Y = XY*Sin(yaw)
    self.Yaw = yaw
    self.Pitch = pitch
    self.Roll = roll
    if EyeLock then
        self.At.x = self.Eye.x+X
        self.At.y = self.Eye.y+Y
        self.At.z = self.Eye.z+Z
    else
        self.Eye.x = self.At.x-X
        self.Eye.y = self.At.y-Y
        self.Eye.z = self.At.z-Z
    end
    self:UpdateAxisMatrix()
    self.change = true

end

local TempX = 0
local TempY = 0
function InitDeltaZ_Timer()
    DeltaZ = GetCameraTargetPositionZ()
    SetCameraPosition(TempX, TempY)
    DestroyTimer(GetExpiredTimer())
end
function InitDeltaZ()
    TempX = GetCameraTargetPositionX()
    TempY = GetCameraTargetPositionY()
    SetCameraPosition(0, 0)
    TimerStart(CreateTimer(), 0.01, false, function()
        DeltaZ = GetCameraTargetPositionZ()
        SetCameraPosition(TempX, TempY)
        DestroyTimer(GetExpiredTimer())
    end)

end
function InitCameraL()
     AtUnit = CreateUnit(Player(15), TypeUnit, 0, 0, 0)
     ShowUnit(AtUnit, false)
     InitDeltaZ()

end

Обновил 1 пост. жду ваши комментарии
33
Передавая положение мыши из вне, каждые 0.01 сек работает так как нужно
Лучше передавать положение координат мыши по событию MouseMove
GetPlayerMouseX={}
GetPlayerMouseY={}
function InitMouseMoveTrigger()
	local MouseMoveTrigger = CreateTrigger()
	for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
		local player = Player(i)
		if GetPlayerSlotState(player) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(player) == MAP_CONTROL_USER then
			TriggerRegisterPlayerEvent(MouseMoveTrigger, player, EVENT_PLAYER_MOUSE_MOVE)
		end
	end
		TriggerAddAction(MouseMoveTrigger, function()
			local id=GetPlayerId(GetTriggerPlayer())
			--HERO[id].IsMouseMove=true
			GetPlayerMouseX[id]=BlzGetTriggerPlayerMouseX()
			GetPlayerMouseY[id]=BlzGetTriggerPlayerMouseY()
		end)
end

EVENT_PLAYER_MOUSE_MOVE
7
EVENT_PLAYER_MOUSE_MOVE
Координаты отслеживаются игровые а не экранные, из за этого есть масса проблем.
зы: прикрепил новое видео с камерой
33
Zetox, так что удалось получить экранные координаты? можно принтами как-то проследить это?
7
Bergi_Bear:
Zetox, так что удалось получить экранные координаты? можно принтами как-то проследить это?
нет, пришлось сделать небольшую сетку фреймов 16 на 12 (ещё обрежу ее по углам). Сейчас через подгонку параметров и постепенного перехода удалось добиться нормального фпс и плавность камеры.
38
Это не спортивно)
7
ScorpioT1000:
Это не спортивно)
Ну я так не понял, как получить экранные координаты, когда мышка на небе)
38
Вот наш небольшой брейнсторм:
world2win работает, но на ходу не получится
идея была ставить курсор в низ экрана - сколько-то пикселей и ждать смещения, потом опять ставить (это позволит почти не париться о небе)
насколько сместили - столько будет сила вращения камеры
фреймы дают инпутлаг и фпс дроп
world2win - камера не синхронна с мышью, а если синхронить, то будет низний апдейт рейт
Открыть целиком
ScorpioT100029.04.2020
ну что, надумали ловить мышь в рилтайме?
world2win работает, но на ходу не получится
идея была ставить курсор в низ экрана - сколько-то пикселей и ждать смещения, потом опять ставить
насколько сместили - столько будет сила вращения камеры
фреймы дают инпутлаг и фпс дроп
world2win - камера не синхронна с мышью, а если синхронить, то будет низний апдейт рейт
что ещё есть? давайте брейнсторм
prog29.04.2020
мое непопулярное мнение таково - не заниматься фигней и оверинжинирингом в рефорже и либо делать что-то не требующее этого либо идти на другой движок и делать нормально
N1ghtSiren29.04.2020
без события нельзя получить глобальные координаты мыши
на таймер это не привязать = нужно изобретать костыль
ScorpioT100029.04.2020
да
я пробовал ставить камеру вертикально, брать коорды, потом возвращать
но коорды чисто переменные от события
что если форсить нажатие средней кнопки мыши в периоде?
N1ghtSiren29.04.2020
если фейковое нажатие триггерит событие то почему нет
ScorpioT100029.04.2020
в ForceUIKey можно ли мышь передать вообще
N1ghtSiren29.04.2020
там другие штуки для мыши были
ScorpioT100029.04.2020
оно стринг принимает
для позиции были, а для кнопок
N1ghtSiren29.04.2020
вообще в теории можно сетку фреймов на экран вывести но это слишком сльный костыль
ScorpioT100029.04.2020
инпутлаг
как доставать common.js вообще нынче?
там в целом 1.32.4 и есть какие-то фиксы
! Миша29.04.2020
Так же в архивах лежат ScorpioT1000
Просто другой прогой открыватт
Если ты про варкрафт
ScorpioT100029.04.2020
какой
! Миша29.04.2020
Casc вроде, не работаю на данном патче
Последнюю версию просто качаешь
Видел, люди кидали скриншоты из программы
ScorpioT100029.04.2020
охренеть он долгий)
prog29.04.2020
как доставать common.js вообще нынче?
зезуловский каск вьювер
ScorpioT100029.04.2020
короче да
ничего там нового в 1.32.4
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.