| Делфи [13] |
| Game Maker [9] |
| 3D Game Studio [1] |
| Blitz 3D [7] |
| ПХП (PHP) [3] |
| С++ (C#) [7] |
| Остальные [20] |
Введение nwphx.dll - это библиотека, предназначения для симуляции физического взаимодействия жестких тел. Основные характеристики библиотеки: * Жесткие тела с произвольной массой, моментом инерции и центром масс Установка библиотеки состоит из следующих этапов: 1) Загрузка архива NEWTON.ZIP Основные понятия и определения Твердое тело характеризируется следующими постоянными параметрами: и переменными параметрами: * Положение тела в пространстве - координаты x,y,z Твердое тело может быть включено или выключено из обсчета. Выключенные тела, во время шагов симуляции не обрабатываются. Выключение тел это эффективный способ сократить время вычислений в тех случаях, когда точно известно что тела не подвижны или оказывают несущественное влияние на симуляцию. Если пользователь установил позицию/ориентацию одного тела некорректно по отношению к позиции/ориентации другого тела. Механизм уменьшения ошибок в сочленении следующий: во время каждого шага симуляции каждому сочленению прилаживаются специальные силы, чтобы вернуть тела на правильные позиции. Эта сила контролируется параметром уменьшения ошибки(Stiffness) и принимает значение от 0 до 1. Физический мир (World) Физический мир - это контейнер для всех жестких тел и сочленений. Всего может быть создан только один физический мир. phWorldCreate(plane%) Создает физический мир. Эта команда должны быть выполнения до любой другой команды работы с физикой. Если параметр plane% равен 1, то создается горизонтальная плоскость в точке 0,0,0. phWorldSetSize(x1#,y1#,z1#,x2#,y2#,z2#) Устанавливает размер мира. Тела будут обновляться только внутри параллелепипеда от точки (x1,y1,z1) до точки (x2,y2,z2). Не стоит задавать необоснованно большие значения, т.к. это может сказать на скорости симуляции. По умолчанию - от (-10000.0,-10000.0,-10000.0) до (10000.0,10000.0,10000.0). phWorldSetGravity(gx#,gy#,gz#) Устанавливает значение вектора гравитации. Значение по умолчанию - (0, -9.81, 0). Ненулевое значение вектора гравитации означает что ко всем телам будет добавляться сила притяжения, равная произведению массы тела на вектор гравитации. phWorldStep(timestep#) Шаг симуляции.Рассчитывает изменение положения всех тел за время timestep#. Учитываются приложенные силы и возникшие столкновения между телами. Величина переменной timestep# должна лежаит в пределах от 1/60.0 до 1/600.0, в противном случае она будет ограничена этими величинами. phWorldDestroy() Разрушает физический мир, все созданные в нем тела, соединения и материалы. Материалы (Mat) phMatCreate%() Создает новый материал. Возвращает номер созданного материала. phMatSetDefCollidable(IsColl%) Задают значения по умолчанию между всеми материалами (см. следующие функции). phMatSetCollidable(mat1%,mat2%,IsColl%) Устанавливает значения параметров материалов. mat1% и mat2% - номера материалов, между которыми устанавливается параметр. IsColl - определяет, будут ли тела, обладающие данными материалами сталкиваться друг с другом (или проходить друг сквозь друга) stFric, dynFric - значения статического и динамического коэффициентов трения. Допустимый интревал значений - (0.0, 2.0); рекомедуемый - (0.0, 1.0). Статический коэффициент должен быть больше динамического. elas# - коэффициент упругости (0 - абсолютно неупругое столкновение, 1 - абсолютно упругое). soft# - жесткость столкновения. Твердые тела (Body) phBodyCreateNull%(mass#) Создает тело, не имеющее геометрии (и поэтому не сталкивающееся ни с чем) с массой mass и приведенным моментом инерции (1.0,1.0,1.0). Возвращает идентификатор тела. phBodyCreateBox%(dx#,dy#,dz#,mass#) Создает тело с геометрией прямоугольного параллелепипеда с размерами dx,dy,dz и массой mass. Возвращает идентификатор тела. phBodyCreateSphere%(rx#,ry#,rz#,mass#) Создает тело с геометрией эллипсоида с полуосями rx,ry,rz и массой mass. Возвращает идентификатор тела. phBodyCreateCyl%(r#,h#,mass#) Создает тело с геометрией цилиндра радиусом r, высотой h, массой mass. Возвращает идентификатор тела. phBodyCreateCone%(r#,h#,mass#) Создает тело с геометрией конуса с радиусом основания r, высотой h и массой mass. Возвращает идентификатор тела. phBodyDestroy(body%) Удаляет тело с идентификатором body% из физического мира. Дальнейшие попытки обратиться по идентификатору удаленного тела могут привести к падению программы. Создание тел со сложной геометрией phBodyCreateHull%(Vertices*, VertexCount%,mass#) Создает тело с выпуклой геометрией произвольной формы. Выпуклая геометрия задается набором точек из массива Vertices*{x0,y0,z0,x1,y1,z1,x2,...}. Общее число точек задается переменной VertexCount. Построение геометрии по заданный точкам можно наглядно представить следующим образом. Представьте тело, состоящее только из точек, которые сохраняют расстояния друг до друга и не движутся относительно друг друга. Уроним это тело на плоскость и покатаем его по этой плоскости. В каждый момент времени какие-то три точки будут касаться плоскости. Между этими тремя точками создается плоский треугольник. Когда тело прокатится всеми сторонами, мы получим выпуклую геометрию. phBodyCompoundBegin() Эти функции позволяют создать тело с геометрией, составленной из выпуклых форм. Перед началом создания тела необходимо вызвать функцию phBodyCompoundBegin(). Добавление выпуклой геометрии к телу происходит с помощью phBodyCompoundAddHull(Vertices*, VertexCount%), аналогично созданию выпуклой геометрии. Наконец, функция phBodyCompoundEnd(mass#) завершает построение тела, задает ему массу mass#, рассчитывает значения моментов инерции и положения центра масс. Эта функция возвращает идентификатор созданного тела. Положение тела в пространстве. Позиция и ориентация. Положение тела в пространстве задается координатами x,y,z точки привязки тела (точки 0,0,0 в локальной системе) и тремя углами поворота pitch,yaw,roll. При создании тела все эти величины устанавливаются в 0, поэтому после создания необходимо расположить тела в нужных метсах. Не рекомендуется использовать команды установки координат и углов тела во время симуляции (за исключением, конечно же, создания новых тел). Ну а функции, возвращающие координаты и углы поворота, используются постоянно для синхронизации положения трехмерного объекта и соответсвующего ему физического тела. phBodyGetX#(body%) Эти функции возвращают координаты тела. phBodySetPos(body%,x#,y#,z#) Устанавливает координаты тела. phBodyGetPitch#(body%) Возвращают углы поворота тела. phBodySetRot(body%,pitch#,yaw#,roll#) Устанавливает углы поворота тела. Скорости тела. Кроме положения тел, результатом симуляции является также и их скорость. Линейная скорость показывает вектор движения центра масс тела, угловая скорость (omega) - вектор, вокруг которого вращается тело. Установка скоростей телам (за исключением только что созданных тел) не рекомендуется, т.к. может нарушить физическую корректность симуляции. Однако это не настолько критично, как в случае с установкой координат. phBodyGetVelX#(body%) Возвращают линейную скорость тела. phBodySetVel(body%,vx#,vy#,vz#) Устанавливает линейную скорость тела. phBodyGetOmegaX#(body%) Возвращет угловую скорость тела. phBodySetOmega(body%,ox#,oy#,oz#) Устанавливает угловую скорость тела. Воздействия на тела. Единственный корректный с точки зрения физики способ воздействия на симуляцию жесктих тел - это приложение к ним сил и моментов вращения. Следующие функции предоставляют основные возможности для приложения сил и моментов вращения. phBodyAddForce(body%,fx#,fy#,fz#) Добавляет к силу (fx,fy,fz) к центру масс тела. Компоненты силы (fx,fy,fz) считаются в глобальной системе координат. phBodyAddRelForce(body%,fx#,fy#,fz#) Добавляет к силу (fx,fy,fz) к центру масс тела. Компоненты силы (fx,fy,fz) считаются в локальной системе координат, связанном с телом. phBodyAddForceAtPos(body%,fx#,fy#,fz#,x#,y#,z#) Прикладывает к телу силу (fx,fy,fz) в точке (x,y,z). Компоненты силы и координаты точки приложения считаются в глобальной системе координат. phBodyAddRelForceAtRelPos(body%,fx#,fy#,fz#,x#,y#,z#) Прикладывает к телу силу (fx,fy,fz) в точке (x,y,z). Компоненты силы и координаты точки приложения считаются в локальной системе координат, связанной с телом. phBodyAddImpulse(body%,x#,y#,z#,vx#,vy#,vz#) Передает телу импульс. В результате применения этой команды скорость точки (x,y,z) изменится на (vx,vy,vz). Компоненты вектора изменения скорости (vx,vy,vz) и координаты точки приложения импульса (x,y,z) считаются в глобальной системе координат. Эквивалентом этой команды может быть phBodyAddForceAtPos(body,x,y,z,vx*mass/timestep,vy*mass/timestep,vz*mass/timestep), где mass - масса тела, а timestep - текущий шаг времени. phBodyAddTorque(body%,tx#,ty#,tz#) Прикладывает к телу момент импульса. Компоненты момента импульса считаются в глобальной системе отсчета. phBodyAddRelTorque(body%,tx#,ty#,tz#) Прикладывает к телу момент импульса. Компоненты момента импульса считаются в локальной системе отсчета, связанной с телом. Операции с массой и объемом. Масса тела и ее распределение по телу - главный статический параметр тела. При приложении сил к центру инерции тела, результат зависит только от массы тела, но если сила прикладывается не к центру масс, то на результат влияет и распределение масс. Распределение масс задается значениями моментов инерции вокруг локальных осей x,y,z тела. Аналогично тому, как значение массы показывает, наскольку трудно разгонять тело, момент инерции относительно какой-то оси показывает, насколько трудно тело раскручивать вокруг этой оси. Если рассмотреть два цилиндра одинаковой массы, но с разным радиусом, то цилиндр с большим радиусом будет иметь больший момент инерции вокрус оси цилиндра, т.к. "толстый" цилиндр труднее раскручивать, чем "тонкий". phBodySetMass(body%,mass#) Устанавливает массу тела. Моменты инерции вдоль каждой оси изменяются пропорционально, т.е. приведенный момент инерции (момент инерции, деленный на массу тела) остается постоянным. phBodySetMassMatrix(body%,mass#,Ixx#,Iyy#,Izz#) Устанавливает матрицу инерции тела (набор чисел, включающий массу тела и моменты инерции относительно осей x,y,z. Моменты инерции считаются относительно осей локальной системы отсчета тела. phBodyGetMass#(body%) Эти функции возвращают значения массы и моментов инерции тела относительно локальный осей x,y,z тела. phBodySetMassCentre(body%,x#,y#,z#) Задает положение центра масс тела. Координаты центра масс считаются в локальной системе координат тела. Значение по умолчанию (0,0,0). phBodyGetMassCentreX#(body%) Возвращают координаты центра масс тела в локальной системе отсчета. phBodyGetVolume#(body%) Возвращает объем тела. Включение и выключение тел. Следующие команды позволяют управлять состоянием тела (включено/выключено). phBodySetSleep(body%,state%) Устанавливает состояние тела. Если state=1, то тело переводится в выключенное состояние, если state=0, то тело включается. phBodyGetSleep%(body%) Возвращает сотояние тела. Если возвращаемое значение равно 1, то тело выключено, если 0 - включено. phBodySetAutoSleep(body%,state%) Определяет возможность автовыключения тела. Если state=1, то тело будет само выключаться при достижении предельно маленьких значений скорости, если state=0, то состояние тела не будет самопроизвольно меняться. phBodySetAutoSleepTreshold(body%,vel#,omega#,frames%) Задает предельные значения скоростей тела для автовыключения. Тело выключится, если в течение frames тактов значение его линейной скорости будет меньше vel#, а значение уголовой - меньше omega#. Информация о столкновениях. На каждой шаге для каждого тела заполняется информация обо всех столкновениях(контактах) этого тела за этот шаг. Все координаты и компоненты векторов считаются в глобальной системе отсчета. phBodyGetCollNum%(body%) Возвращает число столкновений тела. phBodyGetCollX#(body%,coll%) Возвращает координаты контакта с номером coll. phBodyGetCollNX#(body%,coll%) Возвращает нормаль контакта с номером coll. Нормаль зависит от геометрий сталкивающихся тел. phBodyGetCollFX#(body%,coll%) Возвращает силу, возникающую при столкновении с номером coll. Эта сила прикладывается к телу в точке контакта. Значение силы зависит от материалов тел. phBodyGetCollNVel#(body%,coll%) Возвращает нормальную, тангенциальную и бинормальную составляющие скорости контакта с номером coll. Скорость контакта зависит от относительной линейной и угловой скорости тел. Разноообразные функции тела. Устанавливает и возвращает режим гравитации для тела. Если режим mode равен 1, то к телу будет прикладываться сила притяжения, если равен 0, то нет. phBodySetWater(body%,x#,y#,z#,nx#,ny#,nz#,density#,lin_damping#,ang_damping#) Устанавливает плоскость жидкости для тела. Если плоскость тела была установлена, то каждый такт к телу будет прикладываться Архимедова сила, как на погруженное (или частично погруженное) в жидкость, поверхность которой была задана. Функция имеет следующие параметры: body% - тело, для которого устанавливается плоскость жидкости. x#,y#,z# - точка, принадлежащая плоскости жидкости (любая). nx#,ny#,nz# - нормаль к поверхности жидкости. density# - плотность жидкости. lin_damping# - коэффициент гашения линейной скорости в жидкости (из-за вязкости). ang_damping# - аналогично коэффициент гашения угловой скорости. phBodyDisableWater(body%) Отменяет расчет и приложение к телу Архимедовой силы. phBodySetDamping(body%,linear#,angular#) Устанавливает коэффициенты гашения линейной и уголовой скоростей тела. phBodySetContinuousCollisionMode(body%,mode%) Устнавливает и возвращает режим продолжительного столкновения для тела. Этот режим помогает предотвратить проскакивание быстродвижущихся тел. Однако в этом случае обсчет тела может занимать да 40% больше времени, поэтому этот режим рекомендуется устанавливать только быстродвижущимся телам небольших размеров. phBodySetData(body%,data%) Устанавливает и возвращает пользовательские данные для тела. phBodySetEntity(body%,ent%) Устанавливает и возвращает Entity для тела. Если телу установлена entity, то она автоматически будет выставляться в позицию тела. Но - дети (child) этой entity не поменяют своего положения. Статические(неподвижные) тела. Любое подвижное тело можно сделать статическим, если установить ему массу, равную 0. Статический уровень (Level) Уровень - это статическое тело с произвольной геометрией, задаваемой набором треугольников. Для создания такого тела применяются несколько функций. phLevelBuildBegin() Начинает построение уровня. phLevelAddFace(x1#,y1#,z1#,x2#,y2#,z2#,x3#,y3#,z3#) Добавляет треугольник к геометрии уровня. x1#,y1#,z1#,x2#,y2#,z2#,x3#,y3#,z3# - координаты трех вершин треугольника. phLevelBuildEnd%() Завершает построение уровня. Возвращает идентификатор созданного тела. Карта высот (Terrain) Создает тело с геометрией, задаваемой картой высот. Функция имеет следующие параметры nSize% - размер массива карты высот (по одному измерению) CellWidth# - размер квадрата клетки, т.е. расстояние между "столбцами" в карте высот height* - массив размера nSize*nSize, содержащий карту высот | |
| Категория: Blitz 3D | Добавил: MrWolf_ (11.08.2010) | |
| Просмотров: 508 | Рейтинг: 0.0/0 |
| Всего комментариев: 0 | |








Сайт:
Новости:
Скачать:
Дополнительно:
Форум:









