Войти
ПрограммированиеФорумФизика

Ванька-встанька (PhysX)

#0
17:51, 8 окт. 2019

Мне надо сделать что бы обьект в состоянии покоя всегда принимал вертикальное положение.
С гравитацией это просто, достаточно сместить центь тяжести, а как это сделать в невесомости?


#1
18:30, 8 окт. 2019

Тянуть за макушку вверх и за жопу вниз с одинаковой силой.

#2
18:42, 8 окт. 2019

а как вертикальное считается без гравитации? Только lookAt.

#3
18:42, 8 окт. 2019

SunnyBunny
> Тянуть за макушку вверх и за жопу вниз с одинаковой силой.
Э... А как "тянуть за макушку"?  Я умею весь обьект тянуть но не его части.

#4
(Правка: 18:46) 18:45, 8 окт. 2019

lookid
> а как вертикальное считается без гравитации? Только lookAt.
Ну пейзаж то у меня обычный, просто там летают некоторые предметы, скажем цилиндры. Я могу их тащить неким лучем, они сталкиваются друг с другом, но в конце концов все должны успокоиться в одном положении - крышкой вверх.

#5
20:22, 8 окт. 2019

> Э... А как "тянуть за макушку"? Я умею весь обьект тянуть но не его части.
В PhysX должна быть возможность указать точку приложения силы - addForceAtPos или типа того.

#6
22:46, 8 окт. 2019

SunnyBunny
Add? Тоесть оно будет накапливаться?

#7
2:56, 9 окт. 2019

прикладывай к телу угловой момент по формуле

vec3 srcAxis = rigidBody->Transform() * vec3(0, 0, 1);
vec3 dstAxis = vec3(0, 0, 1);
rigidBody->ApplyTorque(c * srcAxis.cross(dstAxis));
здесь первый вектор определяет ось, которую ты хочешь стать вертикальной в локальной системе координат тела, а dstAxis — вертикальная ось в глобальной системе координат.

#8
(Правка: 5:09) 5:07, 9 окт. 2019

Suslik
Если бы это еще было в PhysX нотации - цены бы не было...

rigidbody->transform это видимо PxTransform body->getGlobalPose(). PxTransform содержит две компоненты - позицию и кватернион. Тогда получается умножение кватерниона не вектор это: 
inline vec3 rotate_vector_by_quaternion(vec3 v, vec4 q)
{
  vec3 q3 = vec3(q.x, q.y, q.z);
  float w = q.w;
  return  q3 * (2.0f * dot(q3, v)) + v * (w*w - dot(q3, q3)) + cross(q3, v)*w*2.0;
}
Мне еще одна вещь непонятна - по идее сила вращения должна зависеть от отлконения оси предмета от желаемого положения и при достижение оного должна стать равной нулю. Но в PhysX имеется только функция body->AddTorque, которая накапливает значение вращения. Получается придется давать отрицательный импульс что бы вращение остановить.

#9
16:30, 9 окт. 2019

san
> AddTorque, которая накапливает значение вращения. Получается придется давать отрицательный импульс что бы вращение остановить.

Возможно (не знаток именно PhysX), это действует в пределах итерационного кадра, но посмотрел, там есть и clearTorque.

#10
21:08, 9 окт. 2019

Вобщем вот такой вариант заработал:

PxTransform trans = body->getGlobalPose();
vec3 srcAxis = rotate_vector_by_quaternion(vec3(0, 1, 0), vec4(trans.q.x, trans.q.y, trans.q.z, trans.q.w));
vec3 dstAxis = cross(srcAxis, vec3(0, 1, 0));
PxVec3 torgue = { dstAxis.x, dstAxis.y, dstAxis.z };
body->clearTorque();
body->addTorque(torgue);
Это примерно то, что предлагал Суслик, но с некоторыми правками.

ПрограммированиеФорумФизика