#bevy #physics #gamedev #physics-simulation #xpbd

bevy_xpbd_3d_parenting

允许bevy_xpbd_3d RigidBody的子节点对其父节点施加力

3个不稳定版本

0.2.2 2024年2月25日
0.2.1 2024年2月25日
0.2.0 2024年2月25日
0.1.1 2024年1月22日
0.1.0 2024年1月13日

350模拟

Download history 10/week @ 2024-03-09 2/week @ 2024-03-16 42/week @ 2024-03-30 10/week @ 2024-04-06

每月下载 60

MIT/Apache

38KB
184

bevy_xpbd_3d_parenting

允许bevy_xpbd_3d RigidBody的子节点对其父节点施加力。

安装

# Use the latest release of bevy_xpbd_3d_parenting
[dependencies.bevy_xpbd_3d_parenting]
version = "0.2"
default-features = false

理论使用方法

此库导出一个单独的PluginParentingPlugin,必须与bevy_xpbd_3dPhysicsPlugin相同的Schedule添加到应用程序中。

然后,任何修改这些InternalForce的系统应该在

bevy_xpbd_3d_parenting::ParentingSystemSet::ManuallyClearForces;

父节点必须具有

  • RigidBody
    • RigidBody::Dynamic或什么都不会移动
    • Collider以使bevy_xpbd正常工作
  • ExternalForce 持久性设置为false(如果未遵守,将使用tracing发出警告)
  • TransformBundle用于空间中的位置
    • 变换
    • 全局变换

子节点必须具有

  • RigidBody,参见父节点
  • TransformBundle,参见父节点
  • InternalForce以对父节点施加力

内部力的类型

内部力有两种类型,InternalForce::GlobalInternalForce::Local。局部InternalForce在父节点的局部空间中,而全局InternalForce在全局空间中。这意味着局部InternalForce将随父节点旋转,而全局InternalForce则不会。

查看global_versus_local示例以进行演示。

快速使用示例

查看示例以获取完整示例。

// Shows a basic usage of [InternalForce].

use bevy::prelude::*;
use bevy_xpbd_3d::prelude::*;
use bevy_xpbd_3d_parenting::InternalForce;

fn main() {
	App::new()
		.add_plugins((
			DefaultPlugins,
			PhysicsPlugins::new(Update),
			bevy_xpbd_3d_parenting::prelude::ParentingPlugin::new(Update),
		))
		.add_systems(Startup, setup)
		.run();
}

fn setup(
	mut commands: Commands,
	mut meshs: ResMut<Assets<Mesh>>,
	mut materials: ResMut<Assets<StandardMaterial>>,
) {
	// cube
	let mut cube = commands.spawn((
		PbrBundle {
			mesh: meshs.add(Mesh::from(Cuboid::default())),
			transform: Transform::from_xyz(0., 5., 0.),
			..default()
		},
		RigidBody::Dynamic,
		// IMPORTANT: parent's external force must be non-persistent
		// so that each frame this library can update it
		ExternalForce::ZERO.with_persistence(false),
		// Exact collider is arbitrary
		Collider::capsule(1.0, 1.0),
	));

	// sphere child: using internal force
	cube.with_children(|cube| {
		cube.spawn((
			PbrBundle {
				mesh: meshs.add(Mesh::from(Sphere::new(0.5).mesh().uv(16, 32))),
				// to the right a bit
				transform: Transform::from_xyz(3.0, 0.0, 0.0),
				..default()
			},
			// no rigidbody
			// no external force
			// internal force pushes downwards, which should rotate clockwise
			InternalForce::new_local(Vec3::new(0., -3., 0.)),
		));
	});
}

运行示例

运行

cargo r --example rotating --features bevy_xpbd_3d/async-collider
cargo r --example global_versus_local --features bevy_xpbd_3d/async-collider

兼容性表格

Bevy Bevy XPBD Bevy XPBD 3D Parenting
0.12 0.3.3 0.1.0
0.13 0.4.2 0.2.0

开发笔记

cargo t 用于测试,它运行

  • 每个功能标志的所有组合
  • 多种 proptest

依赖项

~50–87MB
~1.5M SLoC