Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Аддон примерочная


icreator

Рекомендуемые сообщения

Code:
------------------------------------------------------------------
-- компас для детектируемых объектов
------------------------------------------------------------------
local HALF_PI = math.pi / 2
--EVENT_UNIT_POS_CHANGED
--EVENT_PROJECTED_OBJECTS_CHANGED
function getDistAngle(id)

---LogToChat("getDistAngle")
local projected = id and object.GetProjectedInfo(id)
if not projected then return end
local avatarPos = avatar.GetPos()

--- тут другие координаты - километры чтоли
--local dX = projected.posX - avatarPos.posX
--local dY = projected.posY - avatarPos.posY

local pos = object.GetPos(id)

if not pos or not avatarPos then return end
local dX = pos.posX - avatarPos.posX
local dY = pos.posY - avatarPos.posY
--LogToChat("projected="..math.ceil(projected.posX)..":"..math.ceil(projected.posY))
--LogToChat("avatar="..math.ceil(avatarPos.posX)..":"..math.ceil(avatarPos.posY))
--LogToChat("pos="..math.ceil(pos.posX)..":"..math.ceil(pos.posY))
--LogToChat(" d="..math.ceil(dX)..":"..math.ceil(dY))

local angle = HALF_PI
if math.abs(dY) > 0.01 then
angle = math.atan(dX / dY)
end
--LogToChat(math.ceil(angle*180/math.pi).."")
angle = -mission.GetCameraDirection() - angle + HALF_PI
if angle > math.pi then
  angle = angle - math.pi
elseif angle < -math.pi then
  angle = angle + math.pi
end

angle = -1*mission.GetCameraDirection()+HALF_PI 

local avatarPos = avatar.GetPos()
local playerPos = { x = avatarPos.posX, y = avatarPos.posY }

local height = dY
local width = dX
if height == 0 then
return
end
local winkel = math.atan(width / height)
angle = angle - winkel
if (width < 0) and (height < 0) then
angle = angle + math.pi
elseif (width < 0) and (height >= 0) then
elseif(width >= 0) and (height < 0) then
  angle = angle + math.pi
else
end

return projected.playerDistance, angle
--return angle*180/math.pi, angle
end
Ссылка на комментарий
Поделиться на другие сайты

Я как то пытался что то подобное делать. Запутался в координатах и забил :)

Ссылка на комментарий
Поделиться на другие сайты

Code:

local dX = projected.posX - avatarPos.posX
local dY = projected.posY - avatarPos.posY


Я вот не вкурил чота. projected - это вообще-то координаты отклонения от центра экрана, в удвоенных долях размеров вьюпорта [-1, 1]. Это в документалове есть. Зачем отнимать теплое от мягкого?

Тут половину кода можно выкинуть, заодно с комментами. Если это мусор, зачем им делиться на форуме?
Ссылка на комментарий
Поделиться на другие сайты

Не совсем понял зачем отнимать координаты проекции от координат персонажа......

Это при том, что детектируемые объекты спокойно отдают свои 3Д координаты не сопротивляясь. В 99.9% случаях пользователю нужно только направление на плоскости, так что можно даже о наклоне камеры не думать, а поворот находится функцией.

П.С. О, да, прочитал сам код, просто этот кусок меня зацепил :) Это ж закомментировано с комментарием про километры :)

Я сперва подумал что она находит направление по точкам проекции на экране. Это ж один из простейших способов (если не самый простой), тут даже считать ничего не надо.

П.П.С. Я б советовал пользоваться функцией math.atan2()

Ссылка на комментарий
Поделиться на другие сайты

Code:
local playerPos = avatar.GetPos()

local height = arrowPoint.posY - playerPos.posY
local width = arrowPoint.posX - playerPos.posX

wtArrowText:SetVal("distance", common.FormatFloat(math.sqrt(width*width + height*height), "%.1f"))
wtArrow:Rotate(math.atan2(height, width) - mission.GetCameraDirection())

У меня это както так выглядит
Ссылка на комментарий
Поделиться на другие сайты

Я имел ввиду что можно получать координаты точки проекции объекта на экран, и координаты самого виджета на экране. Тогда будет показываться "Точное направление от стрелки на юнит" а не "относительное направление от аватара на юнит".

Т.е. грубо говоря если юнит прямо по центру экрана, то передвигая стрелку вы просто передвинете стрелку, она останется ориентирована в том же направлении что и была. А если считать по второму методу, то стрелка всегда будет направлена на цель, и вращая стрелку вокруг цели по экрану мы будем наблюдать вражение стрелки так чтобы она всегда указывала точно на цель. При этом неважно как отклонена цель от нас по оси Z - стрелка всегда будет указывать точно на цель. И рассчитывать направление нужно на плоскости используя всего 2 координаты - Х и У.

Ссылка на комментарий
Поделиться на другие сайты

Хм, чтото мне подсказывает что я не увижу разницы, хотя попробую.

ЗЫ а, допер, имелось ввиду стрелка на экране указывает на цель относительно себя, а не относительно персонажа (центра экрана), тогда вопрос нафига? Мнеб сориентироваться куда повернуть персонажа, а не куда повернутся относительно стрелки (хотя я друль, стрелку делал для хилов, может не понимаю нюансов). Стрелку пихнул куда удобно, чтоб не загораживала вид, и когда надо поглядывай, хотя в основном думаю более важна дистанция (кастовать можно и за спину), ток если цель далеко, чтоб знать куда подбежать надо, но и тут всеж лучше относительно персонажа.

ЗЫ в моем примере arrowPoint это 3d координаты либо точки (чтоб можно было вернутся на место, то есть встал в рейде на позицию, запомнил координаты, и стрелка указывает куда надо вернутся, было нужно на Пучине, Сарне), либо 3d координаты цели.

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования