【Unity3D】花瓣特效

news2024/11/14 6:38:58

1 花瓣绘制原理

        如下图是实现的花瓣特效效果,为方便描述,我们将每个红色的扁状长条称为花瓣,每个花瓣中心的绿点称为花蕊,花朵的正中心称为花心。

        我们在 xOz 平面上绘制花朵,假设花心为 O 点,其世界坐标为 _Center, 花瓣个数为 _PetalNum,花瓣半长度和半宽度分别为 _PetalLength、_PetalWidth,背景、花心、花蕊、花瓣的颜色分别为 _BackgoundColor、_HeartColor、_StamenColor、_PetalColor;对于平面上任意一点 P, 其世界坐标为 worldPos,其最终着色的颜色为 color,下面将逐步求解 color 的计算过程。

        本文完整资源见→Unity3D花瓣特效。

1.1 花瓣坐标轴上投影坐标计算过程

        为方便顶点着色,我们需要知道与顶点 P 最近的花蕊坐标,将该花蕊记为 S 点,其坐标记为 stamen,然后再计算 SP 在该花瓣坐标轴上的投影坐标(即图中 SP 在 SM 和 SN 方向上的投影)。

        1)计算 OS 的旋转角度

        由于 Unity 世界坐标系是左手坐标系,旋转正方向的定义遵循左手法则(详见→空间和变换),即 xOz 平面上旋转正方向为顺时针方向。为简化计算,我们定义旋转零度方向为 z 轴正方向。因此,向量 OS 的旋转角度计算如下。

float3 vertVec = worldPos - _Center; // 向量OP
float proj = dot(normalize(vertVec), float3(0, 0, 1)); // OP在OZ上的投影
float angle = acos(proj); // 向量OP的角度
if (vertVec.x < 0) { // OP的旋转角度大于180°
	angle = UNITY_TWO_PI - angle;
}
float delta = UNITY_TWO_PI / _PetalNum; // 每个花瓣的角度
float nearAngle = round(angle / delta) * delta; // 向量OS的角度

        2)计算 S 点坐标

float3 vec = float3(sin(nearAngle), 0, cos(nearAngle)); // 向量OS的单位方向向量
float3 stamen = _Cenetr + vec * _PetalLength; // S点坐标(离P点最近的花蕊坐标)

        3)计算 SP 在花瓣坐标轴上的投影坐标 

float vec1 = worldPos - stamen; // 向量SP
float vec2 = normalize(stamen - _Center); // 向量SM的单位方向向量
float x = abs(dot(vec1, vec2)); // SP在SM轴上的投影
float y = sqrt(dot(vec1, vec1) - x * x); // SP在SN轴上的投影
float2 proj = float2(x, y); // SP在花瓣坐标轴上的投影坐标

        由于花瓣具有对称性,为方便计算,我们只取投影的绝对值。 

1.2 顶点着色过程

        为了使花瓣、花蕊、花心边缘着色平滑,我们使用了 smoothstep 函数(详见→Shader常量、变量、结构体、函数)。

        1)花瓣着色

float rate1 = smoothstep(_PetalLength, 0, proj.x) * smoothstep(_PetalWidth, 0, proj.y); // 顶点属于花瓣的比例
fixed4 color1 = lerp(_BackgroundColor, _PetalColor, rate1); // 混合花瓣颜色

        2)花蕊着色

float stamenWidth = _PetalWidth * 0.25; // 花蕊宽度(花蕊占花瓣宽度的比例可以调整)
float len2 = length(worldPos - stamen); // 向量SP的模长(顶点离花蕊的长度)
float rate2 = smoothstep(stamenWidth, 0, len2); // 顶点属于花蕊的比例
fixed4 color2 = lerp(color1, _StamenColor, rate2); // 混合花蕊颜色

        3)花心着色

float heartWidth = _PetalLength * 0.4; // 花心宽度(花心占花瓣长度的比例可以调整)
float len3 = length(worldPos - _Center); // 向量OP的模长(顶点离花心的长度)
float rate3 = smoothstep(heartWidth, 0, len3); // 顶点属于花蕊的比例
fixed4 color = lerp(color2, _HeartColor, rate3); // 混合花心颜色

2 绽放花瓣特效

2.1 花瓣绽放原理

        调整花瓣的长度和宽度,使其随时间同步周期性变化,从而实现花瓣绽放效果,如下。

float time = _Time.y * _Speed;
_PetalWidth = fmod(time * 0.2, 0.9) + 0.1;
_PetalLength = fmod(time * 1.1111, 5) + 1;

        其中 _Speed 为花瓣长度、宽度的变化速度,外部可以调整该参数。

2.2 花瓣绽放实现

        FlowerEffect.shader

Shader "MyShader/FlowerEffect"  { // 绽放花瓣特效
    Properties{
        _BackgroundColor("BackgroundColor", Color) = (1, 1, 1, 1) // 地面颜色
        _PetalColor("PetalColor", Color) = (1, 0, 0, 1) // 花瓣颜色
        _StamenColor("StamenColor", Color) = (0, 1, 0, 1) // 花蕊颜色
        _HeartColor("_HeartColor", Color) = (1, 1, 0, 1) // 花心颜色
        _Center("Center", Vector) = (0, 0, 0, 0) // 花心坐标
        _PetalNum("PetalNum", Range(3, 30)) = 15 // 花瓣个数
        _PetalWidth("PetalWidth", Range(0.1, 1)) = 0.5 // 花瓣宽度
        _PetalLength("PetalLength", Range(1, 20)) = 2 // 花瓣长度
        _Speed("Speed", Range(0.2, 5)) = 1 // 花瓣宽度、长度的变化速度
    }

    SubShader{
        Pass {
            CGPROGRAM

            #include "UnityCG.cginc"
            #pragma vertex vert
            #pragma fragment frag

            fixed4 _BackgroundColor; // 背景颜色
            fixed4 _PetalColor; // 花瓣颜色
            fixed4 _StamenColor; // 花蕊颜色
            fixed4 _HeartColor; // 花心颜色
            float4 _Center; // 花蕊中心
            int _PetalNum; // 花瓣个数
            float _PetalWidth; // 花瓣宽度
            float _PetalLength; // 花瓣长度
            float _Speed; // 花瓣宽度、长度的变化速度

            struct a2v {
                float4 vertex : POSITION; // 模型空间顶点坐标
            };

            struct v2f {
                float4 pos : SV_POSITION; // 裁剪空间顶点坐标
                float3 worldPos : TEXCOORD0; // 纹理uv坐标
            };

            v2f vert(a2v v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; // 世界空间顶点坐标
                return o;
            }

            void updateParams() { // 更新花瓣宽度、长度信息
                float time = _Time.y * _Speed;
                _PetalWidth = fmod(time * 0.2, 0.9) + 0.1;
                _PetalLength = fmod(time * 1.1111, 5) + 1;
            }

            float getNearAngle(float3 vec) { // 获取与vec向量方向最近的花瓣的角度
                float proj = dot(normalize(vec), float3(0, 0, 1));
                float angle = acos(proj);
                if (vec.x < 0) { // OP的旋转角度大于180°
                    angle = UNITY_TWO_PI - angle;
                }
                float delta = UNITY_TWO_PI / _PetalNum;
                return round(angle / delta) * delta;
            }

            float3 getStamen(float angle) { // 获取离顶点最近的花蕊位置
                float3 vec = float3(sin(angle), 0, cos(angle));
                return _Center.xyz + vec * _PetalLength;
            }

            float2 getProjXY(float3 vec1, float3 vec2) { // 获取vec1在vec2下的的投影坐标
                float x = abs(dot(vec1, normalize(vec2)));
                float y = sqrt(dot(vec1, vec1) - x * x);
                return float2(x, y);
            }

            fixed4 mixPetalColor(float2 pos) { // 混合花瓣颜色
                float rate = smoothstep(_PetalLength, 0, pos.x) * smoothstep(_PetalWidth, 0, pos.y); // 顶点属于花瓣的比例
                //float rate = smoothstep(sqrt(_PetalLength * _PetalLength + _PetalWidth * _PetalWidth), 0, length(pos));
                return lerp(_BackgroundColor, _PetalColor, rate);
            }

            fixed4 mixStamenColor(fixed4 color, float2 pos) { // 混合花蕊颜色
                float stamenWidth = _PetalWidth * 0.25; // 花蕊宽度
                float len = length(pos); // 顶点离花蕊的长度
                float rate = smoothstep(stamenWidth, 0, len); // 顶点属于花蕊的比例
                return lerp(color, _StamenColor, rate);
            }

            fixed4 mixHeartColor(fixed4 color, float3 pos) { // 混合花心颜色
                float heartWidth = _PetalLength * 0.4; // 花心宽度
                float len = length(pos); // 顶点离花心的长度
                float rate = smoothstep(heartWidth, 0, len); // 顶点属于花蕊的比例
                return lerp(color, _HeartColor, rate);
            }

            fixed4 frag(v2f i) : SV_Target {
                updateParams(); // 更新花瓣宽度、长度信息
                float3 vertVec = i.worldPos - _Center.xyz;
                float nearAngle = getNearAngle(vertVec); // 获取与顶点最近的花瓣角度
                float3 stamen = getStamen(nearAngle); // 获取离顶点最近的花蕊位置
                float2 pos = getProjXY(i.worldPos - stamen, stamen - _Center.xyz); // 顶点在花蕊坐标系下的投影坐标
                fixed4 color = mixPetalColor(pos); // 混合花瓣颜色
                color = mixStamenColor(color, pos); // 混合花蕊颜色
                color = mixHeartColor(color, vertVec); // 混合花心颜色
                return color;
            }

            ENDCG
        }
    }
}

        运行效果如下:

3 发射花瓣特效

        本节将实现花瓣周期性向四周发射特效,并且在发射过程中向一直旋转。

3.1 花瓣发射原理

        1)旋转原理

        在第 1 节的基础上,我们需要修改 OS 的旋转角度计算,第 1 个花瓣的旋转角度不再是 0,而是在 0 ~ (2π / _PetalNum) 之间周期性变化,具体计算如下。

float3 vertVec = worldPos - _Center; // 向量OP
float proj = dot(normalize(vertVec), float3(0, 0, 1)); // OP在OZ上的投影
float angle = acos(proj); // 向量OP的角度
if (vertVec.x < 0) { // OP的旋转角度大于180°
	angle = UNITY_TWO_PI - angle;
}
float delta = UNITY_TWO_PI / _PetalNum; // 每个花瓣的角度
float initAngle = fmod(_Time.y * _RotateSpeed, delta); // 第1个花瓣的旋转角度
float k = round((angle - initAngle) / delta); // 旋转的花瓣的个数
float nearAngle = k * delta + initAngle; // 向量OS的角度

        2)发射原理

        在第 1 节的基础上,我们需要修改 S 点的计算,OS 的长度不再是 _PetalLength,而是随时间逐渐增大的,具体计算如下。

float time = fmod(_Time.y, _CastTime); // 当前发射周期中, 花瓣移动的时间
float dist = _MoveSpeed * time; // 当前发射周期中, 花瓣移动的距离
float len = length(worldPos - _Center); // 当前顶点距离花心的距离
if (len >= dist) { // 顶点在最外一环的花蕊外面
	return dist;
}
float petalLength = _PetalLength * 2; // 花瓣长度
float k = round((dist - len) / petalLength); // 顶点与最外一环的花蕊相隔的花瓣环数
float norm = dist - k * petalLength; // OS模长(与顶点最近一环的花蕊到花心的距离)

        S 点坐标计算如下。

float3 vec = float3(sin(nearAngle), 0, cos(nearAngle)); // 向量OS的单位方向向量
float3 stamen = _Center + vec * norm; // S点坐标(离P点最近的花蕊坐标)

3.3 花瓣发射实现

        FlowerEffect.shader

Shader "MyShader/FlowerEffect"  { // 发射花瓣特效
    Properties{
        _BackgroundColor("BackgroundColor", Color) = (1, 1, 1, 1) // 地面颜色
        _PetalColor("PetalColor", Color) = (1, 0, 0, 1) // 花瓣颜色
        _StamenColor("StamenColor", Color) = (0, 1, 0, 1) // 花蕊颜色
        _HeartColor("_HeartColor", Color) = (1, 1, 0, 1) // 花心颜色
        _Center("Center", Vector) = (0, 0, 0, 0) // 花心坐标
        _PetalNum("PetalNum", Range(3, 30)) = 15 // 花瓣个数
        _PetalWidth("PetalWidth", Range(0.1, 1)) = 0.5 // 花瓣宽度
        _PetalLength("PetalLength", Range(1, 20)) = 2 // 花瓣长度
        _RotateSpeed("RotateSpeed", Range(0.2, 5)) = 1 // 花瓣旋转速度
        _MoveSpeed("MoveSpeed", Range(0.2, 5)) = 1 // 花瓣移动速度
        _CastTime("_CastTime", Range(1, 10)) = 5 // 花瓣发射周期
    }

    SubShader{
        Pass {
            CGPROGRAM

            #include "UnityCG.cginc"
            #pragma vertex vert
            #pragma fragment frag

            fixed4 _BackgroundColor; // 背景颜色
            fixed4 _PetalColor; // 花瓣颜色
            fixed4 _StamenColor; // 花蕊颜色
            fixed4 _HeartColor; // 花心颜色
            float4 _Center; // 花蕊中心
            int _PetalNum; // 花瓣个数
            float _PetalWidth; // 花瓣宽度
            float _PetalLength; // 花瓣长度
            float _RotateSpeed; // 花瓣旋转速度
            float _MoveSpeed; // 花瓣移动速度
            float _CastTime; // 花瓣发射周期

            struct a2v {
                float4 vertex : POSITION; // 模型空间顶点坐标
            };

            struct v2f {
                float4 pos : SV_POSITION; // 裁剪空间顶点坐标
                float3 worldPos : TEXCOORD0; // 纹理uv坐标
            };

            v2f vert(a2v v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标变换到裁剪空间, 等价于: mul(UNITY_MATRIX_MVP, v.vertex)
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; // 世界空间顶点坐标
                return o;
            }

            float getLen(float3 vertVec) { // 获取顶点最近的花蕊到花心的距离
                float time = fmod(_Time.y, _CastTime); // 当前发射周期中, 花瓣移动的时间
                float dist = _MoveSpeed * time; // 当前发射周期中, 花瓣移动的距离
                float len = length(vertVec); // 当前顶点距离花心的距离
                if (len >= dist) {
                    return dist;
                }
                float petalLength = _PetalLength * 2;
                return dist - round((dist - len) / petalLength) * petalLength;
            }

            float getNearAngle(float3 vec) { // 获取与vec向量方向最近的花瓣的角度
                float proj = dot(normalize(vec), float3(0, 0, 1));
                float angle = acos(proj);
                if (vec.x < 0) { // OP的旋转角度大于180°
                    angle = UNITY_TWO_PI - angle;
                }
                float delta = UNITY_TWO_PI / _PetalNum;
                float initAngle = fmod(_Time.y * _RotateSpeed, delta);
                float k = round((angle - initAngle) / delta);
                return k * delta + initAngle;
            }

            float3 getStamen(float angle, float len) { // 获取离顶点最近的花蕊位置
                float3 vec = float3(sin(angle), 0, cos(angle));
                return _Center.xyz + vec * len;
            }

            float2 getProjXY(float3 vec1, float3 vec2) { // 获取vec1在vec2下的的投影坐标
                float x = abs(dot(vec1, normalize(vec2)));
                float y = sqrt(dot(vec1, vec1) - x * x);
                return float2(x, y);
            }

            fixed4 mixPetalColor(float2 pos) { // 混合花瓣颜色
                float rate = smoothstep(_PetalLength, 0, pos.x) * smoothstep(_PetalWidth, 0, pos.y); // 顶点属于花瓣的比例
                //float rate = smoothstep(sqrt(_PetalLength * _PetalLength + _PetalWidth * _PetalWidth), 0, length(pos));
                return lerp(_BackgroundColor, _PetalColor, rate);
            }

            fixed4 mixStamenColor(fixed4 color, float2 pos) { // 混合花蕊颜色
                float stamenWidth = _PetalWidth * 0.25; // 花蕊宽度
                float len = length(pos); // 顶点离花蕊的长度
                float rate = smoothstep(stamenWidth, 0, len); // 顶点属于花蕊的比例
                return lerp(color, _StamenColor, rate);
            }

            fixed4 mixHeartColor(fixed4 color, float3 pos) { // 混合花心颜色
                float heartWidth = _PetalLength * 0.4; // 花心宽度
                float len = length(pos); // 顶点离花心的长度
                float rate = smoothstep(heartWidth, 0, len); // 顶点属于花蕊的比例
                return lerp(color, _HeartColor, rate);
            }

            fixed4 frag(v2f i) : SV_Target {
                float3 vertVec = i.worldPos - _Center.xyz;
                float len = getLen(vertVec); // 获取顶点距离最近的内环花蕊的距离
                float nearAngle = getNearAngle(vertVec); // 获取与顶点最近的花瓣角度
                float3 stamen = getStamen(nearAngle, len); // 获取离顶点最近的花蕊位置
                float2 pos = getProjXY(i.worldPos - stamen, stamen - _Center.xyz); // 顶点在花蕊坐标系下的投影坐标
                fixed4 color = mixPetalColor(pos); // 混合花瓣颜色
                color = mixStamenColor(color, pos); // 混合花蕊颜色
                color = mixHeartColor(color, vertVec); // 混合花心颜色
                return color;
            }

            ENDCG
        }
    }
}

        运行效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/839054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM之类加载与字节码

1.类文件结构 一个简单的HelloWorld.Java package cn.itcast.jvm.t5; // HelloWorld 示例 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }编译为 HelloWorld.class 后的样子如下所示&#xff1a; […

CentOS安装podman-compose

1. 安装python3的依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel 如果当前登录的是普通用户&#xff0c;需要在命令前加sudo&#xff0c;否则不用&…

C++实用技术(二)std::function和bind绑定器

目录 简介std::functionstd::function对象包装器std::function做回调函数 std::bind绑定器bind绑定普通函数bind绑定成员函数 简介 C11新增了std::function和std::bind。用于函数的包装以及参数的绑定。可以替代一些函数指针&#xff0c;回调函数的场景。 std::function std…

git 版本控制与合并

一 git概述&#xff1a; - Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理软件开发项目中的代码变更。 - 它允许多人协同工作&#xff0c;记录代码历史变更&#xff0c;并轻松管理多个项目版本。 **Git的主要特点**包括&#xff1a; 1. **分布式系统**&#xff1a;…

嵌入式开发学习(STC51-14-时钟)

内容 在数码管上显示时间&#xff0c;时分秒&#xff0c;格式为“XX-XX-XX”&#xff1b; DS1302时钟芯片介绍 简介 DS1302是DALLAS公司推出的涓流充电时钟芯片&#xff0c;内含有一个实时时钟/日历和31字节静态RAM&#xff0c;通过简单的串行接口与单片机进行通信&#xf…

系统架构设计高级技能 · 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythin…

第4集丨Vue 江湖 —— 计算属性

目录 一、基本使用1.1 在computed中定义1.1.1 案例1.1.2 控制台调用getter1.1.3 控制台中的data和computed 1.2 缓存效果1.3 完整写法1.3.1 案例1.3.2 效果图 1.4 简写形式 二、案例的其他实现2.1 methods实现2.2 插值语法实现 三、体会计算属性的好处3.1 复杂任务时3.2 使用计…

IO模型-信号驱动IO

linux内核中存在一个信号SIGIO&#xff0c;这个信号就是用于实现信号驱动IO的。当应用程序中想要以信号驱动IO的模型读写硬件数据时&#xff0c;首先注册一个SIGIO信号的信号处理函数,当硬件数据就绪&#xff0c;硬件会发起一个中断&#xff0c;在硬件的中断处理函数中向当前进…

求解n阶勒让德多项式的值

描述 用递归方法求n阶勒让德多项式的值&#xff0c;递归公式为&#xff1a; 在主函数中输入一个整数n和一个实数x&#xff0c;调用函数 legendre(n,x)&#xff0c;并输出其返回值。 输入 第一行输入一个整数n&#xff0c;表示阶数&#xff1b;第二行输入一个实数x。 输出 …

增强型Web安全网关在银行的应用

销售&#xff0c;绝不是降低身份去取悦客户&#xff0c;而是像朋友一样给予合理的建议。你刚好需要&#xff0c;我刚好专业&#xff01;仅此而已&#xff01; 乔.吉拉德 健康的安全体系&#xff0c;还可以更完善 浙江某商业银行股份有限公司是一家成立多年的商业银行&#xf…

分布式异步任务处理组件(七)

分布式异步任务处理组件底层网络通信模型的设计--如图&#xff1a; 使用Java原生NIO来实现TCP通信模型普通节点维护一个网络IO线程&#xff0c;负责和主节点的网络数据通信连接--这里的网络数据是指组件通信协议之下的直接面对字节流的数据读写&#xff0c;上层会有另一个线程负…

装饰器模式(C++)

定义 动态(组合)地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。 一《设计模式》 GoF 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xf…

视频安防监控EasyCVR平台海康大华设备国标GB28181告警布防的报文说明

TSINGSEE青犀视频监控综合管理平台EasyCVR基于云边端协同&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台既具备传统安防视频监控的能力&#xff0c;比如&#xff1a;视频监控直播、云端录像、云存储、录像检索与回看、告警上报、平台级联、云台控制、语音对讲等&…

第一课-前提-Stable Diffusion 教程

学习 SD 的前提是电脑配置! SD 参考配置: 建议选择台式机 i5 CPU, 内存16GB,N卡 RTX3060, 8G显存以上的配置(最低配) 在此基础上的配置越高越好。 比如,cpu i7 更好,显卡能有 RTX4090 更好,32显存要能有最好,嘿嘿嘿。 如何查看自己的显卡配置? Win+R 输入 “dxdiag…

vue2-v-if和v-for的优先级是什么?

1、v-if和v-for的区别 作用&#xff1a; v-if指令用于条件性地渲染一块内容&#xff0c;这块内容只会在指令的表达式返回true值的时候被渲染。 v-for指令基于一个数组来渲染一个列表&#xff0c;v-for指令需要使用item in items 形式的特殊语法&#xff0c;其中&#xff0c;it…

自学(黑客)技术,从入门到精通!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

Vue3 模板语法简单应用

去官网学习-》 模板语法 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 模板语法</h1><h2>{{ msg }}</h2><h2>{{ textHtml }}</h2><h2 v-html"text…

【单运放RC振荡器1负反馈方波2正反馈正弦波方波】2021-12-9

缘由multisim运放芯片给一个连上电源另一个引脚打叉不能仿真-测试-CSDN问答 正反馈电阻影响转化阀值,负反馈电阻影响频率 固定负反馈为2时无法起震荡,电位器调节到2%可振荡且波形失真,电位器调节到0%且固定负反馈为2时才能正弦波输出

Spring Boot 集成Seata

Seata的集成方式有&#xff1a; 1. Seata-All 2. Seata-Spring-Boot-Starter 3. Spring-Cloud-Starter-Seata 本案例使用Seata-Spring-Boot-Starter演示&#xff1a; 第一步&#xff1a;下载Seata 第二步&#xff1a;为了更好看到效果&#xff0c;我们将Seata的数据存储改…