Unity使用ConfigurableJoint实现物理拖拽物体

Unity3D学习笔记——物理引擎 Unity3d学习笔记——刚体运动、三维数学一、物理引擎1、刚体1>简介2>属性2、碰撞器1>简介2>分类3>属性4>物理材质5>碰撞条件6>碰撞三阶段3、触发器1>简介2>触发条件3>触发三阶段 一、物理引擎 1、刚体 1>简介 2>属性 2、碰撞器 1>简介 2>分类 3>属性 4>物理材质 用于调整碰撞对象的摩擦力和反弹效果 属性 ----动态摩檫力 Dynamic Friction:移动时摩擦力 阅读详情

我们如何在游戏中实现拖拽物体呢,如果仅仅是让拖拽坐标,可能没有物理效果,这里可以使用Joint来实现。

场景

首先我们在场景中放置道具。
在这里插入图片描述
如图,我们放置一个圆柱体Cylinder,一个Sphere球体,和地面。
圆柱体就是我们要拖动的物体,红色球体是我们点击的位置,白色的地面放置圆柱体掉下去。

我们在圆柱体上增加刚体,球体上也增加刚体,球体的Rig需要勾选运动学,因为Joint组件需要。

我们要实现鼠标点击圆柱体,拖拽,圆柱体跟随鼠标左右上下移动。

我们添加一个脚本CDrag挂在球体上。
在这里插入图片描述
变量HandRig就是球体的刚体。
变量Target就是圆柱体。

鼠标按下

在Update中,我们先写鼠标点击事件。我们要做的事情就是鼠标按下后,我们发射射线检测是否碰到圆柱体,然后把红色的球体移动过去,并且给圆柱体增加ConfigurableJoint,把他们两个联系起来,这样圆柱体就跟随球体了。代码如下:

	void Hand(float x, float y)
    {
        Vector3 at = new Vector3(x, y, myCamera.transform.position.z);
        Ray ray = myCamera.ScreenPointToRay(at);
        RaycastHit hit;
        Debug.DrawRay(ray.origin, ray.direction * 100f, Color.red, 1f);
        bool b = Physics.Raycast(ray, out hit, 100f, 1 << LayerMask.NameToLayer("Default"));
        if (b && hit.collider != null && hit.collider.name.Equals("Cylinder"))
        {
            HandRig.transform.position = hit.point;
            if (joint != null)
                Destroy(joint);
            joint = target.gameObject.AddComponent<ConfigurableJoint>();
            joint.connectedBody = HandRig;
            joint.xMotion = ConfigurableJointMotion.Locked;
            joint.yMotion = ConfigurableJointMotion.Locked;
            joint.zMotion = ConfigurableJointMotion.Locked;
            handupdis = Vector3.Distance(hit.point, myCamera.transform.position);
        }
    }
    
	void Update()
    {

        if (Input.GetMouseButtonDown(0))
        {
            Hand(Input.mousePosition.x,Input.mousePosition.y);
        }
    }

我们看到,在射线碰到圆柱体后,我们把红球改到了碰撞点位置,并且给target(圆柱体)增加了ConfigurableJoint,并且让他connectedBody到红球,并且设置x,y,z可以自由移动。最后handupdis是为了下面的移动准备的。

鼠标移动

然后我们再来处理移动
当我们移动的时候,我们只要移动球体,那么因为Joint被绑定到球体了,他也会跟着移动了。

		if (Input.GetMouseButton(0))
        {
            Move(Input.mousePosition);
        }
	private void Move(Vector3 pos)
    {
        pos.z = handupdis;
        Vector2 world = myCamera.ScreenToWorldPoint(pos);
        
        HandRig.transform.position = world;
    }

我们来看看效果。
请添加图片描述
有没有发下一个问题,红球点击圆柱体下面的时候,被拾取的点还是在顶部,我们需要计算锚点。

增加这行代码就舒服多了。

joint.anchor = joint.transform.InverseTransformPoint(hit.point);

最后

我们把鼠标放开也一起写了,放上全部代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//UTF8支持
public class CDrag : MonoBehaviour
{
    [SerializeField] Rigidbody HandRig;
    [SerializeField] Transform target;
    Camera myCamera;
    ConfigurableJoint joint;

    float handupdis;
    Vector2 startpos;
    // Start is called before the first frame update
    void Start()
    {
        myCamera = Camera.main;
    }

    void Hand(float x, float y)
    {
        Vector3 at = new Vector3(x, y, myCamera.transform.position.z);
        Ray ray = myCamera.ScreenPointToRay(at);
        RaycastHit hit;
        Debug.DrawRay(ray.origin, ray.direction * 100f, Color.red, 1f);
        bool b = Physics.Raycast(ray, out hit, 100f, 1 << LayerMask.NameToLayer("Default"));
        if (b && hit.collider != null && hit.collider.name.Equals("Cylinder"))
        {
            HandRig.transform.position = hit.point;
            if (joint != null)
                Destroy(joint);
            joint = target.gameObject.AddComponent<ConfigurableJoint>();
            joint.connectedBody = HandRig;
            joint.xMotion = ConfigurableJointMotion.Locked;
            joint.yMotion = ConfigurableJointMotion.Locked;
            joint.zMotion = ConfigurableJointMotion.Locked;
            joint.anchor = joint.transform.InverseTransformPoint(hit.point);
            handupdis = Vector3.Distance(hit.point, myCamera.transform.position);
        }
    }

    private void Move(Vector3 pos)
    {
        pos.z = handupdis;
        Vector2 world = myCamera.ScreenToWorldPoint(pos);
        
        HandRig.transform.position = world;
    }
    void Update()
    {

        if (Input.GetMouseButtonDown(0))
        {
            Hand(Input.mousePosition.x,Input.mousePosition.y);
        }
        if (Input.GetMouseButton(0))
        {
            Move(Input.mousePosition);
        }
        if (Input.GetMouseButtonUp(0))
        {
            Destroy(joint);
        }
    }
}

最终效果如下:
请添加图片描述
最后,Joint家族里还可以使用其他的Joint来实现,例如SpringJoint,那就带有弹簧效果了,原理都是一样和一个刚体链接起来就可以了。

Unity VR 3D物体拖拽与放置系统:从原理到实战实现 在虚拟现实(VR)应用开发中,3D交互是构建沉浸式体验的核心技术。其基本原理是通过空间定位与输入追踪,将用户的真实动作映射到虚拟世界,实现自然直观的人机交互。这项技术的核心价值在于打破二维屏幕的局限,让用户能以符合物理直觉的方式直接操控虚拟物体,从而大幅提升操作效率与临场感。在工程实践中,开发者常需在物理拟真、运行性能与实现复杂度之间做出权衡,例如选择基于变换的抓取方案以确保稳定流畅,或采用混合抓取来平衡手感与物理反馈。这些方案广泛应用于VR培训、虚拟装配、教育模拟及游戏等场景。本文聚焦于Unity引擎中V 阅读详情

相关推荐

了解Unity编辑器之组件篇Physics(四)

了解Unity编辑器之组件篇Physics

falsedewuxin的博客 2060

unity实现鼠标拖拽物品移动

将鼠标的位置为,鼠标点击的X\Y轴和物品的Z给到,然后将鼠标的屏幕坐标转换为世界坐标给到物品在update里面实时更新移动,这样就可以完成物品的拖拽了。unity实现物品拖拽,3D创景需要注意的是一个屏幕坐标转换为世界坐标和世界坐标转换屏幕坐标,熟悉他们之间的转化,就没什么难度了。从摄像机发射一条射线,通过射线检测到鼠标点击的物体,将物品的世界坐标转换为屏幕坐标。

Optimistic_lx的博客 3367

Unity机械臂精准抓取:从碰撞检测到物理关节约束的完整实现

在机器人仿真与游戏开发中,刚体动力学和碰撞检测是构建逼真交互的基础。其原理在于物理引擎通过计算物体间的接触与力作用,模拟真实世界行为。掌握这些技术对于开发机械臂、抓取机器人等应用具有重要价值,能显著提升仿真的准确性与沉浸感。本文聚焦于Unity环境下的机械臂抓取这一具体应用场景,针对传统Parent方法导致的物理模拟失效、坐标错乱等问题,深入探讨了基于触发器检测、余弦定理角度验证并结合FixedJoint物理约束的解决方案。通过剖析碰撞体配置、向量计算与关节应用,为开发稳定可靠的抓取逻辑提供了实践路径,有效

weixin_33895695的博客 355

Unity--Configurable Joint——实战带你了解可配置关节

关节组件将刚体连接到另一个刚体或空间中的固定点,关节施加使刚体移动的力,而关节限制功能可以限制该移动。就像是动物的关节一样,例如一个关节连接着两个节点,那么其中一个节点的移动或旋转可以带动另外一个与其连接的节点发生相应的改变。关节赋予刚体以下自由度: Configurable Joint可配置关节是Unity物理引擎中非常强大的一个部分,该关节包含其他关节类型的所有功能。其它关节包括角色关节 (Character Joint) 、固定关节 (Fixed Joint)、铰链关节 (Hinge Joint)、弹

游戏码农一枚,不定时分享技术文章~ 6153

URDF模型导入Unity完整指南:从原理到机器人仿真实践

URDF作为机器人描述文件标准,定义了机器人的连杆、关节与物理属性,是机器人仿真与数字孪生的基础。其核心原理在于通过XML结构描述机器人的运动学与动力学关系,为仿真提供结构化数据。在工程实践中,将URDF导入Unity引擎能充分发挥后者在实时渲染、物理引擎与跨平台部署方面的技术价值,实现高保真可视化与交互式仿真。这一流程在机器人算法验证、虚拟培训、远程操控等应用场景中至关重要。针对导入过程中常见的关节错位、模型丢失等挑战,本文基于Unity官方URDF Importer工具链,详细解析了从模型预处理、坐标轴

hqmln的博客 253

Unity引擎构建医疗数字孪生体:从游戏技术到手术规划的跨界实践

数字孪生体作为物理实体的虚拟映射,其核心原理在于通过数据驱动构建高保真的动态模型,实现对真实世界的模拟、分析与预测。这一技术在工业领域已广泛应用,其价值在于能够进行无风险的测试、优化和决策支持。随着实时3D渲染与交互技术的成熟,数字孪生正深入医疗这一高精度要求领域,特别是在手术规划场景中,为解决传统二维影像“空间关系抽象、难以动态推演”的痛点提供了全新方案。Unity引擎凭借其强大的实时渲染能力、成熟的物理模拟组件及活跃的开发者生态,成为构建高交互性医疗数字孪生体的关键技术平台。通过整合医学影像数据,它能创

weixin_34054931的博客 518

Unity组件大全之 Physics物理 |(67)Configurable Joint 可配置关节

Unity 提供了多种 **Joint 组件** 来帮助开发者模拟物体之间的物理连接,而其中的 **Configurable Joint** 组件是最灵活且功能最强大的关节组件。相比于其他 Joint(如 Hinge Joint、Spring Joint 等),**Configurable Joint** 提供了对物体运动的全面控制,允许开发者在所有六个自由度(即三维位置和三维旋转)上施加限制、弹簧、阻尼等。通过 Configurable Joint,开发者能够创建出复杂的物理行为,比如机械臂、多轴关节、以

Unity打怪升级 2462

Unity手势交互开发实战:基于LeapMotion从安装到手势识别全流程

手势交互作为人机交互的重要分支,其核心原理是通过传感器捕捉人体手部动作,并将其转化为计算机可识别的数据流。在Unity引擎中实现手势交互,通常涉及数据采集、骨骼追踪和状态机识别等技术环节。LeapMotion作为专精于手部追踪的硬件设备,提供了高精度、低延迟的骨骼数据流,其技术价值在于为开发者屏蔽了底层图像处理的复杂性,实现了“开箱即用”的快速集成。这使得开发者能够聚焦于上层交互逻辑的设计,广泛应用于VR/AR内容开发、数字孪生操控、体感游戏及医疗培训等场景。本文将以LeapMotion与Unity的集成为

weixin_30417487的博客 469

Unity关节与绳子效果:物理约束建模与稳定性优化

在Unity中实现可信的物理交互,核心在于理解关节组件的本质——它并非简单连接物体,而是向PhysX求解器提交的数学约束条件。从刚体动力学原理出发,ConfigurableJoint因其可编程自由度(6DOF)成为实现真实绳子效果的首选,能精准建模单向拉伸限制与抗弯曲刚度。其参数如Linear Limit、Motion锁定与Drive强度,直接关联数值稳定性与视觉自然度。实际应用中需兼顾约束误差累积、多关节协同力分配及移动端性能压测,广泛用于攀爬系统、吊桥机关、机械臂抓取等高要求场景。

weixin_30127995的博客 340

基于Unity与ROS 2的机械臂视觉抓取仿真与实控全流程实践

机器人视觉抓取是机器人学与计算机视觉交叉领域的核心技术,其核心原理是通过视觉传感器感知环境,识别目标物体的位置与姿态,进而规划机械臂的运动轨迹以完成抓取操作。这项技术的核心价值在于实现了机器人的智能化与自主化,极大地拓展了机器人在工业分拣、物流仓储、智能服务等场景的应用潜力。在实际工程开发中,为了降低直接在实体机器人上调试带来的高成本与高风险,采用高保真仿真环境进行算法验证与流程测试已成为行业标准实践。本文聚焦于如何利用Unity3D构建高渲染质量的仿真环境,并结合ROS 2通信框架、YOLO目标检测算法以

weixin_30457465的博客 433

Unity手部IK实战:解决抖动、关节扭曲与性能优化难题

反向动力学(IK)是计算机图形学和游戏开发中驱动角色动画的核心技术,它通过指定末端效应器(如手部)的目标位置,反向解算中间关节的旋转,从而实现角色与环境的精准交互。其原理主要基于CCD、FABRIK等迭代算法,在骨骼层级中逆向求解。这项技术的核心价值在于提升角色动画的真实感和交互沉浸感,广泛应用于游戏角色抓取、攀爬、操作物体等场景。在Unity引擎中,手部IK的实现常面临抖动、关节扭曲等挑战,本文聚焦于Animation Rigging、极向量控制等热词,深入剖析手部IK的稳定实现与性能优化方案。

weixin_30892763的博客 327

【UGUI】Unity教程:实现物品的拖拽功能

大家好,今天,我们将一起学习如何在Unity中实现物品的拖拽功能。这是一个非常实用的技能,无论你是在制作RPG游戏的背包系统,还是在制作策略游戏的建筑放置功能,都会用到这个技能。那么,让我们开始吧!

leoysq的博客 4413

Unity3D数字孪生动画同步实战:从状态同步到骨骼动画的完整方案

数字孪生技术通过创建物理实体的虚拟映射,实现了虚实世界的实时交互与预测分析,其核心价值在于对物理世界的精准复现与模拟。为实现这一目标,动画同步技术成为关键,它确保了虚拟模型与物理实体动作的毫秒级一致性。从技术原理上看,主要分为基于状态同步、骨骼动画帧数据同步以及基于视觉的反向驱动三大路径。其中,状态同步凭借其实现简单、对网络带宽要求低的优势,成为工业监控、建筑环境管理等场景的首选方案,它通过传输并解析实体状态参数(如关节角度、温度值)来驱动虚拟模型。而骨骼动画同步则适用于对动作精度要求极高的虚拟人、医疗模拟

weixin_30381317的博客 373

Unity中拖拽3D物体并放入到指定位置

unity中3d物体的简单拖拽功能实现详细步骤说明。

weixin_43818160的博客 7559

OpenXR实战指南:Quest 3手部追踪与空间锚点全链路调优

OpenXR作为Khronos制定的跨平台VR/AR底层标准,本质是操作系统级的‘硬件抽象翻译层’,而非Unity内置插件。其核心价值在于统一不同厂商(Meta、Valve、Microsoft)Runtime的调用接口,实现一次开发多端部署。但真实工程落地中,常因Loader加载失败、Vendor Runtime兼容性、设备端ADB授权缺失或坐标系转换错误导致‘功能已启用却无响应’。本文聚焦OpenXR在Quest 3上的工业级实践,深入解析Runtime注册表校验、XR Plugin Management

weixin_33162074的博客 300

【unity】几种常用的拖拽方法(内置方法 + 接口 + Event Trigger组件)

本文介绍了Unity中实现拖拽功能的四种方法:1) 使用鼠标点击事件Input.GetMouseButton,简单通用但控制细节有限;2) 内置方法OnMouseDrag,简单易用但仅支持PC平台;3) Event Trigger组件,支持多点触摸但开销较大;4) 接口实现方式,灵活但需手动编码。文章通过换装拼图、图片匹配等实例演示了前两种方法的具体实现,包括坐标转换、碰撞检测等关键技术点,并指出不同方法的适用场景与局限性。最后提到UI拖拽需使用专门方法,为后续内容做铺垫。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 9427

Unity可配置关节详解

【组件界面】 【前置基础】 关节的作用是使得两个刚体连接到一起,使两个刚体的运动受到对方的限制,例如绳子连接的两个石块的运动会受到对方的限制。在关节中,这种运动限制通过锚点来实现,其原理是: 关节有六个自由度,在物体A上有个锚点a,物体B上有个锚点b,锚点ab分别相对于物体AB有Position和Rotation,两个锚点间也有Position和Rotation,后两者的差值表示的是关节的Position和Rotation的值。物体AB运动时使得锚点ab的Position和Rotation改.

enternalstar的博客 3054

基于DFT的scanshift sdc模板(DFT)

摘要:本文详细介绍了DFT测试模式下的SDC约束方法。

murphyrong的博客 885
上一篇: Android学习笔记4 - 初学Activity和viewBind
下一篇: Android学习笔记5 - 初学Activity(二)多个、生命周期、启动模式
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值