1 (изменено: Dworkin, 2013-10-14 16:53:02)

Тема: AHK: Перевод координат из мира на экран

Здравствуйте.
Есть функция WorldToScreen - эта функция делает что-то типо перевода координат игроков из мира на экран, т.е. конвертирует.
Искал в интернете функцию WorldToScreen для AHK, но не нашел. Нашел только для AutoIt:

Func __WorldToScreen1( ByRef $x, ByRef $y, $_vLocation, $_vOrigin, $_aFOV )
    Local $vTransform[3]

    Local $vLocal = _FVec_Subtract( $_vLocation, $_vOrigin )
    $vTransform[0] = _FVec_DotProduct( $vLocal, $_Axis[1])
    $vTransform[1] = _FVec_DotProduct( $vLocal, $_Axis[2])
    $vTransform[2] = _FVec_DotProduct( $vLocal, $_Axis[3])
    If $vTransform[2] < 0.1 Then _
        Return False

    $x = $_CenterX * (1 - ($vTransform[0] / $_aFOV[0] / $vTransform[2]))
    $y = $_CenterY * (1 - ($vTransform[1] / $_aFOV[1] / $vTransform[2]))

    Return True
EndFunc

И вот какая то библиотека для того что написано выше:

Func _FVec_Addition( $vector1, $vector2 )
    Local $vector[3]

    $vector[0] = $vector1[0] + $vector2[0]
    $vector[1] = $vector1[1] + $vector2[1]
    $vector[2] = $vector1[2] + $vector2[2]
    Return $vector
EndFunc

Func _FVec_Subtract( $vector1, $vector2 )
    Local $vector[3]

    $vector[0] = $vector1[0] - $vector2[0]
    $vector[1] = $vector1[1] - $vector2[1]
    $vector[2] = $vector1[2] - $vector2[2]
    Return $vector
EndFunc

Func _FVec_Multiply( $vector1, $vector2 )
    Local $vector[3]

    $vector[0] = $vector1[0] * $vector2[0]
    $vector[1] = $vector1[1] * $vector2[1]
    $vector[2] = $vector1[2] * $vector2[2]
    Return $vector
EndFunc

Func _FVec_Divide( $vector1, $vector2 )
    Local $vector[3]

    $vector[0] = $vector1[0] / $vector2[0]
    $vector[1] = $vector1[1] / $vector2[1]
    $vector[2] = $vector1[2] / $vector2[2]
    Return $vector
EndFunc

Func _FVec_Distance( $vector1, $vector2 )
    Local $v = _FVec_Subtract($vector1, $vector2)

    Return _FVec_Length($v)
EndFunc

Func _FVec_CrossProduct( $vector1, $vector2 )
    If (UBound($vector1) = 2) Then
        Return ($vector1[0] * $vector2[1]) - ($vector1[1] * $vector2[0])
    ElseIf (UBound($vector1) = 3) Then
        Local $v[3]

        $v[0] = ($vector1[1] * $vector2[2]) - ($vector1[2] * $vector2[1])
        $v[1] = ($vector1[2] * $vector2[0]) - ($vector1[0] * $vector2[2])
        $v[2] = ($vector1[0] * $vector2[1]) - ($vector1[1] * $vector2[0])

        Return $v
    EndIf
EndFunc

Func _FVec_DotProduct( $vector1, $vector2 )
    Local $v

    $v = $vector1[0]*$vector2[0]
    $v += $vector1[1]*$vector2[1]
    $v += $vector1[2]*$vector2[2]

    Return $v
EndFunc

Func _FVec_Normalize( $vector1 )
    If $vector1[0] = 0 And $vector1[1] = 0 Then _
        Return 0

    Local $v[2]
    Local $length = _FVec_Length( $vector1 )
    $v[0] = $vector1[0] / $length
    $v[1] = $vector1[1] / $length

    Return $v
EndFunc

Func _FVec_Length( $vector1 )
    Local $v, $i

    For $i = 0 To UBound($vector1) - 1
        $v += $vector1[$i] ^ 2
    Next

    Return Sqrt($v)
EndFunc

На других языках таком как C++ такую функцию легко найти, но я не программист поэтому не кидал так как там они отличаются чем-то.
Скажите пожалуйста есть ли такая функция для AHK, а если нету, то возможно ли ее создать?

2

Re: AHK: Перевод координат из мира на экран

Название темы - "функция WorldToScreen", думаю что никому ни о чём не говорит.
А задача:

перевода координат игроков из мира на экран

Попахивает дежа вю.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Перевод координат из мира на экран

serzh82saratov пишет:

Название темы - "функция WorldToScreen", думаю что никому ни о чём не говорит.
А задача:

перевода координат игроков из мира на экран

Попахивает дежа вю.

Изменил название темы. Оно связано, но не так сильно.

4

Re: AHK: Перевод координат из мира на экран

из мира

Из какого такого мира?...

Оно связано, но не так сильно.

Тогда не сильно понятно, чего вы хотите добится.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Перевод координат из мира на экран

serzh82saratov пишет:

из мира

Из какого такого мира?...

Оно связано, но не так сильно.

Тогда не сильно понятно, чего вы хотите добится.

Я сам толком не понимаю эту функцию, но насколько я понял берутся координаты врагов и свои координаты, так же значение своей камеры. Это все переводит координаты XYZ на экран XY. С помощью этой функции можно создать вот такие вот коробочки и они правильно будут отображаться
http://www.haxs.ru/2/chit_css_external_esp_radar_hack.jpg

6

Re: AHK: Перевод координат из мира на экран

берутся координаты врагов и свои координаты, так же значение своей камеры.

Координаты извлекает функция? Или они уже есть, и ей просто надо их скармливать для возврата XY?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Перевод координат из мира на экран

serzh82saratov пишет:

берутся координаты врагов и свои координаты, так же значение своей камеры.

Координаты извлекает функция? Или они уже есть, и ей просто надо их скармливать для возврата XY?

ей нужно скармливать. Я бы накидал сюда эту функцию на C++ или C#, но я в этом ни бум бум, а их там много и все немного отличаются.

8

Re: AHK: Перевод координат из мира на экран

Я бы накидал сюда эту функцию на C++ или C#, но я в этом ни бум бум

Не проще по аналогии с предыдущей темой написать желаемое с нуля, принцип вроде тот же.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: Dworkin, 2013-10-14 20:37:33)

Re: AHK: Перевод координат из мира на экран

serzh82saratov пишет:

Я бы накидал сюда эту функцию на C++ или C#, но я в этом ни бум бум

Не проще по аналогии с предыдущей темой написать желаемое с нуля, принцип вроде тот же.

У меня не хватит знаний, помогите пожалуйста. Тут как я понял используются векторы, а насчет векторов в AHK я ничего не нашел в интернете.
Ниже кину ссылочку на объяснение что такое WorldToScreen, может так станет понятнее что она делает, чем с моих скудных объяснений:

10

Re: AHK: Перевод координат из мира на экран

У меня не хватит знаний, помогите пожалуйста.

У меня тоже нет знаний ни векторов ни тригонометрии ни инглиша ни программирования. Просто глубину (вперёд) по моей логике можно представить как линию проходящую в 45 градусах относительно положительных X и Y в 2-х мерном измерении. И опять же всё вычислить простой математикой, могу ошибатся, такого опыта небыло. Будет время может напишу. Вы пару примеров напишите, каковы входящие параметры, и конечные для отображения 4х угольника.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11 (изменено: Dworkin, 2013-10-15 18:58:20)

Re: AHK: Перевод координат из мира на экран

serzh82saratov пишет:

У меня не хватит знаний, помогите пожалуйста.

У меня тоже нет знаний ни векторов ни тригонометрии ни инглиша ни программирования. Просто глубину (вперёд) по моей логике можно представить как линию проходящую в 45 градусах относительно положительных X и Y в 2-х мерном измерении. И опять же всё вычислить простой математикой, могу ошибатся, такого опыта небыло. Будет время может напишу. Вы пару примеров напишите, каковы входящие параметры, и конечные для отображения 4х угольника.

Отображать можно хоть точку, хоть tooltip вместо коробочки.

Я постарался и перевел статью:

Из входящих параметров есть:
- мои XYZ
- другого человека(врага) XYZ
- мое разрешение экрана
- есть два значения для моей камеры(верх/вниз и влево/вправо) изменяя или считывая можно узнать положение камеры на экране. Как я понял это FOV.

Вектор (геометрия) в геометрии — направленный отрезок.
Под направленным отрезком понимают упорядоченную пару точек, первая из которых — точка A — называется его началом, а вторая — B — его концом.

Еще нашел кое-что по векторам для AHK:

vector(setX, setY)
{
   returned=%setX%,%setY%
;msgbox % setX . "making x"
;msgbox % setY . "making y"
;msgbox % returned . "made vect"
   return returned
}

vectorGetX(vector)
{
   StringSplit, array_item_, vector, `,
   return array_item_1
}

vectorGetY(vector)
{
   StringSplit, array_item_, vector, `,
   return array_item_2
}

vectorNormalized(vector)
{
   ax := vectorGetX(vector)
   ay := vectorGetY(vector)
   mag := vectorMagnitude(vector)
;msgbox % vector . "orig vect"
;msgbox % ax . "x"
;msgbox % ay . "y"
;msgbox % mag . "mag"
   res := -71 / 289
;msgbox % res . "test result"
   newX := ( ax * 1.0 ) / ( mag * 1.0 )
   newY := ( ay * 1.0 ) / ( mag * 1.0 )
;newY := ay * 1.0 / mag
   returned := vector( newX, newY )
;msgbox % newx . "x norm vect"
;msgbox % newy . "y norm vect"
;msgbox % returned . "norm vect"
   return returned
}

vectorMagnitude(vector)
{
   ax := vectorGetX(vector)
   ay := vectorGetY(vector)
   returned := sqrt((ax * ax) + (ay * ay))
;msgbox % returned . "mag vect"
   return returned
}

vectorMultiply(vector, constant)
{
   ax := vectorGetX(vector)
   ay := vectorGetY(vector)
   returned := vector( ax*constant, ay*constant )
   return returned
}

vectorFromCoords(startX, startY, finishX, finishY)
{
   returned := vector( finishX-startX, finishY-startY )
   return returned
}

vectorGetShortLine(startX, startY, finishX, finishY)
{
   largeVector := vectorFromCoords(startX, startY, finishX, finishY)
   returned=%startX%,%startY%,%finishX%,%finishY%
;msgbox % returned . "params that came in"
;msgbox % largeVector . "large vect"
   norm := vectorNormalized(largeVector)
;msgbox % norm . "norm vect"
   distanceVector := vectorMultiply(norm, 15) ;hardcoded a distance of 15 for AHKarena
;msgbox % distanceVector . "distanceVector vect"
   lineEndX := startX + vectorGetX(distanceVector)
   lineEndY := startY + vectorGetY(distanceVector)
   returned=%startX%,%startY%,%lineEndX%,%lineEndY%
;msgbox % returned
   return returned
}

Вот ссылочка:

+ открыть спойлер

https://github.com/camerb/AHKs/blob/master/AHKArena/AHKArena/vectors/AHKarena_v2.012.ahk

12 (изменено: serzh82saratov, 2013-10-16 00:11:32)

Re: AHK: Перевод координат из мира на экран

Из входящих параметров есть:
- мои XYZ
- другого человека(врага) XYZ
- мое разрешение экрана
- есть два значения для моей камеры(верх/вниз и влево/вправо) изменяя или считывая можно узнать положение камеры на экране. Как я понял это FOV.

Вот также как и в той теме, приведи все параметры как они есть.

- мои XYZ

Я так понимаю что они всегда должны являтся точкой отсчёта, то есть нулями, во всяком случае Z.

Еще нашел кое-что по векторам для AHK:

Этот кусок ни о чём не говорит.
Ты, пойми - тут проще написать заново, чем вырывать куски непонятного кода. И потом вычисления касающиеся 3д, скорее всего не всегда подходят под каждый случай. Если ты можешь получить XYZ, что тебе мешает привести пример их конкретного использования.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13 (изменено: Dworkin, 2013-10-16 06:10:27)

Re: AHK: Перевод координат из мира на экран

serzh82saratov пишет:

Из входящих параметров есть:
- мои XYZ
- другого человека(врага) XYZ
- мое разрешение экрана
- есть два значения для моей камеры(верх/вниз и влево/вправо) изменяя или считывая можно узнать положение камеры на экране. Как я понял это FOV.

Вот также как и в той теме, приведи все параметры как они есть.

Параметры все время изменяются...
Разрешение экрана - 640x480

serzh82saratov пишет:

- мои XYZ

Я так понимаю что они всегда должны являтся точкой отсчёта, то есть нулями, во всяком случае Z.

Да я не подумал, действительно "-мои XYZ" там все равно 0 так как взято за точку отсчета. Разве что приходиться их использовать для вычисления расстояния или вектора.

serzh82saratov пишет:

Еще нашел кое-что по векторам для AHK:

Этот кусок ни о чём не говорит.
Ты, пойми - тут проще написать заново, чем вырывать куски непонятного кода. И потом вычисления касающиеся 3д, скорее всего не всегда подходят под каждый случай. Если ты можешь получить XYZ, что тебе мешает привести пример их конкретного использования.

Не пойму, конкретный пример чего? Ну я могу найти расстояние между двумя людьми. Думаю могу найти вектор.

Еще поискав по интернету, я понял что надо почитать про четырехмерные вектора, матрицы, аналитическая геометрия...короче голова кругом, надо будет посидеть и почитать.

Ах да нашел еще кое-что другое полезное про это и там пишут:
"Все можно сделать путем расчета углов между людьми.
Брать центр экрана:
ScreenX / 2;
SCREENY / 2;
Предположить что другой человек находится на той же высоте что и вы, и рисовать коробочку(в моей случаи лучше и проще точку) по середине, а когда перемещаются влево или вправо то и угол между вами изменятся.
Надо узнать разницу углов.
Формула для вычисления угла
angle = atan (slope) * (180/pi)"

slope переводится как наклон.

Думаю что обмозговав это можно что-то сделать проще, без вычисления и поправки на высоту

14

Re: AHK: Перевод координат из мира на экран

Не пойму, конкретный пример чего?

- другого человека(врага) XYZ

Изменяя свои XY, XY врага изменяются?

- мое разрешение экрана

Экрана, или в первую очередь самой игры? И если не совпадает то делать перерасчёт на экран?

- есть два значения для моей камеры(верх/вниз и влево/вправо) изменяя или считывая можно узнать положение камеры на экране. Как я понял это FOV.

Где они?

Приведи:
- разрешение экрана
- другого человека(врага) XYZ
- макимум и минимум XYZ который может быть в игре
- есть два значения для моей камеры(верх/вниз и влево/вправо) изменяя или считывая можно узнать положение камеры на экране

- нужный результат XY из данных параметров

То есть подумай сам, какие нужны константы, и каким будет результат XY, при передаче XYZ  параметров (несколько примеров).

Предположить что другой человек находится на той же высоте что и вы, и рисовать коробочку(в моей случаи лучше и проще точку) по середине

Так не интересно

Вот экран:

http://savepic.net/3888891.jpg

Соотношение между X и Y дают угол. Z начинается от нуля и проходит (или не доходит) через пересечение XY. То есть нужно просто получить координаты, где заканчивается вектор Z. Размеры прямоугольника зависят от Z, больше Z - меньше прямоугольник.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui