Мне хочется создать систему диалогов среди жителей. Когда камеру наводишь на них, и у них из головы вылетает текстаг монолога/диалога. Вурдалак: "я хочу мясо". В зависимости от ситуации у них будет вылетать разный рандомный смешной текст, если он к месту. Вроде же текстаги локально ограничены до 99.
Было бы классно выделять только тех юнитов, что показаны на камере игрока. есть только координаты камеры

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

первый способ - поле в плоскости XY
Это вариант норм работает.
//Простая матрица поворота вокруг оси Z
function Matrix takes unit u, real cx, real cy, real offsetx, real offsety, real theta returns nothing
//вектор
local real dx= (cx + offsetx)-cx
local real dy= (cy + offsety)-cy
//ищем offset-ы
local real vx= dx * Cos(theta) - dy * Sin(theta)
local real vy= dx * Sin(theta) + dy * Cos(theta) 
//сдвигаем
call SetUnitX(u,cx+vx)
call SetUnitY(u,cy+vy)
endfunction

function Trig_field_camera_Actions takes nothing returns nothing
//координаты центра обзора камеры
local real x2 = GetCameraTargetPositionX()
local real y2 = GetCameraTargetPositionY()
local real z2 = GetCameraTargetPositionZ()
//расстояние между камерой и целью
local real d = GetCameraField(CAMERA_FIELD_TARGET_DISTANCE)
//поворот камеры
//показывает насколько изменился угол от стандартного угла и наскока нужна повернуть
local real theta = ModuloReal((GetCameraField(CAMERA_FIELD_ROTATION)-bj_CAMERA_DEFAULT_ROTATION* bj_DEGTORAD), 6.28)



//центр-таргет обзора камеры
call SetUnitX(un[0],x2)
call SetUnitY(un[0],y2)
//РИСУЕМ ПРЯМОУГОЛЬНИК. короче область
//ищем право-верхнюю вершину
    call Matrix(un[1],x2,y2,d*WidthScreen,d*HeightScreen,theta)
//ищем право-нижнюю вершину
    call Matrix(un[2],x2,y2,d*WidthScreen,-d*HeightScreen,theta)
//ищем лево-нижнюю вершину
    call Matrix(un[3],x2,y2,-d*WidthScreen,-d*HeightScreen,theta)
//ищем лево-верхнюю вершину    
    call Matrix(un[4],x2,y2,-d*WidthScreen,d*HeightScreen,theta)
    //молнии
    call MoveLightning(lightning_1[0],true,GetUnitX(un[1]),GetUnitY(un[1]),GetUnitX(un[2]),GetUnitY(un[2]))
    call MoveLightning(lightning_1[1],true,GetUnitX(un[2]),GetUnitY(un[2]),GetUnitX(un[3]),GetUnitY(un[3]))
    call MoveLightning(lightning_1[2],true,GetUnitX(un[3]),GetUnitY(un[3]),GetUnitX(un[4]),GetUnitY(un[4]))
    call MoveLightning(lightning_1[3],true,GetUnitX(un[4]),GetUnitY(un[4]),GetUnitX(un[1]),GetUnitY(un[1]))
    call MoveLightning(lightning_1[4],true,GetUnitX(un[1]),GetUnitY(un[1]),GetUnitX(un[3]),GetUnitY(un[3]))
    call MoveLightning(lightning_1[5],true,GetUnitX(un[2]),GetUnitY(un[2]),GetUnitX(un[4]),GetUnitY(un[4]))
call BJDebugMsg("center camera x: " + R2S(x2) + " - center camera y: " + R2S(y2))
call BJDebugMsg("d: " + R2S(d) + " theta: " + R2S(theta))

endfunction

//===========================================================================
function InitTrig_field_camera takes nothing returns nothing
    set gg_trg_field_camera = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_field_camera, 1.00 )
    call TriggerAddAction( gg_trg_field_camera, function Trig_field_camera_Actions )
endfunction
второй способ (не рабочий) из-за 3d HELP
Сколько не изучай углы Эйлера или матрицы, не смог норм сделать. У камеры есть все данные: roll, pitch, yaw, distanse,zoom. никак не может offsets подобрать для 4 точек в 3d. Не знаю что делать. Но соображать стал получше. Возможно стоит посмотреть Dgui. хотя это уже не так важно, мне нужны были юниты. это 3d только визуально экран прорисовать хотел.
function Trig_field_camera_Actions2 takes nothing returns nothing
//координаты камеры
local real x1 = GetCameraEyePositionX()
local real y1 = GetCameraEyePositionY()
local real z1 = GetCameraEyePositionZ()
//координаты центра обзора камеры
local real x2 = GetCameraTargetPositionX()
local real y2 = GetCameraTargetPositionY()
local real z2 = GetCameraTargetPositionZ()
//смещение высоты камеры
local real ZOffset = GetCameraField(CAMERA_FIELD_ZOFFSET) 
//расстояние между камерой и целью
local real r = GetCameraField(CAMERA_FIELD_TARGET_DISTANCE)
//поворот камеры вокруг оси Z
local real alpha = ModuloReal((GetCameraField(CAMERA_FIELD_ROTATION)-bj_CAMERA_DEFAULT_ROTATION* bj_DEGTORAD), bj_PI*2)
//вращение камеры аокруг оси X
local real beta = ModuloReal((GetCameraField(CAMERA_FIELD_ROLL)-bj_CAMERA_DEFAULT_ROLL* bj_DEGTORAD), bj_PI*2)
//наклоны камеры вокруг оси Y
local real gamma = ModuloReal((GetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK)-bj_CAMERA_DEFAULT_AOA* bj_DEGTORAD), bj_PI*2)
//координаты смещения
local real x = x2-x1
local real y = y2-y1
local real z = z2-x1+ZOffset

local real l = SquareRoot(x*x + y*y + z*z) 
//вектор
local real dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
local real dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
local real dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 


//центр-таргет обзора камеры
call SetUnitX(un[0],x2)
call SetUnitY(un[0],y2)
call UnitAddAbility(un[0], 'Amrf')
call UnitRemoveAbility(un[0], 'Amrf')
call SetUnitFlyHeight(un[0],z2,0)

set x = x2+r*WidthScreen
set y = y2+r*HeightScreen
set z = z2
set l = SquareRoot(x*x + y*y + z*z) 
//вектор
set dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
set dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
set dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 
call SetUnitX(un[1],x1+x)
call SetUnitY(un[1],y1+y)
call UnitAddAbility(un[1], 'Amrf')
call UnitRemoveAbility(un[1], 'Amrf')
call SetUnitFlyHeight(un[1],z1+z,0)

set x = x2+r*WidthScreen
set y = y2-r*HeightScreen
set z = z2
set l = SquareRoot(x*x + y*y + z*z) 
//вектор
set dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
set dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
set dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 
call SetUnitX(un[2],x1+x)
call SetUnitY(un[2],y1+y)
call UnitAddAbility(un[2], 'Amrf')
call UnitRemoveAbility(un[2], 'Amrf')
call SetUnitFlyHeight(un[2],z1+z,0)

set x = x2-r*WidthScreen
set y = y2-r*HeightScreen
set z = z2
set l = SquareRoot(x*x + y*y + z*z) 
//вектор
set dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
set dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
set dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 
call SetUnitX(un[3],x1+x)
call SetUnitY(un[3],y1+y)
call UnitAddAbility(un[3], 'Amrf')
call UnitRemoveAbility(un[3], 'Amrf')
call SetUnitFlyHeight(un[3],z1+z,0)

set x = x2-r*WidthScreen
set y = y2+r*HeightScreen
set z = z2
set l = SquareRoot(x*x + y*y + z*z) 
//вектор
set dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
set dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
set dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 
call SetUnitX(un[4],x1+x)
call SetUnitY(un[4],y1+y)
call UnitAddAbility(un[4], 'Amrf')
call UnitRemoveAbility(un[4], 'Amrf')
call SetUnitFlyHeight(un[4],z1+z,0)

//РИСУЕМ ПРЯМОУГОЛЬНИК. короче область
//ищем право-верхнюю вершину
call BJDebugMsg("r: " + R2S(r) + " alpha: " + R2S(alpha)+ " beta: " + R2S(beta)+ " gamma: " + R2S(gamma))
    
endfunction

//===========================================================================
function InitTrig_field_camera_2 takes nothing returns nothing
    set gg_trg_field_camera_2 = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_field_camera_2, 1.00 )
    call TriggerAddAction( gg_trg_field_camera_2, function Trig_field_camera_Actions2 )
endfunction

все нашел. на нашем сайте. очень много писали ребята на декартовых координатах
к примеру вот это
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
18
3 года назад
0
Можно проверять видимость точки (в которой стоит юнит) игроку. Не проверял, но, возможно, под видимостью игроку имеется в виду отсутствие тумана войны (то есть "у игрока есть возможность видеть эту точку", а не "точка находится в пределах видимости камеры").
0
30
3 года назад
0
возможно, под видимостью игроку имеется в виду отсутствие тумана войны
Так и есть, делал "умное" воскрешение декораций с такой проверкой когда-то


Не помню про ограничение, но если оно реально есть, то можешь сделать пул из этих 99 тексттагов, доставать из него когда нужно что-то вывести и возвращать после вывода. Если пул пустой, то не выводить ничего. Must Have тексттаги можно вычесть из размера пула просто.
0
17
3 года назад
0
Можно выводить диалоги когда проходишь рядом с npc, как будто подслушиваешь разговор
0
27
3 года назад
0
Maniac_91:
Можно проверять видимость точки (в которой стоит юнит) игроку. Не проверял, но, возможно, под видимостью игроку имеется в виду отсутствие тумана войны (то есть "у игрока есть возможность видеть эту точку", а не "точка находится в пределах видимости камеры").
Проверял давно. так и есть ссылка
Vlod:
Можно выводить диалоги когда проходишь рядом с npc, как будто подслушиваешь разговор
Так у меня НПС все жители деревни. Ими управлять можно. Просто для веселухи и смешных моментов хочется оживить. И чтобы передавали мысли. Но у меня это не одним героем управляется.
0
27
3 года назад
Отредактирован MpW
0
Вроде нашел способ как определить поле камеры, которое лежит в плоскости xy. Высоту камеры просто не учитывал. Поскольку с сферичными координатами проблемы, матрицу опять мучить. Если камеру наклоним колесом мыши, это будет не так важно, даже, если мы не видим, текстаги создадутся, не так и срашно.
если немного вспомнить функции
есть координаты камеры, а есть координаты таргет-центра обзора камеры. Берутся координаты таргет-центра обзора камеры. Относительно центра обзора клепаем вершины ректа с шириной*WidthScreen высотой*HeightScreen. Из DGUI взял
real WidthScreen = 0.544
real HeightScreen = 0.302
В принципе ширина и высота - один и тот же размер, дистанция камеры CAMERA_FIELD_TARGET_DISTANCE. Поэтому и проблем и не было.
Изменяется в зависимости от угла поворота камеры CAMERA_FIELD_ROTATION и расстояния CAMERA_FIELD_TARGET_DISTANCE. Но не учитывал такие как zoom, ролл.
Повороты поля (прямоугольника) можно попробовать через это ссылка
0
27
3 года назад
Отредактирован MpW
0
первый способ - поле в плоскости XY
Это вариант норм работает.
//Простая матрица поворота вокруг оси Z
function Matrix takes unit u, real cx, real cy, real offsetx, real offsety, real theta returns nothing
//вектор
local real dx= (cx + offsetx)-cx
local real dy= (cy + offsety)-cy
//ищем offset-ы
local real vx= dx * Cos(theta) - dy * Sin(theta)
local real vy= dx * Sin(theta) + dy * Cos(theta) 
//сдвигаем
call SetUnitX(u,cx+vx)
call SetUnitY(u,cy+vy)
endfunction

function Trig_field_camera_Actions takes nothing returns nothing
//координаты центра обзора камеры
local real x2 = GetCameraTargetPositionX()
local real y2 = GetCameraTargetPositionY()
local real z2 = GetCameraTargetPositionZ()
//расстояние между камерой и целью
local real d = GetCameraField(CAMERA_FIELD_TARGET_DISTANCE)
//поворот камеры
//показывает насколько изменился угол от стандартного угла и наскока нужна повернуть
local real theta = ModuloReal((GetCameraField(CAMERA_FIELD_ROTATION)-bj_CAMERA_DEFAULT_ROTATION* bj_DEGTORAD), 6.28)



//центр-таргет обзора камеры
call SetUnitX(un[0],x2)
call SetUnitY(un[0],y2)
//РИСУЕМ ПРЯМОУГОЛЬНИК. короче область
//ищем право-верхнюю вершину
    call Matrix(un[1],x2,y2,d*WidthScreen,d*HeightScreen,theta)
//ищем право-нижнюю вершину
    call Matrix(un[2],x2,y2,d*WidthScreen,-d*HeightScreen,theta)
//ищем лево-нижнюю вершину
    call Matrix(un[3],x2,y2,-d*WidthScreen,-d*HeightScreen,theta)
//ищем лево-верхнюю вершину    
    call Matrix(un[4],x2,y2,-d*WidthScreen,d*HeightScreen,theta)
    //молнии
    call MoveLightning(lightning_1[0],true,GetUnitX(un[1]),GetUnitY(un[1]),GetUnitX(un[2]),GetUnitY(un[2]))
    call MoveLightning(lightning_1[1],true,GetUnitX(un[2]),GetUnitY(un[2]),GetUnitX(un[3]),GetUnitY(un[3]))
    call MoveLightning(lightning_1[2],true,GetUnitX(un[3]),GetUnitY(un[3]),GetUnitX(un[4]),GetUnitY(un[4]))
    call MoveLightning(lightning_1[3],true,GetUnitX(un[4]),GetUnitY(un[4]),GetUnitX(un[1]),GetUnitY(un[1]))
    call MoveLightning(lightning_1[4],true,GetUnitX(un[1]),GetUnitY(un[1]),GetUnitX(un[3]),GetUnitY(un[3]))
    call MoveLightning(lightning_1[5],true,GetUnitX(un[2]),GetUnitY(un[2]),GetUnitX(un[4]),GetUnitY(un[4]))
call BJDebugMsg("center camera x: " + R2S(x2) + " - center camera y: " + R2S(y2))
call BJDebugMsg("d: " + R2S(d) + " theta: " + R2S(theta))

endfunction

//===========================================================================
function InitTrig_field_camera takes nothing returns nothing
    set gg_trg_field_camera = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_field_camera, 1.00 )
    call TriggerAddAction( gg_trg_field_camera, function Trig_field_camera_Actions )
endfunction
второй способ (не рабочий) из-за 3d HELP
Сколько не изучай углы Эйлера или матрицы, не смог норм сделать. У камеры есть все данные: roll, pitch, yaw, distanse,zoom. никак не может offsets подобрать для 4 точек в 3d. Не знаю что делать. Но соображать стал получше. Возможно стоит посмотреть Dgui. хотя это уже не так важно, мне нужны были юниты. это 3d только визуально экран прорисовать хотел.
function Trig_field_camera_Actions2 takes nothing returns nothing
//координаты камеры
local real x1 = GetCameraEyePositionX()
local real y1 = GetCameraEyePositionY()
local real z1 = GetCameraEyePositionZ()
//координаты центра обзора камеры
local real x2 = GetCameraTargetPositionX()
local real y2 = GetCameraTargetPositionY()
local real z2 = GetCameraTargetPositionZ()
//смещение высоты камеры
local real ZOffset = GetCameraField(CAMERA_FIELD_ZOFFSET) 
//расстояние между камерой и целью
local real r = GetCameraField(CAMERA_FIELD_TARGET_DISTANCE)
//поворот камеры вокруг оси Z
local real alpha = ModuloReal((GetCameraField(CAMERA_FIELD_ROTATION)-bj_CAMERA_DEFAULT_ROTATION* bj_DEGTORAD), bj_PI*2)
//вращение камеры аокруг оси X
local real beta = ModuloReal((GetCameraField(CAMERA_FIELD_ROLL)-bj_CAMERA_DEFAULT_ROLL* bj_DEGTORAD), bj_PI*2)
//наклоны камеры вокруг оси Y
local real gamma = ModuloReal((GetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK)-bj_CAMERA_DEFAULT_AOA* bj_DEGTORAD), bj_PI*2)
//координаты смещения
local real x = x2-x1
local real y = y2-y1
local real z = z2-x1+ZOffset

local real l = SquareRoot(x*x + y*y + z*z) 
//вектор
local real dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
local real dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
local real dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 


//центр-таргет обзора камеры
call SetUnitX(un[0],x2)
call SetUnitY(un[0],y2)
call UnitAddAbility(un[0], 'Amrf')
call UnitRemoveAbility(un[0], 'Amrf')
call SetUnitFlyHeight(un[0],z2,0)

set x = x2+r*WidthScreen
set y = y2+r*HeightScreen
set z = z2
set l = SquareRoot(x*x + y*y + z*z) 
//вектор
set dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
set dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
set dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 
call SetUnitX(un[1],x1+x)
call SetUnitY(un[1],y1+y)
call UnitAddAbility(un[1], 'Amrf')
call UnitRemoveAbility(un[1], 'Amrf')
call SetUnitFlyHeight(un[1],z1+z,0)

set x = x2+r*WidthScreen
set y = y2-r*HeightScreen
set z = z2
set l = SquareRoot(x*x + y*y + z*z) 
//вектор
set dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
set dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
set dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 
call SetUnitX(un[2],x1+x)
call SetUnitY(un[2],y1+y)
call UnitAddAbility(un[2], 'Amrf')
call UnitRemoveAbility(un[2], 'Amrf')
call SetUnitFlyHeight(un[2],z1+z,0)

set x = x2-r*WidthScreen
set y = y2-r*HeightScreen
set z = z2
set l = SquareRoot(x*x + y*y + z*z) 
//вектор
set dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
set dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
set dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 
call SetUnitX(un[3],x1+x)
call SetUnitY(un[3],y1+y)
call UnitAddAbility(un[3], 'Amrf')
call UnitRemoveAbility(un[3], 'Amrf')
call SetUnitFlyHeight(un[3],z1+z,0)

set x = x2-r*WidthScreen
set y = y2+r*HeightScreen
set z = z2
set l = SquareRoot(x*x + y*y + z*z) 
//вектор
set dx = (x2-(x1+l*Sin(beta)*Cos(alpha)))//*WidthScreen
set dy = (y2-(y1+l*Sin(beta)*Sin(alpha)))//*HeightScreen
set dz = z2-(z1+l*Cos(beta))
//offsets
set x = (dx*Cos(alpha)*Cos(gamma)-dx*Sin(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Cos(alpha)*Sin(gamma) -dy*Sin(alpha)*Cos(beta)*Cos(gamma)) +(dz*Sin(alpha)*Sin(beta)) 
set y = (dx*Sin(alpha)*Cos(gamma)+dx*Cos(alpha)*Cos(beta)*Sin(gamma)) +(- dy*Sin(alpha)*Sin(gamma) +dy*Cos(alpha)*Cos(beta)*Cos(gamma)) +(-dz*Cos(alpha)*Sin(beta)) 
set z = (dx*Sin(beta)* Sin(gamma))  + (dy*Sin(beta)*Cos(gamma)) + dz*Cos(beta) 
call SetUnitX(un[4],x1+x)
call SetUnitY(un[4],y1+y)
call UnitAddAbility(un[4], 'Amrf')
call UnitRemoveAbility(un[4], 'Amrf')
call SetUnitFlyHeight(un[4],z1+z,0)

//РИСУЕМ ПРЯМОУГОЛЬНИК. короче область
//ищем право-верхнюю вершину
call BJDebugMsg("r: " + R2S(r) + " alpha: " + R2S(alpha)+ " beta: " + R2S(beta)+ " gamma: " + R2S(gamma))
    
endfunction

//===========================================================================
function InitTrig_field_camera_2 takes nothing returns nothing
    set gg_trg_field_camera_2 = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_field_camera_2, 1.00 )
    call TriggerAddAction( gg_trg_field_camera_2, function Trig_field_camera_Actions2 )
endfunction

все нашел. на нашем сайте. очень много писали ребята на декартовых координатах
к примеру вот это
Загруженные файлы
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.