Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2012, 21:49   #1
jetei
Пользователь
 
Регистрация: 29.08.2011
Сообщений: 24
Вопрос Как просчитать столкновение сферы и линии??

Привет всем, вот искал в инете статьи по теме столкновение, нашел только сфера со сферой(на делфе), но мне надо код столкновения сферы и линии, а это не нашел..
Можно собственно примерчик?
Заранее спосиб.
jetei вне форума Ответить с цитированием
Старый 08.03.2012, 23:05   #2
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Как я себе представляю надо найти перпендикуляр к линии, проходящий через центр сферы. Если он больше радиуса, то сфера и прямая не пересекаются. Если очень надо могу вспомнить как найти перпендикуляр (такие задачки решали в прошлом семестре).
Вадим Буренков вне форума Ответить с цитированием
Старый 09.03.2012, 00:05   #3
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Решите систему из 2 уравнений. Если решение есть, то объекты пересекаются. Это алгебра 7 класс...

Последний раз редактировалось Виталий Желтяков; 09.03.2012 в 00:09.
Виталий Желтяков вне форума Ответить с цитированием
Старый 09.03.2012, 17:55   #4
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

В идеале нужно искать глубину проникновения капсулы образованной окружностью(в виду дискретности времени), но если пролет сквозь стену при очень больших скоростях и тормозах(dt велик) не страшен, то можно делать проверку в текущей позиции(т.е. окружности), а не размазывать её по всему интервалу времени dt.

Примечание ко второй странице:
Тут я выразил t2 и t1.
Если t1 лежит в пределах [0,1] то точка пересечения нормали проходящей через центр окружности(центр координат) находится на отрезке. Дальше останется только подставить это значение в первую систему и вычислить координаты точки пересечения, а потом расстояние от этой точки до центра координат, и если оно меньше радиуса окружности(r), то отрезок проник внутрь круга и имеет 2 точки пересечения с окружностью, а если ровно радиусу, то они касаются друг друга.

На первой странице показано как можно найти точки пересечения окружности и отрезка.

Если центр окружности находится не в центре, то нужно его туда сдвинуть. Нужно просто вычесть из все координат которые имеются на входе координаты центра окружности, а по завершению прибавить их к ответу. В общем двигаем систему координат так как нам удобно.
Изображения
Тип файла: jpg 09032012647.jpg (116.3 Кб, 166 просмотров)
Тип файла: jpg 09032012648.jpg (117.0 Кб, 140 просмотров)

Последний раз редактировалось Kostia; 09.03.2012 в 18:08.
Kostia вне форума Ответить с цитированием
Старый 09.03.2012, 22:23   #5
jetei
Пользователь
 
Регистрация: 29.08.2011
Сообщений: 24
По умолчанию

Что то не выходит((
Код:
     function cline(X, Y, Z, Xline ,Yline , Zline ,Xline1 ,Yline1 , Zline1 : single
 ) : boolean;
 var
   XD,
  YD,
  ZD,
  Distance : single;
    XD1,
  YD1,
  ZD1,
  Distance1,
    XD2,
  YD2,
  ZD2,
  Distance3 : single;
 begin
   XD2 := abs(Xline-Xline1);
  YD2 := abs(Yline-Yline1);
  ZD2 := abs(Zline-Zline1);

 Distance3 := sqrt(XD2*XD2+YD2*YD2+ZD2*ZD2);


  XD := abs(X-Xline);
  YD := abs(Y-Yline);
  ZD := abs(Z-Zline);
  Distance := sqrt(XD*XD+YD*YD+ZD*ZD);


    XD1 := abs(X-Xline1);
  YD1 := abs(X-Xline1);
  ZD1 := abs(X-Xline1);
  Distance1 := sqrt(XD1*XD1+YD1*YD1+ZD1*ZD1);

  if (distance+distance1) < distance3 then result:= true
  else result:= false;


end;
Столкновение идет сферой...
X, Y, Z - координаты перса
xline, yline, zline, xline1, yline1, zline1 -векторы линии
distance, distance1 - расстояние перса к точкам
а distance3 -расстояние между точками.
Изображения
Тип файла: bmp Безымянный.bmp (11.5 Кб, 143 просмотров)
jetei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в OpenGL сделать свет (прожектор) исходящий от объекта (сферы) Mindzor Общие вопросы C/C++ 3 19.09.2010 14:25
Как сделать столкновение объекта с формой yakimchukav Помощь студентам 2 23.09.2009 19:31
Как просчитать хэш файла? ArtUrlWWW Общие вопросы .NET 1 27.05.2009 16:06
[Delphi] Как предотвратить столкновение обьектов Kolhan Помощь студентам 2 03.05.2009 14:17