![]() |
Автор | Сообщение |
Hacker Ответственный за CHM Группа: Модераторы Сообщений: 346 |
Добавлено: 23-02-2010 12:23 |
Как правильно должна работать эта функция: DceSetSlideOrBounce? То есть, как надо настроить менеджер DCE, что бы при столкновении с объектом, другой объект (обладающий свойством отталкиваться) отталкивался от него, а не останавливался? Или через DCE сделать это невозможно, но зачем тогда эта функция? Может это стоит через ODE делать? ![]() ![]() P.S при использовании этой функции ничего не меняется, поэтому даже не знаю, что делать... |
|
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 23-02-2010 16:10 |
Мне кажется, необходимо указать параметр упругости: DceSetBounce(object,bounce) Тогда и появится эффект от DceSetSlideOrBounce. Но я не уверен, так как не проверял. |
|
Hacker Ответственный за CHM Группа: Модераторы Сообщений: 346 |
Добавлено: 23-02-2010 16:28 |
Да, параметр упругости влияет на этот эффект, но он там, скажем так, чисто символический. То есть нельзя ни настроить силу с которой объект отталкивается, ничего вообще касательно этого. Отсюда вывод, что эффект не тот, который нужен. Как же все-таки объект "пружинить" от других объектов? А то пока мне ничего в голову не приходит... |
|
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 24-02-2010 09:27 |
Ну, вообще DCE - это не физический движок, там никаких сил нет. Все вычисляется очень приближенно и относительно. К тому же, возможно, на скорость движения при отталкивании влияет параметр трения (DceSetFriction). Теоретически, это отталкивание можно написать вручную. Берем нормаль столкновения, и двигаем объект относительно нее. |
|
Hacker Ответственный за CHM Группа: Модераторы Сообщений: 346 |
Добавлено: 24-02-2010 18:43 |
Ну это и понятно, что не физический, хотя по-проще будет ODE. Например я определяю нормаль столкновения функцией DceGetCollisionNormal, получаю номер столкновения и индекс оси, а дальше-то что, по-сути мне надо направить объект в противоположенную сторону нормали, но я не совсем понимаю, что к чему там. | |
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 25-02-2010 14:07 |
Есть функция ObjectTranslate, она двигает объект локально на заданный вектор. То есть: normal_x=DceGetCollisionNormal(object,0,0); normal_y=DceGetCollisionNormal(object,0,1); normal_z=DceGetCollisionNormal(object,0,2); ObjectTranslate(object,-normal_x*speed,-normal_y*speed,-normal_z*speed); |
|
Hacker Ответственный за CHM Группа: Модераторы Сообщений: 346 |
Добавлено: 25-02-2010 19:05 |
А, спасибо. Как раз осенило. Но так как DCE все же, как оказалось, не совсем меня устраивает, точнее, совсем уже не устраивает, перебраться пришлось в ODE. Возможно, конечно, нужно было создать новую тему, но спрошу здесь, если что потом перенесу. Итак, суть: Есть тело и есть, своего рода, магнит. Он притягивает тело и вне зависимости от своего положения держит тело перед собой, так вот я притягиваю тело таким образом: x1=ObjectGetPosition(models_.box,0); y1=ObjectGetPosition(models_.box,2); z1=ObjectGetPosition(models_.box,1); x2 = ObjectGetPosition(camera_.camera_player,0); y2 = ObjectGetPosition(camera_.camera_player,2); z2 = ObjectGetPosition(camera_.camera_player,1); OdeDynamicAddForce(models_.box,(x2-x1)*5,(y2-y1)*5,(z2-z1)*5); Но тело постоянно вращается вокруг магнита, а нужно, чтобы было перед ним постоянно и я никак не пойму, что можно придумать...может joins использовать для этих целей? |
|
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 26-02-2010 11:57 |
Можно и joints. А если вручную, то предлагаю следующий метод: сила притяжения магнита должна быть приложена вдоль вектора, который направлен от центра объекта к центру магнита. Стало быть, нужно найти этот вектор. Я точно не помню, как он вычисляется исходя из координат объектов, но можно это сделать автоматически: в центр объекта поместить dummycube, и направить его на магнит при помощи ObjectPointToObject, затем получить его единичный вектор direction (ObjectGetDirection). Потом умножить вектор на силу, и пожалуйста: OdeDynamicAddForce(models_.box,vec_x*5,vec_y*5,vec_z*5); |
|
Hacker Ответственный за CHM Группа: Модераторы Сообщений: 346 |
Добавлено: 26-02-2010 12:37 |
Спасибо за идею, попробую. Я, кстати, вспомнил про пример на GMI там нечто подобное, автор вроде Bami, или как его там, так вот там сделано нечто похожее, с тем что я хочу и даже расчет притяжения похож, но сколько бы не ковырялся, так и не понял где и как тело остается в положении перед камерой, а ведь там тоже ode используется ![]() |
![]() |