Мне хочется создать систему диалогов среди жителей. Когда камеру наводишь на них, и у них из головы вылетает текстаг монолога/диалога. Вурдалак: "я хочу мясо". В зависимости от ситуации у них будет вылетать разный рандомный смешной текст, если он к месту. Вроде же текстаги локально ограничены до 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
все нашел. на нашем сайте. очень много писали ребята на декартовых координатах
к примеру вот это
к примеру вот это
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Vlod: Так у меня НПС все жители деревни. Ими управлять можно. Просто для веселухи и смешных моментов хочется оживить. И чтобы передавали мысли. Но у меня это не одним героем управляется.
Отредактирован MpW
есть координаты камеры, а есть координаты таргет-центра обзора камеры. Берутся координаты таргет-центра обзора камеры. Относительно центра обзора клепаем вершины ректа с шириной*WidthScreen высотой*HeightScreen. Из DGUI взял
Изменяется в зависимости от угла поворота камеры CAMERA_FIELD_ROTATION и расстояния CAMERA_FIELD_TARGET_DISTANCE. Но не учитывал такие как zoom, ролл.
Повороты поля (прямоугольника) можно попробовать через это ссылка
Отредактирован MpW
к примеру вот это