栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

模型 顶点访问 Sin函数 C# + HLSL(unity cginc)实现 可升级 格斯特纳波浪 Gerstner Waves

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

模型 顶点访问 Sin函数 C# + HLSL(unity cginc)实现 可升级 格斯特纳波浪 Gerstner Waves

SJX2022111 核心算法:

目标:
波峰更尖锐,波谷更平坦,真实可信。
这次没用 但也 不是 不可以 不能 不确定 怎么用
(自创四重否定=双重肯定)
公式先丢这

变量:
水平坐标xz纵坐标为y表示为:
X Y Z mathcal{X}mathcal{Y}mathcal{Z} XYZ
地球引力:
G mathcal{G} G
自由表面描述为参数的函数:
a β abeta aβ

时间 :
t t t。
自由表面通过条件:
X = ξ ( a , β , t ) , Y = ζ ( a , β , t ) , Z = η ( a , β , t ) mathcal{X} =xi(a,beta,t) ,mathcal{Y} =zeta(a,beta,t) ,mathcal{Z} =eta(a,beta,t) X=ξ(a,β,t),Y=ζ(a,β,t),Z=η(a,β,t)
ξ = a − ∑ m = 1 M k x , m k m a m t a n h ( k m h ) s i n ( θ m ) xi = a - sum_{m=1}^M frac{k_{x,m}}{k_m} frac{a_m}{tanh(k_mh)} sin(theta_m) ξ=a−m=1∑M​km​kx,m​​tanh(km​h)am​​sin(θm​)
η = β − ∑ m = 1 M k z , m k m a m t a n h ( k m h ) s i n ( θ m ) eta = beta - sum_{m=1}^M frac{k_{z,m}}{k_m} frac{a_m}{tanh(k_mh)} sin(theta_m) η=β−m=1∑M​km​kz,m​​tanh(km​h)am​​sin(θm​)
ζ = ∑ m = 1 M a m c o s ( θ m ) zeta = sum_{m=1}^M a_m cos(theta_m) ζ=m=1∑M​am​cos(θm​)
θ m = k x , m a + k z , m β − w m t − ϕ m theta_m= k_{x,m}a + k_{z,m}beta-w_mt-phi_m θm​=kx,m​a+kz,m​β−wm​t−ϕm​
注释:
t a n h 是 双 曲 正 切 函 数 tanh 是 双曲正切函数 tanh是双曲正切函数
M 是 波 分 量 的 数 量 M 是 波分量的数量 M是波分量的数量
a m 是 分 量 的 幅 度    ϕ m 是 分 量 的 相     其 中 m = 1... M a_m 是 分量的幅度 spacespacephi_m 是 分量的相 spacespacespace其中 m=1...M am​是分量的幅度  ϕm​是分量的相   其中m=1...M

波 峰 间 的 距 离 : k m = ( k x , m 2 + k z , m 2 )     波 峰 旋 转 速 率 ( 角 频 率 ) : w m     平 均 水 深 : h 波峰间的距离:k_m =sqrt{(k^2_{x,m}+k^2_{z,m})} spacespace space 波峰旋转速率(角频率):w_m spacespace space 平均水深:h 波峰间的距离:km​=(kx,m2​+kz,m2​) ​   波峰旋转速率(角频率):wm​   平均水深:h
水 波 的 色 散 : w m 2 = g k m t a n h ( k m h ) 水波的色散:w^2_m = gk_mtanh(k_mh) 水波的色散:wm2​=gkm​tanh(km​h)
叉 积 计 算 法 线 : ( T O D O ) 叉积计算法线:(TODO) 叉积计算法线:(TODO)

最终效果: 图片:

视频链接:
		https://youtu.be/zJMyDPYsLbQ
		https://youtu.be/zJMyDPYsLbQ
		https://www.artstation.com/artwork/4X13qW
代码实现: 环境:unity2019.2.16 LWRP

顶点代码的目的:简单的sin摆动(可以用 格斯特纳波浪 替代,有需要单独写一篇)
片元没什么东西 不放了

#ifndef VERT
#define VERT

#include "SJX_BaseTest_HLSL/SJX_LitInput.hlsl"

struct sinController 
{
        //A振幅,B周期,C相移,D垂直移位
        float A;
        float B;
        float C;
        float D;


};
float4 matrixChange(float3 Posit,float3 Scale, float3 Rotat,float4 Target )
{
    //位移矩阵
    float3 transValues = Posit;
    float4x4  transfrom = float4x4(
    float4( 1.0,        0.0,         0.0,  transValues.x ),
    float4( 0.0,        1.0,         0.0,  transValues.y ),
    float4( 0.0,        0.0,         1.0,  transValues.z ),
    float4( 0.0,        0.0,         0.0,  1.0 ) );
    //缩放矩阵
    float3 scaleV = Scale;
    float4x4  scale = float4x4(
    float4( scaleV.x, 0.0,          0.0,  0.0 ),
    float4( 0.0,      scaleV.y,     0.0,  0.0 ),
    float4( 0.0,      0.0,     scaleV.z,  0.0 ),
    float4( 0.0,      0.0,          0.0,  1.0 ) );    
    //旋转矩阵z
    float angleZ=Rotat.z;
    float4x4  rotationZ = float4x4(
    float4( cos(angleZ), -sin(angleZ),0.0,  0.0 ),
    float4( sin(angleZ),  cos(angleZ),0.0,  0.0 ),
    float4( 0.0,        0.0,          1.0,  0.0 ),
    float4( 0.0,        0.0,          0.0,  1.0 ) );
    //旋转矩阵x
    float angleX=Rotat.x;
    float4x4  rotationX = float4x4(
    float4( 1.0,        0.0,         0.0,  0.0 ),
    float4( 0.0,cos(angleX),-sin(angleX),  0.0 ),
    float4( 0.0,sin(angleX), cos(angleX),  0.0 ),
    float4( 0.0,        0.0,         0.0,  1.0 ) );
    //旋转矩阵z
    float angleY=Rotat.y;
    float4x4  rotationY = float4x4(
    float4(  cos(angleY), 0.0, sin(angleY),  0.0 ),
    float4(  0.0        , 1.0,         0.0,  0.0 ),
    float4( -sin(angleY), 0.0, cos(angleY),  0.0 ),
    float4(          0.0, 0.0,         0.0,  1.0 ) );

    return mul(mul(mul(mul(mul(Target,transfrom),scale),rotationX),rotationY),rotationZ);
}
float vertexAni(float vertPos  , sinController SC) 
{
    vertPos +=  ( SC.A * sin (
                (
                  ( 2.0*PI/SC.B )  - (_Time.x * _SJX_Speed) + SC.C
                )
                
            )
            + SC.D


        
        );
   
    return vertPos;
}
float3 vert(float3 vertPosition, float texCoord )
{
    VertexPositionInputs vertexInput = GetVertexPositionInputs(vertPosition.xyz);
     float3 worldSpacePos = mul(unity_ObjectToWorld,vertPosition).xyz;
     worldSpacePos = normalize( vertexInput.positionWS);
    
 
//    // vertPosition.y += worldSpacePos.y*0.001;
//      sinController SC ;
//       SC.A = 0.5;
//       SC.B = pow(vertexInput.positionWS.x,100.0);
//       SC.C = 0.0;
//       SC.D = 0.0;
//     vertPosition.y = vertexAni( vertPosition.y,SC);

  //  vertPosition = pow(worldSpacePos,2.0);
        if(_SJX_MatrixResurrections==1.0)
        {

       
            float rot = 0.5;
            float3 p = vertPosition;
            float2 d = normalize(float2(0.5,0.1));
            float f = vertexInput.positionWS.x/6.0-_Time.x*_SJX_Speed;
            float a = 10.0;
            p.y += d.x * (a*cos(f));
			p.x = sin(f);
            p.z += d.y * (a*cos(f));

			vertPosition += p;
         }else
         {
              vertPosition =  matrixChange(
                    float3(0.0,0.0,0.0),
                    float3(1.0,1.0,1.0),
                    float3(0.0,-_Time.x*_SJX_Speed,0.0),
                    float4(vertPosition.xyz,1.0)
                );
         }

    return vertPosition;
}

#endif

C# 目的挂在在一个mesh上,访问物体坐标下的每个顶点,置入世界空间生成坐标,在每个生成顶点位置的地方创建mesh

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

public class VertexShow : MonoBehaviour
{
      Mesh mesh;
      Vector3[] vertices;
      public Material Mat;

      public List objs;

      void Start()
      {
            mesh = GetComponent().mesh;
            vertices = mesh.vertices;
            objs = new List();
            for (var i = 0; i < vertices.Length; i++)
            {
                  //pos
                  Matrix4x4 localToWorld = transform.localToWorldMatrix;
                  GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Plane);
                  cube.transform.position = localToWorld.MultiplyPoint3x4(vertices[i]);

                  //name
                  cube.name = "SJX_CUBE_LOGO5_" + i.ToString();
                  //vertices[i] += Vector3.up * Time.deltaTime;
                  //scale
                  cube.transform.localScale = new Vector3(0.15f, 0.1f, 0.1f);
                  //mat
                  cube.GetComponent().material = Mat;

            }

            for (var i = 0; i < vertices.Length; i++)
            {


                  //name
                  string name = "SJX_CUBE_LOGO5_" + i.ToString();
                  GameObject g = GameObject.Find(name);
                  objs.Add(g);



            }


      }

}

参考文献: https://en.wikipedia.org/wiki/Trochoidal_wave https://catlikecoding.com/unity/tutorials/flow/waves/
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900393.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号