最后同步日期:2026-04-15 | Godot 官方原文 — Generic6DOFJoint3D
继承链:Node → Node3D → Joint3D → Generic6DOFJoint3D
| 类型 | 名称 | 说明 |
|---|
| 属性 | NodeA | 连接的第一个物体 |
| 属性 | NodeB | 连接的第二个物体 |
| 类型 | 名称 | 说明 |
|---|
| 属性 | Position | 本地位置(X / Y / Z) |
| 属性 | GlobalPosition | 全局位置 |
| 属性 | Rotation | 旋转角度(欧拉角,弧度) |
| 属性 | Scale | 缩放比例 |
| 属性 | TopLevel | 是否脱离父节点的变换 |
| 方法 | LookAt() | 朝向目标点 |
| 方法 | ToGlobal() | 本地坐标转全局坐标 |
| 方法 | ToLocal() | 全局坐标转本地坐标 |
| 方法 | RotateX/Y/Z() | 绕指定轴旋转 |
| 类型 | 名称 | 说明 |
|---|
| 属性 | Name | 节点名称 |
| 属性 | ProcessMode | 处理模式(始终 / 暂停时 / 仅编辑器) |
| 属性 | ProcessPriority | 处理优先级,数字越小越先执行 |
| 信号 | ready | 节点进入场景树并准备就绪 |
| 信号 | tree_entered | 节点进入场景树 |
| 信号 | tree_exited | 节点完全离开场景树 |
| 方法 | GetNode<T>() | 按路径获取子节点 |
| 方法 | AddChild() | 添加子节点 |
| 方法 | RemoveChild() | 移除子节点 |
| 方法 | QueueFree() | 帧结束后释放节点 |
| 方法 | GetParent() | 获取父节点 |
最灵活的 3D 关节。可以对 X/Y/Z 三个轴分别控制平移和旋转(共 6 个自由度),每个自由度都能独立设定限制和弹簧。
"6DOF" 是 "6 Degrees of Freedom"(6 个自由度)的缩写。在 3D 空间中,一个物体有 3 个平移自由度(左右、上下、前后)和 3 个旋转自由度(绕 X/Y/Z 轴旋转),总共 6 个。Generic6DOFJoint3D 让你对这 6 个自由度进行完全独立的控制。
想象一个万向节——它可以在任何方向上旋转,你可以限制每个方向的旋转范围,还可以给每个方向加弹簧。
使用频率:★ 基本用不到——用于复杂的物理连接。
- 复杂的机械结构
- 车辆悬挂系统
- 高级布娃娃物理
- 任何需要精细控制运动的连接
- 车辆悬挂:弹簧 + 阻尼 + 旋转限制
- 机械臂:多关节机器人
- 高级布娃娃:精确控制每个关节
| 搭配节点 | 用途 | 必需? |
|---|
| RigidBody3D(NodeA) | 第一个物体 | 必需 |
| RigidBody3D(NodeB) | 第二个物体 | 必需 |
| 资源 | 类型 | 说明 |
|---|
| 碰撞形状 | Shape3D 资源 | 两个连接物体都需要 |
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|
NodeA | NodePath | "" | Joint3D | 第一个物体 |
NodeB | NodePath | "" | Joint3D | 第二个物体 |
DisableCollision | bool | true | Joint3D | 是否禁用碰撞 |
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|
LinearLimitX/Enable | bool | true | — | 是否启用 X 轴平移限制 |
LinearLimitX/Lower | float | -1.0 | — | X 轴最小平移距离 |
LinearLimitX/Upper | float | 1.0 | — | X 轴最大平移距离 |
LinearLimitY/Enable | bool | true | — | 是否启用 Y 轴平移限制 |
LinearLimitY/Lower | float | -1.0 | — | Y 轴最小平移距离 |
LinearLimitY/Upper | float | 1.0 | — | Y 轴最大平移距离 |
LinearLimitZ/Enable | bool | true | — | 是否启用 Z 轴平移限制 |
LinearLimitZ/Lower | float | -1.0 | — | Z 轴最小平移距离 |
LinearLimitZ/Upper | float | 1.0 | — | Z 轴最大平移距离 |
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|
LinearSpringX/Enable | bool | false | — | 是否启用 X 轴弹簧 |
LinearSpringX/Stiffness | float | 0.0 | — | X 轴弹簧刚度 |
LinearSpringX/Damping | float | 0.0 | — | X 轴弹簧阻尼 |
LinearSpringY/Enable | bool | false | — | Y 轴弹簧(同上) |
LinearSpringZ/Enable | bool | false | — | Z 轴弹簧(同上) |
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|
AngularLimitX/Enable | bool | true | — | 是否启用 X 轴旋转限制 |
AngularLimitX/Lower | float | 0.0 | — | X 轴最小旋转角度 |
AngularLimitX/Upper | float | 0.0 | — | X 轴最大旋转角度 |
AngularLimitY/Enable | bool | true | — | Y 轴旋转限制(同上) |
AngularLimitZ/Enable | bool | true | — | Z 轴旋转限制(同上) |
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|
AngularSpringX/Enable | bool | false | — | 是否启用 X 轴旋转弹簧 |
AngularSpringX/Stiffness | float | 0.0 | — | X 轴旋转弹簧刚度 |
AngularSpringX/Damping | float | 0.0 | — | X 轴旋转弹簧阻尼 |
AngularSpringY/Enable | bool | false | — | Y 轴旋转弹簧(同上) |
AngularSpringZ/Enable | bool | false | — | Z 轴旋转弹簧(同上) |
| 方法 | 返回值 | 说明 |
|---|
GetNodeA() | NodePath | 获取第一个物体路径 |
GetNodeB() | NodePath | 获取第二个物体路径 |
SetParamX(param, value) | void | 设置 X 轴参数 |
SetParamY(param, value) | void | 设置 Y 轴参数 |
SetParamZ(param, value) | void | 设置 Z 轴参数 |
C
using Godot;
/// <summary>
/// 车辆悬挂系统:使用 6DOF 关节模拟
/// </summary>
public partial class CarSuspension : Node3D
{
public override void _Ready()
{
var joint = GetNode<Generic6DOFJoint3D>("Generic6DOFJoint3D");
joint.NodeA = GetNode<RigidBody3D>("CarBody").GetPath();
joint.NodeB = GetNode<RigidBody3D>("Wheel").GetPath();
// ---- 线性轴(上下移动 = 悬挂弹簧) ----
// Y 轴:允许上下移动,带弹簧
joint.Set("linear_limit_y/lower", -0.3f); // 最多下沉 0.3 米
joint.Set("linear_limit_y/upper", 0.1f); // 最多上升 0.1 米
// Y 轴弹簧(模拟悬挂弹簧)
joint.Set("linear_spring_y/enable", true);
joint.Set("linear_spring_y/stiffness", 50.0f);
joint.Set("linear_spring_y/damping", 5.0f);
// X 轴和 Z 轴:锁定(不允许横向移动)
joint.Set("linear_limit_x/lower", 0.0f);
joint.Set("linear_limit_x/upper", 0.0f);
joint.Set("linear_limit_z/lower", 0.0f);
joint.Set("linear_limit_z/upper", 0.0f);
// ---- 角度轴(锁定旋转) ----
joint.Set("angular_limit_x/lower", 0.0f);
joint.Set("angular_limit_x/upper", 0.0f);
joint.Set("angular_limit_y/lower", 0.0f);
joint.Set("angular_limit_y/upper", 0.0f);
joint.Set("angular_limit_z/lower", 0.0f);
joint.Set("angular_limit_z/upper", 0.0f);
}
}
GDScript
# 车辆悬挂系统:使用 6DOF 关节模拟
extends Node3D
func _ready() -> void:
var joint := $Generic6DOFJoint3D
joint.node_a = $CarBody.get_path()
joint.node_b = $Wheel.get_path()
# ---- 线性轴(上下移动 = 悬挂弹簧) ----
# Y 轴:允许上下移动,带弹簧
joint.set("linear_limit_y/lower", -0.3) # 最多下沉 0.3 米
joint.set("linear_limit_y/upper", 0.1) # 最多上升 0.1 米
# Y 轴弹簧(模拟悬挂弹簧)
joint.set("linear_spring_y/enable", true)
joint.set("linear_spring_y/stiffness", 50.0)
joint.set("linear_spring_y/damping", 5.0)
# X 轴和 Z 轴:锁定(不允许横向移动)
joint.set("linear_limit_x/lower", 0.0)
joint.set("linear_limit_x/upper", 0.0)
joint.set("linear_limit_z/lower", 0.0)
joint.set("linear_limit_z/upper", 0.0)
# ---- 角度轴(锁定旋转) ----
joint.set("angular_limit_x/lower", 0.0)
joint.set("angular_limit_x/upper", 0.0)
joint.set("angular_limit_y/lower", 0.0)
joint.set("angular_limit_y/upper", 0.0)
joint.set("angular_limit_z/lower", 0.0)
joint.set("angular_limit_z/upper", 0.0)