
06.07.2019, 12:00
|
|
Постоянный
Регистрация: 28.02.2018
Сообщений: 307
С нами:
4319022
Репутация:
113
|
|
Сообщение от ALF
есть два объекта, каждый из них расположен на своей позиции, нужно повернуть объект в сторону другого объекта в трёхмерном пространстве.
я прогуливал школу, вот и туповат чуть-чуть, дайте пожалуйста формулу как можно это высчитать
object one[x y z]
object two[x y z]
как мне высчитать ротацию по всем трём координатам?
Ну по x и y вот, но это походу не то
C++:
Код:
// pos позиция обекта к которому нужно повернутся
// posTo сам обект
float
angle
=
atan2
(
(
pos
[
0
]
-
posTo
[
0
]
)
,
(
posTo
[
1
]
-
pos
[
1
]
)
)
+
M_PI
;
|
|
|

06.07.2019, 12:48
|
|
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами:
4472205
Репутация:
163
|
|
Сообщение от Stiopko
Ну по x и y вот, но это походу не то
C++:
Код:
// pos позиция обекта к которому нужно повернутся
// posTo сам обект
float
angle
=
atan2
(
(
pos
[
0
]
-
posTo
[
0
]
)
,
(
posTo
[
1
]
-
pos
[
1
]
)
)
+
M_PI
;
это не то
|
|
|

06.07.2019, 13:12
|
|
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами:
4472205
Репутация:
163
|
|
это всё не то.
объясняю понятней, вот функция которая создаёт объект, ротация там меняется по трём переменным(вектор, x, y, z)
C++:
Код:
BOOL
Create
(
WORD nId
,
int
nModel
,
CVector position
,
CVector rotation
,
float
fDrawDistance
)
{
return
(
(
BOOL
(
__thiscall
*
)
(
stObjectPool
*
,
WORD
,
int
,
CVector
,
CVector
,
float
)
)
(
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
0xF470
)
)
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
,
nId
,
nModel
,
position
,
rotation
,
fDrawDistance
)
;
}
у меня есть координаты моего созданного объекта и координаты того вокруг чего он должен вращаться.
вопрос, как мне из этих двух координат высчитать ротация и повернуть объект в сторону моих координат?
|
|
|

06.07.2019, 13:37
|
|
Постоянный
Регистрация: 28.02.2018
Сообщений: 307
С нами:
4319022
Репутация:
113
|
|
Сообщение от ALF
это всё не то.
объясняю понятней, вот функция которая создаёт объект, ротация там меняется по трём переменным(вектор, x, y, z)
C++:
Код:
BOOL
Create
(
WORD nId
,
int
nModel
,
CVector position
,
CVector rotation
,
float
fDrawDistance
)
{
return
(
(
BOOL
(
__thiscall
*
)
(
stObjectPool
*
,
WORD
,
int
,
CVector
,
CVector
,
float
)
)
(
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
0xF470
)
)
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
,
nId
,
nModel
,
position
,
rotation
,
fDrawDistance
)
;
}
у меня есть координаты моего созданного объекта и координаты того вокруг чего он должен вращаться.
вопрос, как мне из этих двух координат высчитать ротация и повернуть объект в сторону моих координат?
Смотри тебе нужно вот это Кватеринион, но я это еще в школе не проходил поэтому хз
|
|
|

06.07.2019, 14:32
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от ALF
это всё не то.
Не особо понимаю с похмелья что тебе требуется в итоге, но попробуй
Вычисляешь угол между объектами с помощью atan2 и переводишь в кватернион.
Сообщение от Спойлер
C++:
Код:
void
QuaternionFromAngle
(
float
*
fQuaternion
,
float
fAngle
)
{
fAngle
=
DEGTORAD
(
fAngle
)
;
float
fMatrix
[
3
]
[
3
]
,
c
=
cos
(
fAngle
)
,
s
=
sin
(
fAngle
)
;
// QuaternionRotateZ
fMatrix
[
0
]
[
0
]
=
c
;
fMatrix
[
0
]
[
1
]
=
s
;
fMatrix
[
0
]
[
2
]
=
0.0
;
fMatrix
[
1
]
[
0
]
=
-
s
;
fMatrix
[
1
]
[
1
]
=
c
;
fMatrix
[
1
]
[
2
]
=
0.0
;
fMatrix
[
2
]
[
0
]
=
0.0
;
fMatrix
[
2
]
[
1
]
=
0.0
;
fMatrix
[
2
]
[
2
]
=
1.0
;
// GetQuaternionFromMatrix
fQuaternion
[
0
]
=
sqrt
(
Max
(
(
float
)
0
,
1.0f
+
fMatrix
[
0
]
[
0
]
+
fMatrix
[
1
]
[
1
]
+
fMatrix
[
2
]
[
2
]
)
)
*
0.5f
;
fQuaternion
[
1
]
=
sqrt
(
Max
(
(
float
)
0
,
1.0f
+
fMatrix
[
0
]
[
0
]
-
fMatrix
[
1
]
[
1
]
-
fMatrix
[
2
]
[
2
]
)
)
*
0.5f
;
fQuaternion
[
2
]
=
sqrt
(
Max
(
(
float
)
0
,
1.0f
-
fMatrix
[
0
]
[
0
]
+
fMatrix
[
1
]
[
1
]
-
fMatrix
[
2
]
[
2
]
)
)
*
0.5f
;
fQuaternion
[
3
]
=
sqrt
(
Max
(
(
float
)
0
,
1.0f
-
fMatrix
[
0
]
[
0
]
-
fMatrix
[
1
]
[
1
]
+
fMatrix
[
2
]
[
2
]
)
)
*
0.5f
;
fQuaternion
[
1
]
=
static_cast
(
_copysign
(
fQuaternion
[
1
]
,
fMatrix
[
2
]
[
1
]
-
fMatrix
[
1
]
[
2
]
)
)
;
fQuaternion
[
2
]
=
static_cast
(
_copysign
(
fQuaternion
[
2
]
,
fMatrix
[
0
]
[
2
]
-
fMatrix
[
2
]
[
0
]
)
)
;
fQuaternion
[
3
]
=
static_cast
(
_copysign
(
fQuaternion
[
3
]
,
fMatrix
[
1
]
[
0
]
-
fMatrix
[
0
]
[
1
]
)
)
;
}
Пробуй, вроде должно работать
|
|
|

06.07.2019, 14:05
|
|
Постоянный
Регистрация: 02.02.2018
Сообщений: 740
С нами:
4355743
Репутация:
163
|
|
Подскажите, если кто-нибудь знает, как работает это? Какие адреса чистит, где их можно узнать итд.
|
|
|

06.07.2019, 19:12
|
|
Постоянный
Регистрация: 05.03.2014
Сообщений: 626
С нами:
6415078
Репутация:
163
|
|
Сообщение от Akionka
Подскажите, если кто-нибудь знает, как работает это? Какие адреса чистит, где их можно узнать итд.
обычный игнор входящего RPC_SCRREMOVEBUILDINGFORPLAYER
|
|
|

06.07.2019, 16:42
|
|
Постоянный
Регистрация: 17.01.2014
Сообщений: 493
С нами:
6483143
Репутация:
93
|
|
Есть функция для поиска последовательности строчных символов:
C++:
[CODE]
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
new
char
[
strlen
(
what
)
+
1
]
;
yo
=
(
char
*
)
temp
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
Она копирует из области поиска по n байт длиною равной длине искомого, добавляет на конец 0 и сравнивает. И так, пока не кончится буфер.
Однако, я её раз 10 наверное прогнал по циклу вызвов с одинаковыми параметрами, и примерно 33-39 из 100 вызовов она возвращает ошибку(-1). Лично я тут не вижу ошибки в логике, но результат говорит об обратном.
Помогите понять, где косяк, плиз.
|
|
|

06.07.2019, 17:19
|
|
Познавший АНТИЧАТ
Регистрация: 16.03.2017
Сообщений: 1,626
С нами:
4821087
Репутация:
133
|
|
[QUOTE="ishi"]
Есть функция для поиска последовательности строчных символов:
C++:
[CODE]
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
new
char
[
strlen
(
what
)
+
1
]
;
yo
=
(
char
*
)
temp
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
|
|
|

06.07.2019, 19:47
|
|
Постоянный
Регистрация: 17.01.2014
Сообщений: 493
С нами:
6483143
Репутация:
93
|
|
Сообщение от B3JlOM_}I{OTTbI
это проверка на то что "слово" есть в строчке "какое то слово" ?
Не совсем. Это для поиска в буфере, содержимое которого может не соответствовать строчному типу: на конце может не быть нуля, а сами символы могут не соответствовать кодировке искомого. Короче говоря: поиск в бинарном файле.
Сообщение от cakebou
чем strstr не устраивает?
Не хочет искать дальше первого \0
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|