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

Принятый ответ

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

ответ
На сайте есть поиск.
Поиск
Туда можно вбить запрос "Камера от 3 лица"
Вот
А после нажать кнопку "Ответы"
Эту
Дерзай.
ответ
Все. Уже получилось.

0
32
4 года назад
0
Нет, к сожалению GetMouseXY ещё не завезли не рафордже, есть только на мемхаке это чудо
0
10
4 года назад
0
Bergi_Bear:
Нет, к сожалению GetMouseXY ещё не завезли не рафордже, есть только на мемхаке это чудо
Не завезли относительно экранных координат. Но XY мышки можно отловить так же как и XY юнита.
1
37
4 года назад
Отредактирован ScorpioT1000
1
Я и так всё уже аккуратно перенёс по тестил) xgm.guru/p/wc3/lua-wgeometry
кроме камеры
Но там надо width/height тюнинговать

это вот эти переменные
local screenWidth = 0.544
local screenHeight = 0.302
попробуй, может у тебя получится

я ещё дописал комменты к некоторым совершенно неясным функциям перспективы, их щас можно хотябы погуглить

думаю, там ещё где-то проблемы с проекцией

небо - дальность прорисовки камеры, она задается FAR_Z че-то такое
0
32
4 года назад
0
через обычную локнутую камеру, думаю можно спроэцировать координаты земли на экран... но если курсор будет в небе при наклоне как у 3 лица.. тут так не проканает
0
7
4 года назад
Отредактирован Zetox
0
ScorpioT1000:
Я и так всё уже аккуратно перенёс по тестил) xgm.guru/p/wc3/lua-wgeometry
кроме камеры
Но там надо width/height тюнинговать

это вот эти переменные
local screenWidth = 0.544
local screenHeight = 0.302
попробуй, может у тебя получится

я ещё дописал комменты к некоторым совершенно неясным функциям перспективы, их щас можно хотябы погуглить

думаю, там ещё где-то проблемы с проекцией

небо - дальность прорисовки камеры, она задается FAR_Z че-то такое
А я переносил строчку в строчку и вышло (пока небыло времени lua изучить) D: Да и саму библиотеку CAMERA надо доработать - реализовать плавный переход.... слишком сильно дергается, когда глаз находится практически за спиной юнита, а точка, куда смотрит камера, немного дальше.
function R2I_n(r)
    local integer i = R2I(r)
    if (r < I2R(i)+0.5) then
        return i
    else
        return i+1
    end
end
VECTOR3  = {}
function VECTOR3:new()
    local obj = {}
    obj.x = 0
    obj.y = 0
    obj.z = 0
    self.__index = self
    return setmetatable(obj, self)
end
function VECTOR3:New_0()
    local obj = {}
    obj.x = 0
    obj.y = 0
    obj.z = 0

    self.__index = self
    return setmetatable(obj, self)
end
function VECTOR3:New_1(x,y,z)
    local obj = {}
    obj.x = x
    obj.y = y
    obj.z = z
    self.__index = self
    return setmetatable(obj, self)
end
function VECTOR3:New_2(v)
    local obj = {}
    obj.x = v.x
    obj.y = v.y
    obj.z = v.z
    self.__index = self
    return setmetatable(obj, self)
end
function VECTOR3:SetValues (x,y,z)
    self.x = x
    self.y = y
    self.z = z
end
function VECTOR3:GetValues ()
    print(self.x,self.y,self.z )
end
function VECTOR3:Length ()
    return SquareRoot(self.x*self.x+self.y*self.y+self.z*self.z)
end
function VECTOR3:LengthSq ()
    return self.x*self.x+self.y*self.y+self.z*self.z
end

function Vec3Add(Output,v1,v2)
    Output.x = v1.x + v2.x
    Output.y = v1.y + v2.y
    Output.z = v1.z + v2.z
    return Output
end
function Vec3Subtract(Output,v1,v2)
    Output.x = v1.x - v2.x
    Output.y = v1.y - v2.y
    Output.z = v1.z - v2.z
    return Output
end

function Vec3Scale(Output,v,r)
    Output.x = v.x * r
    Output.y = v.y * r
    Output.z = v.z * r
    return Output
end
function Vec3Division(Output,v,r)
    Output.x = v.x / r
    Output.y = v.y / r
    Output.z = v.z / r
    return Output
end
function Vec3Length(v)
    return SquareRoot(v.x*v.x+v.y*v.y+v.z*v.z)
end
function Vec3LengthSq(v)
    return v.x*v.x+v.y*v.y+v.z*v.z
end

function Vec3Normalize( Output,  v  )
    local  len = SquareRoot(v.x*v.x+v.y*v.y+v.z*v.z)
    Output.x = v.x/len
    Output.y = v.y/len
    Output.z = v.z/len
    return Output
end

function Vec3Dot (v1,v2)
    return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z
end

function Vec3Cross (   Output,  v1,  v2  )
    local  y  = v1.z * v2.x - v1.x * v2.z
    local  z = v1.x * v2.y - v1.y * v2.x
    Output.x = v1.y * v2.z - v1.z * v2.y
    Output.y = y
    Output.z = z
    return Output
end

function Vec3Transform_1 ( Output,  v,  m )
    local  y = v.x*m.m12+v.y*m.m22+v.z*m.m32
    local  z = v.x*m.m13+v.y*m.m23+v.z*m.m33
    Output.x = v.x*m.m11+v.y*m.m21+v.z*m.m31
    Output.y = y
    Output.z = z
    return Output
end

function Vec3Transform_2 (Output,  v,  m )
    local y = v.x*m.m12+v.y*m.m22+v.z*m.m32+m.m42
    local z = v.x*m.m13+v.y*m.m23+v.z*m.m33+m.m43
    local w = v.x*m.m14+v.y*m.m24+v.z*m.m34+m.m44
    Output.x = (v.x*m.m11+v.y*m.m21+v.z*m.m31+m.m41)/w
    Output.y = y/w
     Output.z = z/w
    return Output
end


MATRIX3  = {}
function MATRIX3:new()
    local obj = {}
    self.__index = self
    return setmetatable(obj, self)
end

function MATRIX3:New_0()
    local obj = {}
    obj.m11 = 0
    obj.m12 = 0
    obj.m13 = 0
    obj.m21 = 0
    obj.m22 = 0
    obj.m23 = 0
    obj.m31 = 0
    obj.m32 = 0
    obj.m33 = 0
    self.__index = self
    return setmetatable(obj, self)
end
function MATRIX3:New_1(r11,r12,r13,r21,r22,r23,r31,r32,r33)
    local obj = {}
    obj.m11 = r11
    obj.m12 = r12
    obj.m13 = r13
    obj.m21 = r21
    obj.m22 = r22
    obj.m23 = r23
    obj.m31 = r31
    obj.m32 = r32
    obj.m33 = r33
    self.__index = self
    return setmetatable(obj, self)
end

function MATRIX3:New_2(m)
    local obj = {}
    obj.m11 = m.m11
    obj.m12 = m.m12
    obj.m13 = m.m13
    obj.m21 = m.m21
    obj.m22 = m.m22
    obj.m23 = m.m23
    obj.m31 = m.m31
    obj.m32 = m.m32
    obj.m33 = m.m33
    self.__index = self
    return setmetatable(obj, self)
end


function MATRIX3:SetValues(r11,r12,r13,r21,r22,r23,r31,r32,r33)

    self.m11 = r11
    self.m12 = r12
    self.m13 = r13
    self.m21 = r21
    self.m22 = r22
    self.m23 = r23
    self.m31 = r31
    self.m32 = r32
    self.m33 = r33

    return self
end

function Matrix3Multiply (Output,  M1,  M2 )
return Output:SetValues(M1.m11*M2.m11+M1.m21*M2.m12+M1.m31*M2.m13,M1.m12*M2.m11+M1.m22*M2.m12+M1.m32*M2.m13,M1.m13*M2.m11+M1.m23*M2.m12+M1.m33*M2.m13,M1.m11*M2.m21+M1.m21*M2.m22+M1.m31*M2.m23,M1.m12*M2.m21+M1.m22*M2.m22+M1.m32*M2.m23,M1.m13*M2.m21+M1.m23*M2.m22+M1.m33*M2.m23,M1.m11*M2.m31+M1.m21*M2.m32+M1.m31*M2.m33,M1.m12*M2.m31+M1.m22*M2.m32+M1.m32*M2.m33,M1.m13*M2.m31+M1.m23*M2.m32+M1.m33*M2.m33)
end

function Matrix3RotationX (Output,  a)
    return Output:SetValues(1,0,0,0,Cos(a),-Sin(a),0,Sin(a),Cos(a))
end
function Matrix3RotationY (Output,  a)
    return Output:SetValues(Cos(a),0,Sin(a),0,1,0,-Sin(a),0,Cos(a))
end
function Matrix3RotationZ (Output,  a)
    return Output:SetValues(Cos(a),-Sin(a),0,Sin(a),Cos(a),0,0,0,1)
end

function Matrix3RotationAxis (Output,  v,a)
    local  cosa = Cos(a)
    local  sina = Sin(a)
    return Output:SetValues(cosa+(1-cosa)*v.x*v.x,(1-cosa)*v.x*v.y-sina*v.z,(1-cosa)*v.x*v.z+sina*v.y,(1-cosa)*v.y*v.x+sina*v.z,cosa+(1-cosa)*v.y*v.y,(1-cosa)*v.y*v.z-sina*v.x,(1-cosa)*v.z*v.x-sina*v.y,(1-cosa)*v.z*v.y+sina*v.x,cosa+(1-cosa)*v.z*v.z)
end

function Matrix3RotationYawPitchRoll (Output, Yaw, Pitch,Roll)
    local  cosa = Cos(Yaw)
    local  sina = Sin(Yaw)
    local  cosb = Cos(Pitch)
    local  sinb = Sin(Pitch)
    local  cosy = Cos(Roll)
    local  siny = Sin(Roll)
    return Output:SetValues(cosa*cosb,cosa*sinb*siny-sina*cosy,cosa*sinb*cosy+sina*siny,sina*cosb,sina*sinb*siny+cosa*cosy,sina*sinb*cosy-cosa*siny,-sinb,cosb*siny,cosb*cosy)
end



MATRIX4  = {}
function MATRIX4:new()
    local obj = {}
    self.__index = self
    return setmetatable(obj, self)
end
function MATRIX4:New_0()
    local obj = {}
    self.__index = self
    obj.m11 = 0
    obj.m12 = 0
    obj.m13 = 0
    obj.m14 = 0
    obj.m21 = 0
    obj.m22 = 0
    obj.m23 = 0
    obj.m24 = 0
    obj.m31 = 0
    obj.m32 = 0
    obj.m33 = 0
    obj.m34 = 0
    obj.m41 = 0
    obj.m42 = 0
    obj.m43 = 0
    obj.m44 = 0

    return setmetatable(obj, self)
end

function MATRIX4:New_1(r11,r12,r13,r14,r21,r22,r23,r24,r31,r32,r33,r34,r41,r42,r43,r44)
    local obj = {}
    self.__index = self
    obj.m11 = r11
    obj.m12 = r12
    obj.m13 = r13
    obj.m14 = r14
    obj.m21 = r21
    obj.m22 = r22
    obj.m23 = r23
    obj.m24 = r24
    obj.m31 = r31
    obj.m32 = r32
    obj.m33 = r33
    obj.m34 = r34
    obj.m41 = r41
    obj.m42 = r42
    obj.m43 = r43
    obj.m44 = r44

    return setmetatable(obj, self)
end

function MATRIX4:New_2(m)
    local obj = {}
    self.__index = self
    obj.m11 = m.m11
    obj.m12 = m.m12
    obj.m13 = m.m13
    obj.m14 = m.m14
    obj.m21 = m.m21
    obj.m22 = m.m22
    obj.m23 = m.m23
    obj.m24 = m.m24
    obj.m31 = m.m31
    obj.m32 = m.m32
    obj.m33 = m.m33
    obj.m34 = m.m34
    obj.m41 = m.m41
    obj.m42 = m.m42
    obj.m43 = m.m43
    obj.m44 = m.m44

    return setmetatable(obj, self)
end

function MATRIX4:New_3(m)
    local obj = {}
    self.__index = self
    obj.m11 = m.m11
    obj.m12 = m.m12
    obj.m13 = m.m13
    obj.m14 = 0
    obj.m21 = m.m21
    obj.m22 = m.m22
    obj.m23 = m.m23
    obj.m24 = 0
    obj.m31 = m.m31
    obj.m32 = m.m32
    obj.m33 = m.m33
    obj.m34 = 0
    obj.m41 = 0
    obj.m42 = 0
    obj.m43 = 0
    obj.m44 = 0

    return setmetatable(obj, self)
end

function MATRIX4:SetValues(r11,r12,r13,r14,r21,r22,r23,r24,r31,r32,r33,r34,r41,r42,r43,r44)


    self.m11 = r11
    self.m12 = r12
    self.m13 = r13
    self.m14 = r14
    self.m21 = r21
    self.m22 = r22
    self.m23 = r23
    self.m24 = r24
    self.m31 = r31
    self.m32 = r32
    self.m33 = r33
    self.m34 = r34
    self.m41 = r41
    self.m42 = r42
    self.m43 = r43
    self.m44 = r44

    return self
end


function Matrix4Multiply(Output,M1,M2)
    return Output:SetValues(M1.m11*M2.m11+M1.m21*M2.m12+M1.m31*M2.m13+M1.m41*M2.m14,M1.m12*M2.m11+M1.m22*M2.m12+M1.m32*M2.m13+M1.m42*M2.m14,M1.m13*M2.m11+M1.m23*M2.m12+M1.m33*M2.m13+M1.m43*M2.m14,M1.m14*M2.m11+M1.m24*M2.m12+M1.m34*M2.m13+M1.m44*M2.m14,M1.m11*M2.m21+M1.m21*M2.m22+M1.m31*M2.m23+M1.m41*M2.m24,M1.m12*M2.m21+M1.m22*M2.m22+M1.m32*M2.m23+M1.m42*M2.m24,M1.m13*M2.m21+M1.m23*M2.m22+M1.m33*M2.m23+M1.m43*M2.m24,M1.m14*M2.m21+M1.m24*M2.m22+M1.m34*M2.m23+M1.m44*M2.m24,M1.m11*M2.m31+M1.m21*M2.m32+M1.m31*M2.m33+M1.m41*M2.m34,M1.m12*M2.m31+M1.m22*M2.m32+M1.m32*M2.m33+M1.m42*M2.m34,M1.m13*M2.m31+M1.m23*M2.m32+M1.m33*M2.m33+M1.m43*M2.m34,M1.m14*M2.m31+M1.m24*M2.m32+M1.m34*M2.m33+M1.m44*M2.m34,M1.m11*M2.m41+M1.m21*M2.m42+M1.m31*M2.m43+M1.m41*M2.m44,M1.m12*M2.m41+M1.m22*M2.m42+M1.m32*M2.m43+M1.m42*M2.m44,M1.m13*M2.m41+M1.m23*M2.m42+M1.m33*M2.m43+M1.m43*M2.m44,M1.m14*M2.m41+M1.m24*M2.m42+M1.m34*M2.m43+M1.m44*M2.m44)


end


function Matrix4Perspective1 ( Output,  fovy,  Aspect,  zn, zf)
    return Output:SetValues(2*zn/fovy,0,0,0,0,2*zn/Aspect,0,0,0,0,zf/(zf-zn),1,0,0,zn*zf/(zn-zf),0)
end

function Matrix4Perspective2 ( Output,   n,  f,  r,  l,  t,  b)
    return Output:SetValues(2*n/(r-l), 0, (r+l)/(r-l), 0, 0, 2*n/(t-b), (t+b)/(t-b), 0, 0, 0, -(f+n)/(f-n), -2*f*n/(f-n), 0, 0, -1, 0)
end

function Matrix4Look (Output,  PosCamera,  AxisX,  AxisY,  AxisZ)
    return Output:SetValues(AxisX.x,AxisY.x,AxisZ.x,0,AxisX.y,AxisY.y,AxisZ.y,0,AxisX.z,AxisY.z,AxisZ.z,0,-Vec3Dot(AxisX, PosCamera),-Vec3Dot(AxisY, PosCamera),-Vec3Dot(AxisZ, PosCamera),1)
end








function InitMath()

     VECTOR3.Zero = VECTOR3:New_0()
     VECTOR3.oneX = VECTOR3:New_1(1,0,0)
     VECTOR3.oneY = VECTOR3:New_1(0,1,0)
     VECTOR3.oneZ = VECTOR3:New_1(0,0,1)
     MATRIX3.Zero = MATRIX3:New_0()
     MATRIX3.E = MATRIX3:New_1(1,0,0,0,1,0,0,0,1)
     MATRIX4.Zero = MATRIX4:New_0()
     MATRIX4.E = MATRIX4:New_1(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)

end
0
37
4 года назад
0
Камера в той либе тоже есть
И там есть интерполяции Эрмита, можно их заюзать
1
7
4 года назад
1
Да я ее использовал в примере. Да проблема, как я понял в 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 пост. жду ваши комментарии
0
32
4 года назад
0
Передавая положение мыши из вне, каждые 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
0
7
4 года назад
0
EVENT_PLAYER_MOUSE_MOVE
Координаты отслеживаются игровые а не экранные, из за этого есть масса проблем.
зы: прикрепил новое видео с камерой
0
32
4 года назад
0
Zetox, так что удалось получить экранные координаты? можно принтами как-то проследить это?
0
7
4 года назад
0
Bergi_Bear:
Zetox, так что удалось получить экранные координаты? можно принтами как-то проследить это?
нет, пришлось сделать небольшую сетку фреймов 16 на 12 (ещё обрежу ее по углам). Сейчас через подгонку параметров и постепенного перехода удалось добиться нормального фпс и плавность камеры.
0
37
4 года назад
0
Это не спортивно)
0
7
4 года назад
0
ScorpioT1000:
Это не спортивно)
Ну я так не понял, как получить экранные координаты, когда мышка на небе)
0
32
4 года назад
0
ScorpioT1000, Даешь GetMouseXY()?
1
37
4 года назад
1
Скоро попробую
0
37
4 года назад
Отредактирован ScorpioT1000
0
Вот наш небольшой брейнсторм:
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
9
7
4 года назад
Отредактирован Zetox
9
Вот в итоге что получилось:
Использовал фреймы, небольшая сетка, 8 вправо, 8 влево, вверх и вниз по 6. world2win - работает с погрешностью, потому что камера реальная и которая должна устанавливается имеют небольшое смещение. У меня, изменение положение камеры не мгновенные (вроде каждый 0.01 сек, меняется положение камеры на 10% от разницы, на сколько она должна поменяться)
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.