目标:
波峰更尖锐,波谷更平坦,真实可信。
这次没用 但也 不是 不可以 不能 不确定 怎么用
(自创四重否定=双重肯定)
公式先丢这
变量:
水平坐标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∑Mkmkx,mtanh(kmh)amsin(θ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∑Mkmkz,mtanh(kmh)amsin(θm)
ζ
=
∑
m
=
1
M
a
m
c
o
s
(
θ
m
)
zeta = sum_{m=1}^M a_m cos(theta_m)
ζ=m=1∑Mamcos(θ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,ma+kz,mβ−wmt−ϕ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=gkmtanh(kmh)
叉
积
计
算
法
线
:
(
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/


