Подскажите, есть ли сейчас нормальный способ получить экранные координаты ? Перенес на луа библиотеки 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
Камера в той либе тоже есть
И там есть интерполяции Эрмита, можно их заюзать
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.