Jump to content
Alloder.pro: about Allods with love
Search In
  • More options...
Find results that contain...
Find results in...

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.

More

The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

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


icreator
 Share

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use