HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 29.08.2021, 16:01
nullptr-
Новичок
Регистрация: 22.09.2019
Сообщений: 12
С нами: 3496943

Репутация: 53
По умолчанию

Всем привет!

Пытался повернуть персонажа на определенные игровые координаты через кватернион, но в результате получается полная вакханалия.

Большое спасибо @SR_team за открытые исходники

Сам кватернион:





[CODE]
struct
Quaternion
{
float
fW
,
fX
,
fY
,
fZ
;
}
;
void
SetQuaternion
(
)
(
const
Quaternion
&
quater
)
{
float
SquarredQuaterW
=
0.0f
,
SquarredQuaterX
=
0.0f
,
SquarredQuaterY
=
0.0f
,
SquarredQuaterZ
=
0.0f
;
SquarredQuaterW
=
quater
.
fW
*
quater
.
fW
;
SquarredQuaterX
=
quater
.
fX
*
quater
.
fX
;
SquarredQuaterY
=
quater
.
fY
*
quater
.
fY
;
SquarredQuaterZ
=
quater
.
fZ
*
quater
.
fZ
;
right
.
fX
=
SquarredQuaterX
-
SquarredQuaterY
-
SquarredQuaterZ
+
SquarredQuaterW
;
up
.
fY
=
SquarredQuaterY
-
SquarredQuaterX
-
SquarredQuaterZ
+
SquarredQuaterW
;
at
.
fZ
=
SquarredQuaterZ
-
(
SquarredQuaterY
+
SquarredQuaterX
)
+
SquarredQuaterW
;
float
multXY
=
quater
.
fX
*
quater
.
fY
;
float
multWZ
=
quater
.
fW
*
quater
.
fZ
;
up
.
fX
=
multWZ
+
multXY
+
multWZ
+
multXY
;
right
.
fY
=
multXY
-
multWZ
+
multXY
-
multWZ
;
float
multXZ
=
quater
.
fX
*
quater
.
fZ
;
float
multWY
=
quater
.
fW
*
quater
.
fY
;
at
.
fX
=
multXZ
-
multWY
+
multXZ
-
multWY
;
right
.
fZ
=
multWY
+
multXZ
+
multWY
+
multXZ
;
float
multYZ
=
quater
.
fY
*
quater
.
fZ
;
float
multWX
=
quater
.
fW
*
quater
.
fX
;
at
.
fY
=
multWX
+
multYZ
+
multWX
+
multYZ
;
up
.
fZ
=
multYZ
-
multWX
+
multYZ
-
multWX
;
}
Quaternion
GetQuaternion
(
)
{
long
double
v13
;
// st7@1
long
double
v14
;
// st7@3
long
double
v15
;
// st5@5
float
v16
;
// st6@5
float
v17
;
// st7@5
long
double
v18
;
// st6@7
Quaternion result
;
float
v23
;
// [sp+10h] [bp-20h]@7
float
v24
;
// [sp+18h] [bp-18h]@9
v13
=
right
.
fX
+
up
.
fY
+
at
.
fZ
+
1.0f
;
if
(
v13



Функция поворота:





Код:
float
GetAngleBetweenObjectsRad
(
float
&
x1
,
float
&
y1
,
float
&
x2
,
float
&
y2
)
{
float
kx
,
ky
;
float
t
,
a
;
kx
=
x2
-
x1
;
ky
=
y2
-
y1
;
if
(
kx
==
0
)
kx
=
0.00001f
;
t
=
kx
/
ky
;
if
(
t
=
0
)
&&
(
ky
>=
0
)
)
a
=
359.99999f
-
a
;
else
if
(
(
kx
>=
0
)
&&
(
ky

getPosition
(
)
;
float
angle
=
-
GetAngleBetweenObjectsRad
(
me
.
fX
,
me
.
fY
,
vec
.
fX
,
vec
.
fY
)
;
auto
quat
=
GetQuaternion
(
)
;
quat
.
fX
=
cosf
(
angle
/
2
)
;
quat
.
fW
=
sinf
(
angle
/
2
)
;
SetQuaternion
(
quat
)
;
}
 
Ответить с цитированием

  #2  
Старый 10.09.2021, 21:26
Vintik
Познавший АНТИЧАТ
Регистрация: 18.08.2017
Сообщений: 1,568
С нами: 4598023

Репутация: 183


По умолчанию

[QUOTE="S0Ft1k1337"]

C++:





[CODE]
float
GetAngleBetweenObjectsRad
(
float
&
x1
,
float
&
y1
,
float
&
x2
,
float
&
y2
)
{
float
kx
,
ky
;
float
t
,
a
;
kx
=
x2
-
x1
;
ky
=
y2
-
y1
;
if
(
kx
==
0
)
kx
=
0.00001f
;
t
=
kx
/
ky
;
if
(
t
=
0
)
&&
(
ky
>=
0
)
)
a
=
359.99999f
-
a
;
else
if
(
(
kx
>=
0
)
&&
(
ky

C++:





Код:
#include 
float
GetAngleBetweenObjectsRad
(
float
&
x1
,
float
&
y1
,
float
&
x2
,
float
&
y2
)
{
return
atan2
(
x2
-
x1
,
y2
-
y1
)
;
}


Не очень понял что значит "через кватернион", можно же просто изменить угол поворота в системе XOY (heading).
 
Ответить с цитированием

  #3  
Старый 19.09.2021, 20:12
nullptr-
Новичок
Регистрация: 22.09.2019
Сообщений: 12
С нами: 3496943

Репутация: 53
По умолчанию

Цитата:
Сообщение от Vintik  

Не очень понял что значит "через кватернион", можно же просто изменить угол поворота в системе XOY (heading).
Можно конечно, но как ты его повернешь на игровые координаты мира
 
Ответить с цитированием

  #4  
Старый 20.09.2021, 16:42
Vintik
Познавший АНТИЧАТ
Регистрация: 18.08.2017
Сообщений: 1,568
С нами: 4598023

Репутация: 183


По умолчанию

Цитата:
Сообщение от S0Ft1k1337  

Можно конечно, но как ты его повернешь на игровые координаты мира
Очень просто, если я тебя верно понял.

C++:





Код:
#include 
float
GetAngleBetweenObjectsRad
(
float
&
x1
,
float
&
y1
,
float
&
x2
,
float
&
y2
)
{
return
atan2
(
x2
-
x1
,
y2
-
y1
)
;
}
float
TurnToCoordinates
(
DWORD
&
cped
,
float
&
x
,
float
&
y
)
{
DWORD mt
=
*
(
DWORD
*
)
(
cped
+
0x14
)
;
float
px
=
*
(
float
*
)
(
mt
+
0x30
)
,
py
=
*
(
float
*
)
(
mt
+
0x34
)
;
float
heading
=
GetAngleBetweenObjectsRad
(
px
,
py
,
x
,
y
)
;
*
(
float
*
)
(
cped
+
0x55C
)
=
heading
;
// фактический угол поворота
*
(
float
*
)
(
cped
+
0x558
)
=
heading
;
// чтобы не было "плавного поворота". если нужно плавно - удалить строку
}
void
Main
(
)
{
// поворачиваем нашего игрока, чтобы он смотрел в сторону координат x = 100, y = 50
DWORD myPlayer
=
*
(
DWORD
*
)
(
0xB6F5F0
)
;
TurnToCoordinates
(
myPlayer
,
100
,
50
)
;
}
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.