unity模型制作(终章):柔体布料绘制

        在前六章模型绘制的基础上,加一些几何算法,很容易制作出不同样式的模型,例如下图中的几种模型:直梯、曲梯、各种屋顶等等。

         不过最终章主要想讲一下柔体的绘制:所谓柔体,其实就是物体在受力的作用时,会产生形变,看起来比较柔软。而产生形变的过程则是柔体的每个受力点,在每个时刻随着力的作用,发生形状、位置上的改变,从而整体看起来具备柔体效果。

        简单点讲:把柔体看做若干个点组成的面,每个点受力发生改变,物体也因此改变。

        这里做个简单的demo,做一块布料,实现思路:
        1.做一根上端固定的弹力线,线有5个节点彼此相连:

         2.做五条这样的线连成一片布料:

        

关键代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MeshMaker.Utility;
using System;

[Serializable]
public class ClothNode : MonoBehaviour
{
    public ClothNode lastNode;//前节点

    public bool isStatic = true;
    public float hook = 10;//虎克系数
    public float g = 10;//中立

    private float lastOraginDis;//前节点初始距离

    private void Start()
    {
        if(lastNode != null) lastOraginDis = Vector3.Distance(transform.position, lastNode.transform.position);
    }

    public void SetLast(ClothNode node)
    {
        lastNode = node;
    }

    // Update is called once per frame
    public void Update()
    {
        if(!isStatic) AddForce();
    }

    public void SetStatic(bool s) {
        isStatic = s;
    }

    public void SetInfo(bool isStatic,float hook, float g) {
        this.isStatic = isStatic;
        this.hook = hook;
        this.g = g;
    }

    public void AddForce() {
        Vector3 delta = Vector3.zero;

        Vector3 detaG = Vector3.zero;
        detaG = g * Vector3.up;

        delta -= detaG;

        if (lastNode != null)
        {
            var dir = (lastNode.transform.position - transform.position).normalized;
            float curDis = Vector3.Distance(transform.position, lastNode.transform.position);
            float rate = (curDis / lastOraginDis) - 1;

            Vector3 detaA = Vector3.zero;

            if (rate > 0)
            {
                float power = hook * rate;//弹力
                float a = power;//加速度
                detaA = a * dir;
            }

            delta += detaA ;
        }

        transform.position += delta * Time.deltaTime;
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = new Color(0, 1, 1, 1);

        Gizmos.DrawCube(transform.position, Vector3.one * 0.1f);

    }
}

        ClothNode是节点,isStatic为true的点是静态点,不受力的作用,在Start()记录初始距离,后面根据距离变化来计算,效果:

unity布料演示

        

        这种斗篷式布料是柔体中比较简单的一种,各位大佬可以试试添加不同的作用力实现不同的柔体效果。

        后序:本章节(Unity模型制作)就此结束,感谢支持!

        源码资源:MeshMaker:Unity模型绘制工具-Unity3D文档类资源-CSDN下载

        

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

左右...

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

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

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

打赏作者

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

抵扣说明:

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

余额充值