Jump to content

Digest Jan-Feb

We talk about what was done and updated in the past month. We help keep abreast of events.

January February

Servers monitoring and the Addons Editor

We present you two legends. All dreams come true.

Servers monitoring The Addons Editor

Game tooltips

Tooltips provide a way for 3rd party fansites and extensions to display detailed information on mouseover.

Read more

The Addons Updater

Let us to introduce the addons updating software and to share the details

Read more Download

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


icreator

Recommended Posts

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
Link to comment
Share on other sites

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

Link to comment
Share on other sites

Code:

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


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

Тут половину кода можно выкинуть, заодно с комментами. Если это мусор, зачем им делиться на форуме?
Link to comment
Share on other sites

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

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

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

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

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

Link to comment
Share on other sites

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())

У меня это както так выглядит
Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use