Главная | Форум | Мой профиль | Выход | RSS
Меню сайта
Мини-чат
200
Наш опрос
Расширение спектра деятельности. Тоесть принимать и по возможности помогать не только Ultimate 3D
Всего ответов: 298
Кабинет

Логин:
Пароль:
Поиск
Календарь
«  Март 2024  »
ПнВтСрЧтПтСбВс
    123
45678910
11121314151617
18192021222324
25262728293031
Архив записей
Наши друзья
  • Официальный cайт U3D
  • Лучший сайт по GM
  • Сайт по геймдеву
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Мы рады приветствовать Вас на русскоязычном официальном сайте игрового движка Game Maker+Ultimate3D. Этот сайт создан для всех тех, кто хотел бы своими силами создать хотя бы одну компьютерную 3D игру, но не знает, как это сделать и с чего начать.Вы всегда хотели заняться разработкой компьютерных игр, но не знали как?Тогда вы попали по адресу. Game Maker с Ultimate3D это микс, который позволит делать захватывающие компьютерные игры с неограниченными возможностями. Так же есть форум на котором можно задовать свои вопросы по Ultimate 3D!

    Обнаружение столкновения и ответ столкновения
    Вы когда-либо видели, что кто - то проходит стену? Вероятно нет. В действительности невозможно пройти через твердые поверхности и так как игры обычно пытаются фальсифицировать действительность, это поведение должно быть воспроизведено там. Это - то, почему хорошее обнаружение столкновения и ответ столкновения необходимы. Обнаружение столкновения должно определить, переместились ли объекты через или в препятствия в каждом шаге, и раз так ответ столкновения должен определить положение, в которое объект может двинуться, не входя в препятствия.
    Самый общий ответ столкновения для первого и игры третьего лица делает понижение объектов вдоль стен, если они пытаются двинуться в них. У этого есть преимущество, которое игрок не прекращает перемещать, поскольку он добирается к стене, которая важна, поскольку внезапная остановка может быть очень раздражающей в быстрых играх. С Окончательным трехмерный 2.0 и его луч, прослеживающий базируемое обнаружение столкновения, было очень трудно получить надежное обнаружение столкновения. Это было в основном самой большой слабостью Окончательных трехмерный. Для Окончательного трехмерный 2.1 я полностью перепроектировал всю систему обнаружения столкновения и сделал построенный в системе ответа столкновения. Теперь обнаружение столкновения и ответ столкновения - один из Окончательных 3D's силы. Кредиты на это достижение идут в Kasper Fauerby, кто написал работу <http://www.peroxide.dk/papers/collision/collision.pdf> описание техники, на которой обнаружение столкновения и используемые механизмы ответа столкновения основаны.
    Так как система построена в этом, очень удобно и весьма эффективен, так как не медленный кодекс GML должен быть выполнен. Скользящий ответ столкновения, описанный выше, может быть осуществлен в пяти линиях кодекса. Вы просто устанавливаете все объекты, которые должны быть проверены функциями обнаружения столкновения на тело через Окончательную трехмерную функцию и вызвать одну функцию для объектов, которые должны выполнить обнаружение столкновения и ответ столкновения. Тогда Вы сделаны.


    Обнаружение столкновения, основанное на эллипсоидах
    Прежде, чем мы сможем добраться до этой волшебной функции, которая решает все Ваши проблемы (по крайней мере связанные со столкновениями), мы должны сделать некоторую теорию. Первое необходимое рассмотрение, какая форма может использоваться для хорошего ответа столкновения. У этого не должно быть никаких углов, чтобы избежать, чтобы это могло висеть где-нибудь, это должно быть достаточно универсально, чтобы содержать объекты с совсем другими формами, и должно быть легко описать. Очевидный выбор - эллипсоид (чешуйчатая сфера). Таким образом мы больше не должны думать об обнаружении столкновения для движущихся моделей характера, мы только должны думать об обнаружении столкновения для движущихся эллипсоидов. Следующая иллюстрация показывает эллипсоид.
     
    Игры обычно - базируемая структура, и поэтому объекты действительно не перемещаются непрерывный, они спрыгивают с одного положения другому в каждом шаге. В одном шаге объект, возможно, не сталкивается ни с чем, и в следующем шаге это может уже быть в геометрии. Следующая иллюстрация демонстрирует это.
     
    Недостаточно проверить, пересечена ли зеленая область, недостаточно проверить, пересечена ли желтая область, и этого недостаточно, чтобы проверить, пересечена ли красная область. Все эти области должны быть проверены. Таким образом форма, для которой столкновения фактически должны быть обнаружены, не является эллипсоидом, а так называемым охваченным эллипсоидом. Охваченный эллипсоид составлен из двух эллипсоидов и чешуйчатого цилиндра, соединяющего их. Это - форма Окончательные трехмерные работы с. Это должно быть достаточным количеством теории пока.

    Следующая функция выполняет тест пересечения между данной геометрией и данным охваченным эллипсоидом и возвращается, было ли столкновение обнаружено (истинное) или не (ложное).
    CheckSweptEllipsoidIntersection (
    ObjectID,
    StartX, StartY, StartZ,
    DestinationX, DestinationY, DestinationZ,
    RotX,RotY,RotZ,ScalingX,ScalingY,ScalingZ,
    RoomIndex)
    ObjectID
    Удостоверение личности объекта, для которого Вы хотите выполнить обнаружение столкновения. Это может быть удостоверением личности модели, ландшафта или примитивного объекта или ключевого слова все. В последнем случае будут проверены все объекты, которые установлены в тело через SetObjectSolidity (Collision.htm (...)) и находятся в правильной комнате. Кроме того все объекты, которые установлены в глобально твердый через SetObjectSolidity (Collision.htm (...)), будут проверены тогда, независимо от того в какой комнате они находятся.
    StartX, StartY, StartZ
    Положение начала охваченного эллипсоида (см. иллюстрацию выше).
    DestinationX, DestinationY, DestinationZ
    Положение предназначения охваченного эллипсоида (см. иллюстрацию выше). Эти параметры могут равняться StartX/Y/Z. В этом случае Окончательный трехмерный выполнит менее вычислительное время интенсивный неохваченный эллиптический тест пересечения.
    RotX, RotY, RotZ, ScalingX, ScalingY, ScalingZ
    Вращение и вычисление эллипсоида. Эллипсоид - сфера единицы (сфера с радиусом один) измеренный ScalingX/Y/Z и вращаемый RotX/Y/Z.
    RoomIndex
    Этот параметр только относится к делу, если все определено как первый параметр. Если это будут отрицательные объекты во всех комнатах, то будет проверен. Иначе только объекты, которые находятся в комнате с данным индексом и глобально твердыми объектами, будут проверены (см. SetObjectRoom (Performance.htm (...))).
    Только знание, что столкновение произошло, весьма бесполезно все же. Больше информации необходимо, чтобы быть в состоянии ответить на столкновение (в случае, если Вы не используете построенный в ответе столкновения). По этой причине есть несколько функций, которые возвращают релевантную информацию о произошедших столкновениях. Все эти функции возвращают информацию о результатах последнего звонка CheckSweptEllipsoidIntersection (Collision.htm (...)).

    Эта функция возвращает число треугольников, которые были пересечены охваченным эллипсоидом, определенным в последнем звонке CheckSweptEllipsoidIntersection (Collision.htm (...)).
    GetTriangleIntersectionCount ()


    Эта функция возвращает время, в которое данный пересеченный треугольник был пересечен охваченным эллипсоидом, определенным в последнем звонке CheckSweptEllipsoidIntersection (Collision.htm (...)). Возвращаемое значение находится в диапазоне от 0.0 до 1.0, где 0.0 обращается ко времени, в которое эллипсоид был в положении начала охваченной сферы единицы, и 1.0 обращается ко времени, в которое это было в положении предназначения.
    GetIntersectionTime (
    IntersectedTriangleIndex)
    IntersectedTriangleIndex
    Индекс пересеченного треугольника, для которого Вы хотите к восстановить время пересечения. Это - целочисленное значение в диапазоне от 0 до GetTriangleIntersectionCount <Collision.htm> ()-1.


    Эта функция производит положение, в котором охваченный эллипсоид, определенный в последнем звонке CheckSweptEllipsoidIntersection (Collision.htm (...)), сначала пересек данный пересеченный треугольник.
    GetIntersectionPosition (
    OutputVectorID,
    IntersectedTriangleIndex)
    OutputVectorID
    См. описание в главе о математических функциях <Math.htm>.
    IntersectedTriangleIndex
    Индекс пересеченного треугольника (см. описание GetIntersectionTime (Collision.htm (...)) для большего количества деталей).


    Эта функция производит нормальный из данного пересеченного треугольника. Нормальным из треугольника является нормализованный вектор, который находится перпендикуляр треугольнику и указывает далеко от его передней стороны.
    GetIntersectedTriangleNormal (
    OutputVectorID,
    IntersectedTriangleIndex)
    OutputVectorID
    См. описание в главе о математических функциях <Math.htm>.
    IntersectedTriangleIndex
    Индекс пересеченного треугольника (см. описание GetIntersectionTime (Collision.htm (...)) для большего количества деталей).


    Эта функция производит нормальный из данного пересеченного треугольника, умноженного фактором так, чтобы эллипсоид оставил треугольник, если возвращенный вектор добавлен к его положению предназначения. Это может использоваться для очень простого ответа столкновения, но он потерпит неудачу быстро, если многократные треугольники будут вовлечены в столкновение.
    GetPushAwayVector (
    OutputVectorID,
    IntersectedTriangleIndex)
    OutputVectorID
    См. описание в главе о математических функциях <Math.htm>.
    IntersectedTriangleIndex
    Индекс пересеченного треугольника (см. описание GetIntersectionTime (Collision.htm (...)) для большего количества деталей).
    С этими функциями Вы можете программировать таможенный ответ столкновения. Например Вы можете заставить объекты прийти в норму, если они сталкиваются кое с чем, или Вы можете исказить их зависящий от того, как они столкнулись. Так или иначе эти механизмы ответа столкновения обычно не, что требуется. Самый общий механизм ответа столкновения все еще - тот со скольжением. И это - то, до которого мы доберемся теперь. Поскольку я уже сказал, что только одна функция необходима для этого. Это делает все обнаружение столкновения и ответ автоматически. Здесь это.

    Эта функция проверяет, сталкивается ли данный эллипсоид с данным объектом (ами), продвигающимся от положения начала до положения предназначения. Если это не сталкивается вектор, который произведен, равняется положению предназначения, иначе свободное положение, в которое может двинуться эллипсоид, произведено.
    AttemptMoveToPosition (
    OutputVectorID,
    ObjectID,
    StartX, StartY, StartZ,
    DestinationX, DestinationY, DestinationZ,
    RotX,RotY,RotZ,ScalingX,ScalingY,ScalingZ,
    RoomIndex)
    OutputVectorID
    См. описание в главе о математических функциях <Math.htm>.
    ObjectID, StartX, StartY, StartZ, DestinationX, DestinationY, DestinationZ, RotX, RotY, RotZ, ScalingX, ScalingY, ScalingZ, RoomIndex
    См. описание CheckSweptEllipsoidIntersection (Collision.htm (...)).
    Для примера о том, как использовать эту функцию см. кодекс в случае шага объекта характера в примере столкновения <http://u3d.xinto.net/?Categorie=Downloads&SubCategorie=Examples&Style=Classic> на Окончательном 3D.org. Конечно еще одна функция должна быть объяснена здесь. Это уже было упомянуто выше, и это действительно просто, хотя вот объяснение.

    Эта функция изменяет государство основательности модели, примитивный или ландшафт возражают, что этим называют.
    SetObjectSolidity (
    SolidityState,
    GlobalSolidityState)
    SolidityState
    Новое государство основательности, которое должно быть настроено. Это может быть верно, чтобы достигнуть этого, объект будет проверен, если все будет определено как параметр для ObjectID и если RoomIndex соответствует индексу комнаты этого объекта в звонке CheckSweptEllipsoidIntersection (Collision.htm (...)), AttemptMoveToPosition (Collision.htm (...)) или CheckRayIntersection (Collision.htm (...)). Это может обмануть досягаемость, что объект не будет проверен, если все будет определено как параметр для ObjectID.
    GlobalSoliditySate
    Новое глобальное государство основательности, которое должно быть настроено. Это может быть верно, чтобы достигнуть этого, объект будет всегда проверяться, если все будет определено для ObjectID или ложное, чтобы достигнуть этого, то это не будет проверено в этом случае. Различие между SolidityState и GlobalSolidityState - то, что GlobalSolidityState независим от параметра RoomIndex. Используя это имеет смысл для объектов, которые находятся в комнатах, которые используют принужденную видимость, как двери (см. SetRoomVisibilityEnforcement (Performance.htm (...))).
    Эта функция, объединенная с портальным двигателем (в особенности с SetObjectRoom (Performance.htm (...))), предлагает очень удобный и эффективный способ определить, какие объекты должны быть расценены автоматическим обнаружением столкновения. Вы можете использовать это так, чтобы объекты выполнили обнаружение столкновения всегда только для объектов, которые находятся в той же самой комнате и для объектов, которые являются между комнатами, как двери (тем можно было настроить глобальную основательность). Это делает обнаружение столкновения очень эффективным.


    Рассмотрение луча
    Другой метод, который важен для обнаружения столкновения, является рассмотрением луча или быть более точным тест пересечения петли луча. Луч, прослеживающий тесты, проверяет, пересекает ли данный луч часть геометрии. Это например, полезно, если Вы хотите проверить, указывает ли оружие на некоторый объект, чтобы узнать то, что поражено, когда оружие запущено. Дать Вам лучшее понимание того, какое средство рассмотрения луча здесь - более полное объяснение.
    Предположите, что у Вас есть луч. Если Вы не помните это от математики в школе, луч - прямая линия, которая начинается однажды и бесконечно длинна. Хороший способ вообразить это является лазерным указателем. Положение, в котором лазерный указатель, является происхождением луча, и лазерный указатель испускает бесконечно длинный луч (в теории). Если Вы будете использовать лазерный указатель, чтобы указать на некоторый объект, то Вы будете видеть маленькую точку в положении, где луч встречает объект. Это - интересное место. Следующая графика иллюстрирует это.
     
    Тест пересечения петли луча использует математический метод, чтобы проверить, пересекает ли данный луч треугольники данного объекта. Раз так это вычисляет положение, в котором луч сначала пересекает объект (синяя точка на иллюстрации). Функция рассмотрения луча очень подобна CheckSweptEllipsoidIntersection (Collision.htm (...)), но так как лучи легче описать чем охваченные эллипсоиды, это значительно более просто.

    Эта функция проверяет, пересекает ли данный луч геометрию данного объекта (ов). Раз так это возвращает расстояние от происхождения луча до самого близкого положения пересечения, иначе это возвращается 100 000.
    CheckRayIntersection (
    ObjectID,
    RayOriginX, RayOriginY, RayOriginZ,
    RayDirectionLongitude,RayDirectionLatitude,
    RoomIndex)
    ObjectID
    См. описание CheckSweptEllipsoidIntersection (Collision.htm (...)).
    RayOriginX, RayOriginY, RayOriginZ
    Происхождение луча.
    RayDirectionLongitude, RayDirectionLatitude
    Руководство луча. Чтобы получить больше информации об этих двух параметрах взглянули на описание Движения функции (Start.htm (...)).
    RoomIndex
    См. описание CheckSweptEllipsoidIntersection (Collision.htm (...)).
    Снова есть некоторые функции, чтобы получить больше информации о пересеченном треугольнике.

    Эта функция производит нормальный вектор треугольника, который был пересечен лучом, определенным в последнем звонке CheckRayIntersection (Collision.htm (...)). Нормальным из треугольника является нормализованный вектор, который находится перпендикуляр треугольнику и указывает далеко от его передней стороны.
    GetRayTracingNormal (
    OutputVectorID)
    OutputVectorID
    См. описание в главе о математических функциях <Math.htm>.


    Эта функция возвращает индекс материала, который используется треугольником, пересеченным в последнем звонке CheckRayIntersection (Collision.htm (...)), который использовал образцовый объект как параметр для ObjectID.
    GetIntersectedMaterialIndex ()
    Используя эти функции Вы можете узнать больше об окружении объекта. Например Вы можете послать луч прямо вниз от бедра характера, чтобы узнать, как далеко основание далеко. Тогда Вы можете использовать GetRayTracingNormal (Collision.htm (...)), чтобы узнать, насколько сильный наклон основания в этом положении. И после этого Вы можете использовать GetIntersectedMaterialIndex <Collision.htm> (), чтобы узнать, стоит ли характер на металле или на траве.


    Школа Ultimate3D 2009-2010 год