【HTC-VIVE】11-Interesting Interactable:有趣的交互——弹性变形球实现

有趣交互的场景:

interestinginteractable.png

弹性球的实现:

1、该球模型带有 BlendShape:可以进行变形,在手抓取时,根据按压手柄的按钮的程度,控制球的变形。

2、由于该球也是可交互的物体,因此也具有 Interactable 脚本组件

3、该球要能能被手扔出,所以具有 Throwable 脚本组件Rigidbody 组件Sphere Collider 组件,在sphere collider 上指定物理材质,带有弹性的材质 : Squishy 物理材质

4、在添加Throwable 脚本组件 时,自动添加VelocityEstimator 脚本组件
VelocityEstimator 脚本组件: -------根据位置的变化估计物体的速度

5、自定义脚本 : SquishyBall用来控制弹性球的形变,以及显示其交互状态


相关组件:
  • 如图:


    SquishyBall.png
  • BlendeShape : 用于变形,在制作模型时导出该BlendeShape
  • Rigidbody 勾选使用重力 :让其在被手扔出后受重力落地
  • Sphere Collider 使用 弹性物理材质:squishy : 让它在碰撞到其他物体进行反弹
    PyhsicMaterial.png

  • Interactable 脚本组件 :使该物体可以交互,这个物体将获得悬停事件,并可以被附加到手上(之前已经详细介绍)

Throwable 脚本组件 :

- 使物体能被手扔出的组件,同时也是一个基类,可以继承进行扩展与重写
Throwable.png
可设置属性:
  • Attachment Flags : 该物体所属于的附加类型标志
  • Atachment Offset : 作为定位和旋转偏移使用的局部坐标位置点
  • Catching Speed Threshold : 该对象必须以多快的速度移动才能在按键一直按下而不是点击时将物体抓取(-1 :表示禁用)
  • Release Velocity Style : 释放物体时,力的来源类型(默认:Get From Hand)
  • NoChange : 没有改变,直接使用物体的原来的刚体力
  • GetFromHand : 来自手的世界空间的力
  • ShortEstimation : 短时预估计,根据所受的最后时刻的力来估计
  • AdvancedEstimation : 高级预估,根据所受的力的最佳平均值来预测物体的受力
  • Release Velocity Time Offset : 当选择力来自手时,获取力的时间偏移量
  • Scale Release Velocity : 释放力的大小缩放
  • Restore Original Parent : 释放时是否回到原来的父物体下
  • Attach Ease In : 附着抓取物体时,是否启用缓动曲线
  • Snap Attach Ease In Curve : 预设缓动曲线编辑
  • Snap Attach Ease In Time : 缓动曲线持续时间
可设置事件:
  • On Pick Up():在抓取上手的事件
  • On Detach From Hand():在与手分离时的事件

  • Snap Attach Ease In Completed : 是否发送曲线完成事件
    sendMessage.png

可访问方法或属性:
  • GetReleaseVelocities(Hand hand, out Vector3 velocity, out Vector3 angularVelocity) : 获取释放的速度力与角力

VelocityEstimator 脚本组件:

根据位置的变化估计物体的速度
VelocityEstimator.png
可设置属性:
  • Velocity Average Frames : 平均每多少帧计算力速度
  • Angular Velocity Average Frames : 平均每多少帧计算角速度
  • Estimate On Awake : 是否一开始就开始计算力

可访问的方法或属性:
  • BeginEstimatingVelocity() : 一开始就开始计算力,无论该物体是否被抓取
  • FinishEstimatingVelocity() : 结束抓取时,计算力

  • GetVelocityEstimate() : 获取计算平均的速度力(返回 Vertor3 )
  • GetAngularVelocityEstimate() : 获取计算平均的角力(返回 Vertor3 )

  • GetAccelerationEstimate() : 获取计算的平均加速度(返回 Vertor3 )

自定一脚本:实现弹性球的变形与状态显示
Squishy Ball.png
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
using Valve.VR.InteractionSystem;


public class SquishyBall : MonoBehaviour
{

    public Interactable interactable; //交互组件

    public new SkinnedMeshRenderer renderer; //模型的SkinnedMeshRenderer ,用来控制变形

    public bool afftectMaterial;  //是否变形后,调整材质

    [SteamVR_DefaultAction("Squeeze")]
    public SteamVR_Action_Single gripSqueeze; //握的手势操作

    [SteamVR_DefaultAction("Squeeze")]
    public SteamVR_Action_Single pinchSqueeze; //捏的手势操作

    public TextMesh textMesh; //用于显示状态的 3D 文本

    private float attachTime; //抓取的时长

    private new Rigidbody rigidbody; //刚体


    void Start()
    {
        if (interactable == null)
            interactable = GetComponent<Interactable>();
        if (renderer == null)
            renderer = GetComponent<SkinnedMeshRenderer>();
        if (rigidbody == null)
            rigidbody = GetComponent<Rigidbody>();
        textMesh.text = "无手悬停!";
    }


    void Update()
    {
        float grip = 0;
        float pinch = 0;
        if (interactable.attachedToHand)
        {
            grip = gripSqueeze.GetAxis(interactable.attachedToHand.handType);
            pinch = pinchSqueeze.GetAxis(interactable.attachedToHand.handType);
        }

        renderer.SetBlendShapeWeight(0, Mathf.Lerp(renderer.GetBlendShapeWeight(0), grip * 150, Time.deltaTime * 10));
        if (renderer.sharedMesh.blendShapeCount > 1)
        {
            renderer.SetBlendShapeWeight(1, Mathf.Lerp(renderer.GetBlendShapeWeight(1), pinch * 200, Time.deltaTime * 10));
        }

        if (afftectMaterial)
        {
            renderer.material.SetFloat("_Deform", Mathf.Pow(grip * 1.5f, 0.5f));
            if (renderer.material.HasProperty("_PinchDeform"))
            {
                renderer.material.SetFloat("_PinchDeform", Mathf.Pow(pinch * 2.0f, 0.5f));
            }
        }
    }

    private void OnHandHoverBegin(Hand hand)
    {
        textMesh.text = "弹性球正被: " + hand.name + " 悬停!";
        
    }


    private void OnHandHoverEnd(Hand hand)
    {
        textMesh.text = "无手悬停!";        
    }

    //-------------------------------------------------
    // 当可交互物体刚被手抓取附着时,被调用一次
    //-------------------------------------------------
    private void OnAttachedToHand(Hand hand)
    {
        textMesh.text = "弹性球附着在:" + hand.name;
        attachTime = Time.time;
    }


    //-------------------------------------------------
    // 当可交互物体刚被手释放分离时,被调用一次
    //-------------------------------------------------
    private void OnDetachedFromHand(Hand hand)
    {
        textMesh.text = "弹性球从 " + hand.name + " 分离!";
    }



    //-------------------------------------------------
    //当可交互物体刚被手一直抓取附着时,被每帧调用
    //-------------------------------------------------
    private void HandAttachedUpdate(Hand hand)
    {
        textMesh.text = "弹性球附着在:" + hand.name + "\n附着时间: " + (Time.time - attachTime).ToString("F2");
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容