Эта статья документации для всего, что использует платформу Source. Нажмите для получения дополнительной информации.

Виртуальная физика VPhysics

From Valve Developer Community
< Ru
Jump to navigation Jump to search
English (en)Русский (ru)中文 (zh)Translate (Translate)

VPhysics - это встроенный в Source Source алгоритм имитации физики в виртуальном трёхмерном пространстве. С применением VPhysics объекты реалистично движутся и сталкиваются благодаря имитации массы, силы тяжести, трения, сопротивления воздуха, инерции и плавучести.

VPhysics был создан на основе Ipion Virtual Physics, вспомогательного программного обеспечения для имитации физики, приобретённого и впоследствии лицензированного компанией Havok(en) (позже приобретенной Microsoft). Преемником VPhysics на Source 2 Source 2 является Rubikon(en).

Icon-Bug.pngБаг:All games on Версия платформы Left 4 Dead and later, as well as Team Fortress 2 branch(en) and Garry's Mod (x86_64 beta branch only, which backported changes from CS:GO VPhysics) ships with more optimized VPhysics(en) (used in all Source games since Left 4 Dead), compiled using floats(en) instead of doubles, which was meant to improve performance on console (Xbox 360 and PlayStation 3) and lower end hardware, as well to reduce network prediction errors(en) and servers CPU usage. However, this leads to unreliable collision detection due to reduced physics precision. This means in some cases props and other physics objects will briefly glitch through map object, other props or other physics objects. See issue #7426 on GitHub. This issue has been quietly fixed in Team Fortress 2 since December 23, 2025, but remains present in other affected Source games (and rest of Team Fortress 2 branch games).  (подтверждено в: All games on Ветвь Team Fortress 2, Left 4 Dead, Left 4 Dead 2, Portal 2, Counter-Strike: Global Offensive)

Габариты столкновений

Сочленённый габарит столкновений модели Доктора Брина(en).

Объекты VPhysics ("габариты столкновений") невидимы, поскольку для эффективной работы алгоритма имитации они должны быть предельно простыми. Предполагается, что видимая часть объекта будет точно соответствовать форме объекта VPhysics, но алгоритм имитации полностью игнорирует её.

Габариты столкновений обычно загружаются из габаритов столкновений(en), встроенных в используемую объектом модель(en), но они также могут быть сгенерированы, например, из ограничивающего короба(en). Можно создать и сферические габариты столкновений(en).

Tip.pngСовет: Вы можете посмотреть сетки габаритов столкновений с помощью команды управления(en) vcollide_wireframe 1.

Игровая физика QPhysics

VPhysics применяется совместно с QPhysics (историческое название - упоминается в коде как "игровая физика"), более старым и гораздо менее сложным алгоритмом имитации, который Source унаследовал от Quake II Quake II. QPhysics по-прежнему используется для персонажей игрока и ходячих НИП, поскольку полноценная имитация виртуальной физики привела бы к ситуациям, слишком сложным для обработки ИИ или персонажей игроков. Однако транспортные средства(en) и летающие НИП, такие как npc_manhack(en), используют VPhysics. Большинство перемещающихся объёмных объектов (func_rotating(en), func_movelinear(en), func_tracktrain(en) и т.д.) также используют QPhysics для движений.

Объекты QPhysics получают цифровую "тень" VPhysics, которая позволяет им ограниченно взаимодействовать с физическими объектами VPhysics. Они могут перемещать физические объекты и служить опорой для физических ограничений(en), но на них нельзя воздействовать со стороны физики. Некоторые объёмные объекты могут быть временно заблокированы физическими объектами.

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

Программирование

Для целей программирования, VPhysics - это библиотека платформы, которая непосредственно управляет движением объекта. Когда она действует полностью, функции позиционирования QPhysics перестают оказывать какое-либо воздействие, и поведение объекта фактически определяют применённые силы(en) и физические ограничения(en) (хотя прямое изменение также возможно).

Например функция создания Spawn()(en) создает физически-имитируемую модель:

#define MODEL "models/props_c17/FurnitureDresser001a.mdl"

void CMyEnt::Spawn()
{
	PrecacheModel(MODEL);
	SetModel(MODEL);

	VPhysicsInitNormal(SOLID_VPHYSICS,0,false);
}

Существуют следующие функции определения:

VPhysicsInitNormal()
Превращает объект в свободный объект VPhysics с полной имитацией и столкновениями. (использована в примере)
VPhysicsInitStatic()
Объект, который никогда не перемещается.
VPhysicsInitShadow( bool allowPhysicsMovement, bool allowPhysicsRotation, solid_t *pSolid = 0 )
Объект, который сталкивается с другими объектами VPhysics, но его местоположение определяется QPhysics движением его объекта мира. Это может привести к возникновению очень большого усилия, действующего на обычные объекты VPhysics, поэтому используйте его с осторожностью!

В отличие от VPhysicsInitNormal(), ни одна из указанных выше функций не вызывает SetSolid()(en) неявно. Нужно делать это самостоятельно, поскольку значение по умолчанию SOLID_NONE приводит к преждевременному завершению работы обеих функций.

Note.pngПримечание: Сама функция SetSolid() не включает столкновения в VPhysics.

Единицы измерения

Величина Единица
Расстояние Дюйм
Масса Килограмм
Объём Кубический дюйм [ дюйм3 ]
Скорость Дюйм в секунду [ дюйм/с ]
Ускорение Дюйм на секунду в квадрате [ дюйм/с2 ]
Плотность Килограмм на метр кубический [ дюйм/м3 ]
Сила Дюйм в секунду на килограмм [ дюйм/(с×кг) ]
Момент силы (крутящий момент) Градус в секунду на килограмм [ °/(с×кг) ]

Смотрите также Точка отсчёта(en) и Углы QAngle(en).

Структуры

IPhysicsEnvironment
A VPhysics environment within which objects are simulated. New IPhysicsObjects are created here, and global settings like gravity can be configured.
IPhysicsEnvironment* physenv is created by default. Multiple environments are entirely possible, which is how Portal Portal and Portal 2 Portal 2 work.
IPhysicsObject
The core interface into a VPhysics object. Provides functions for tweaking parameters and applying forces. An entity can have multiple IPhysicsObjects (e.g. ragdolls).
IPhysicsCollision
Provides various CPhysCollide and CPhysConvex (see below) utilities. Use the physcollision global instance.
CPhysCollide
A rigid collision mesh(en). Despite being named like a server entity, this class is defined in the engine. It can be passed to various IPhysicsCollision functions.
vcollide_t
A collection of CPhysCollides.
CPhysConvex
A single, convex collision mesh element.
CPhysPolysoup
A collection of raw polygons that represent a collision mesh. Call physcollision->ConvertPolysoupToCollide() to "compile" it to a CPhysCollide.
solid_t
A collection of data passed to the engine when creating new physics objects.

Смотреть также

Часто используемые физические объекты