Что нового

[Математика] Координаты в 3D FPS

lirikmel

Продвинутый
Сообщения
226
Репутация
84
никогда раньше не сталкивался с автоматизацией таких типов игр , и в общем основная первая проблема.
как наводить на цель по? ведь по идее в окне мы управляем камерой а не мышкой , поэтому координаты и не будут совпадать с тем что мы получим например в PixelSearch и MouseGetPos (мышка ведь не двигается).

Высказываем свои мысли , а если кто знает прошу поделиться :beer:
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
А какая игра? возможноли модернезировать клиент и например заменить текстурку цели на фигурку определённого цвета чтобы использовать PixelSearch?
Как я думаю можно двигать мышку на несколько пикселей и сканировать как далеко от прицела цель.

Ну вот такие соображения :smile:
 

RomchegChe

Новичок
Сообщения
37
Репутация
1
https://www.youtube.com/watch?v=NUeifQK7ukM
можно еще поискать от этого автора
 
Автор
L

lirikmel

Продвинутый
Сообщения
226
Репутация
84
с внедрением в память само собой все понятно и просто , вопрос не в этом посмотрите как меняются координаты по mousegetpos например в любом шутере когда вы с прицелом на экране и когда в меню (когда мышка на экране) , вот и интерес в том чтобы найти зависимость. потому как поиск пикселя безполезен , если ты не знаешь куда двигать мышу
 

bugaj

Знающий
Сообщения
140
Репутация
11
все смещается относительно центра экрана? В шутерах же заказывают обычно крест в центре экрана, потому что прицел всегда там....
т.е. крутить пока центр не совместится с целью....
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
lirikmel
Это осуществить достаточно просто(хоть я и не считаю ваш вариант приемлемым):

1) Вам необходимо прокрутить камеру ровно на 360 градусов ( скриптом ). Это наше значение X. Так же поступить и с Y.
2) Определить FovX / FovY игровой камеры.
3) Определить Width / Height игрового окна.

А теперь нацелимся в цель по координатам 50x400 (к примеру):
Для начала определим координаты относительно текущего положения:
Код:
toX = 50 - ( Width / 2 )
toY = 400 - ( Height / 2 )

Итого нам нужно сместиться на toX и toY от центра. Переведем это в градусы:
Код:
aX = ( FovX / Width ) * toX
aY = ( FovY / Height ) * toY

А теперь определим на сколько нужно повернуть мышку, зная сенсу( первый шаг ):
( Теоретически это можно расчитать "не на глаз", а с 100% точностью, но я не вижу игры )

Код:
( X / 360 ) * aX
( Y / 360 ) * aY //Понятное дело, что в шутерах камеру по Y вокруг оси не развернуть, поэтому принимайте в расчет 90, 179(обычное значение в шутерах) и так далее.
 

valldar

Новичок
Сообщения
32
Репутация
2
Вопрос конкретно по приложению http://vk.com/blokada3d
Как навести прицел?

Начал писать аимбот, а тут такая засада(((
MouseMove() не работает, курсор двигается отдельно от приложения
В памяти процесса могут содержаться координаты прицела? (или что-то в этом роде :stars:smile:
 

Tyr

Новичок
Сообщения
43
Репутация
4
тот же вопрос, Пытался создать тему про Dragon nest в котором движение курсора тоже непонятно как происходит. Но тему закрыли и сказали что ответ тут
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Tyr
valldar
Вы должны уяснить одно - в такого типа играх делать External Aimbot слишком трудно и не правильно, тем более средствами AutoIt.

На примере Call of Duty: MW
1) Запоминаем свой текущий угол камеры по X:
5wJvq.png

Но так как в других играх такой трюк не всегда провернешь - делайте так:
5wJyF.jpg

Как видно, я зафиксировал прицел на точке в текстуре.

2) Пишем простейший скрипт для расчета отношения движение мыши/угол:
Код:
HotKeySet( "{F6}", "__Move" )
HotKeySet( "{F8}", "__Exit" )
; ---

While 1
	Sleep( 100 )
WEnd

Func __Move()
	$aPos = MouseGetPos()
	MouseMove( $aPos[0] + 390, $aPos[1], 5 )
	; 390 - на сколько нужно сдвинуть мышь, что бы в игре прокрутить камеру на 360 градусов, подбираем руками.
	;5 - о чем я и говорю, чем меньше скорость  - тем больше шансов, что AutoIt коряво повернет мышь.
EndFunc

Func __Exit()
	Exit 1488
EndFunc


3) Фактор из расчетов X по крайней мере в шутерах подойдет и к Y.

4) С помощью вашего External-костыля PixelSearch мы нашли нашу цель по координатам 50x400.
5) Предположим я знаю текущее значение Fov (включая его изменения при прицеле) - эта информация берется из процесса конечно же, но если в вашей игре Fov статичен всегда, то его можно взять единожды. У меня сейчас ~84 X, ~ 56 Y.
6) Размеры игрового окна 800x600.

И далее по предыдущему моему посту:
Код:
toX = 50 - ( GetMousePos[0])/ 2 )
toY = 400 - ( GetMousePos[0] / 2 )

aX = ( 84 / 800 ) * toX
aY = ( 56 / 600 ) * toY

MouseMove( ( X / Factor(тот самый, что мы рассчитали в самом верху) ) * aX, ( Y / Factor ) * aY)

P.S. Если вы не представите себе принцип действия, то сделать будет достаточно затруднительно. Даже у меня ничего толкового не вышло, игры(по крайней мере из серии CoD) - кривовато реагируют на подобные эмуляции движения мыши.
 

Ksaan

Знающий
Сообщения
207
Репутация
15
Создать Аим силами autoit не выйдет если вы хотите завязать всё на пикселях и цвете, а вот зделать макрос на движения мыши в шутере очень даже можно, сам делал на стрельбу без отдачи.
 

ivanius

Знающий
Сообщения
74
Репутация
5
Ну что прошел год, что-то изменилось мне нужно плавное движение в нужное положение - это реально?
 

ivanius

Знающий
Сообщения
74
Репутация
5
Простите, я разобрался, конечно понадобилось вспомнить всю ту геометрию которую учил когда-то, построить отностиельные чертежи и вспомнить как проецируется 3 измерения в 2, но написать и вычислить методом проб и ошибок таки получилось.
OffTopic:
Да простят меня модеры за даблпост. Очень хотел написать все все работает как нужно и спасибо за посты выше.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
ivanius
Код:
WorldToScreen

Загуглите.

FVec:
http://pastebin.com/5Dew1X5x

Код:
Func _WorldToScreen( ByRef $x, ByRef $y, $vLocation, $vOrigin, $aFOV )
	Local $vTransform[3], $vLocal
	; ---
	$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[0])
	If $vTransform[2] < 0.1 Then _
		Return False

	$x = (W/2) * (1 - ($vTransform[0] / $aFOV[0] / $vTransform[2])) ;fovX
	$y = (H/2) * (1 - ($vTransform[1] / $aFOV[1] / $vTransform[2])) ;fovY

	Return True
EndFunc


Почитайте матчасть и названия переменных станут вам понятны.
 
Верх