2021-04-29 18:58发布
怎么用matlab实现kriging插值算法第一步:% 已知某天海面2:00,8:00,14:00,20:00的% 温度分别为 221.0645, 233.7419,250.7742,229.6129 ,(间隔为6小时)% (1)采用线性内插、多项式内插和样条内插方法插值到一小时间隔,并比较不同;% (2)对上述一小时内插结果进行调和分析;% (3)对上述海表温度一小时内插结果进行Fourier分析。clc; clear all; close all;
lerp方法可以实现
线性插值,在两点之间进行插值计算。
public static Vector3 Lerp(Vector3 a, Vector3 b, float t);
这边我用Unity中的Quaternion类来减少一些类似叉乘的方法,专注于Slerp的实现。
首先我们来看一下Unity直接使用Quaternion进行插值的效果。
public class TestSlerp : MonoBehaviour
{
public Vector3 TargetRot;
public Quaternion targetRot;
private Quaternion startRot;
private float dTime = 0f;
void OnEnable()
dTime = 0f;
startRot = transform.rotation;
targetRot = Quaternion.Euler(TargetRot);
}
void Update()
dTime += Time.deltaTime;
if (dTime > 1f)
dTime = 1f;
enabled = false;
// 进行插值
transform.rotation = Quaternion.Slerp(startRot, targetRot, dTime);
跟Mathf.Lerp类似的使用。
好,现在我们根据上面的公式来实现一下Slerp:
public class TestSlerp2 : MonoBehaviour
transform.rotation = MySlerp(startRot, targetRot, dTime);
Quaternion MySlerp(Quaternion a, Quaternion b, float t)
var q = (Quaternion.Inverse(a) * b);
var result = a * Power(q, t);
return result;
Quaternion Power(Quaternion q, float t)
float x = q.x;
float y = q.y;
float z = q.z;
float w = q.w;
// 防止除零
if (Mathf.Abs(w) < 0>
// 提取半角alpha = theta/2
float alpha = Mathf.Acos(w);
// 计算新的alpha
float newAlpha = alpha * t;
// 转换成w
w = Mathf.Cos(newAlpha);
// 消去sin(alpha)
float mult = Mathf.Sin(newAlpha) / Mathf.Sin(alpha);
x *= mult;
y *= mult;
z *= mult;
return new Quaternion(x, y, z, w);
以上是我直接照搬公式实现的插值方法,实际上书中的方法针对性得优化了一些性能:
public Quaternion SlerpBook(Quaternion a, Quaternion b, float t)
// 使用点乘计算四元数的夹角
float cosOmega = Quaternion.Dot(a, b);
// 如果点乘为负,则反转一个四元数取得最短的弧
if (cosOmega < 0f>
a.x = -a.x;
a.y = -a.y;
a.z = -a.z;
a.w = -a.w;
float k0, k1;
if (cosOmega > 0.9999f)
// 非常接近 进行线性插值
k0 = 1.0f - t;
k1 = t;
else
//使用sin^2(z)+cos^2(z)=1计算sin值
float sinOmega = Mathf.Sqrt(1.0f - cosOmega * cosOmega);
// 通过sin和cos计算角度
float omega = Mathf.Atan2(sinOmega, cosOmega);
// 计算分母的倒数
float oneOverSinOmega = 1.0f / sinOmega;
// 计算插值变量
k0 = Mathf.Sin((1.0f - t) * omega) * oneOverSinOmega;
k1 = Mathf.Sin(t * omega) * oneOverSinOmega;
// 最后插值
return new Quaternion(
a.x * k0 + b.x * k1,
a.y * k0 + b.y * k1,
a.z * k0 + b.z * k1,
a.w * k0 + b.w * k1);
第一种方法:通过点击场景文件打开Unity游戏工程找到Unity游戏工程所在的目录,我这里的工程放在在E盘根路径的Unity_workspace文件夹中。注意:unity软件不支持中文路径,所以不要把工程放在中文文件夹下。我们在这里就打开New Unity Project 4工程,进入到Ne...
如果是学习研究的话,当然是体验官方的最新版本。要是项目开发的话,还是要选择长期稳定版本,也就是大版本的LTS。比如2017.4或者是2018.4都是LTS版本,至于后面的小版本可以去看下更新的内容来做选择吧!...
unity3D是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC...
1、Unity3D:如果你需要开发大型游戏,或需要开发3D游戏的,请选这个。2、Cocos2D-x:如果你开发的是中小型游戏,对安装包大小比较在意的,请选这个。3、Andengine、Cocos2D-iPhone:如果你只为开发单平台游戏,又非常在意速度和安装包大小,请选这个。最后。...
首先在场景中调整好你要观看的视角选择摄像机,按下Ctrl+Shift+F或者菜单栏->GameObject->Align with view在不行的话,可以调整摄像机的Position 和 Rotation
将MeshRender组件移除即可:
1.在Asset store里选择一个skybox。 2.从素材库中选择一个人物角色,也可以自己建模或者在其他软件中做好再导进来。 3.想好角色如何运动,然后用自己比较熟悉的语言编写来作展示,这段代码可以实现当你按下键盘上的A/D/S/W的按键时,角色会向前后左右四个方向的...
还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学 学学js flash as等等 有个梯度就好多了如果要用好unity 不会编程那是不行的 学习的过程中都有个头疼的过程 记住 头越痛 代表你要接受的东西越多 坚持 你的大脑在和知识兼容中:D...
xcel 表的操作少不了要引入第三方库,首先我们需要引入 Excel.dll 和 ICSharpCode.SharpZipLib.dll,这两个类库在网上都能找到;然后我们还需要引入 System.Data.dll,这个类库在 Unity3D 的安装路径下的 Editor\Data\Mono\lib\mono\unity 文件夹下能找到...
需要添加如下引用: System.Configuration System.Data System.EnterpriseServices System.Security System.XML using UnityEngine; using System.Collections; using System; using System.Data; using System.Data...
物理引擎则使用动量、扭矩等用高等数学手段来模拟真实物体,这将得到更真实的效果且使我们的编码更加容易。
不能这样表述,三维通常是立体的空间,二维则是平面的。数学中通常是Oxyz表示空间直角坐标系,Oxy表示表示的是平面直角坐标系,你可以说空间直角坐标系中去掉Z轴可以转换为二维,因为去掉X或Y轴都能转换为二维。...
GameObject.renderer.enabled//是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的GameObject.Destroy()//表示移除物体或物体上的组件 代表销毁该物体 实际上该物体的内存并没有立即释放,而是等到这...
一:Overlay—覆盖模式类似于手机贴膜,所有UI都会显示在场景中2D,3D物体的上层在同一个Canvas下可以调整Canvas子物体的先后顺序,层级面板中越靠上则先被渲染多个Canvas下可以调整Canvas组件的Sort Order属性调整渲染顺序,数值越小的画布越先被渲染:Camer...
不得不说,Unity3d是个解放生产力的游戏引擎,自带了各种编辑器,可以进行一系列的可视化操作。需要注意的是,unity3d适合FPS游戏,物理游戏等中小型的游戏,并不太适合MMO开发。unity3d难学吗?如何学习unity3d呢?在学习之前又应该了解哪些内容呢?代码写不...
不是人工检查的,如果你的问题里面有敏感关键字,是发不出去的,现在国内所有的网站在发布文章时都要进行检查的,所以你在发之前先检查一下看问题里面是否有违禁词语。
最多设置5个标签!
怎么用matlab实现kriging插值算法
第一步:% 已知某天海面2:00,8:00,14:00,20:00的
% 温度分别为 221.0645, 233.7419,250.7742,229.6129 ,(间隔为6小时)
% (1)采用线性内插、多项式内插和样条内插方法插值到一小时间隔,并比较不同;
% (2)对上述一小时内插结果进行调和分析;
% (3)对上述海表温度一小时内插结果进行Fourier分析。
clc; clear all; close all;
lerp方法可以实现
线性插值,在两点之间进行插值计算。
public static Vector3 Lerp(Vector3 a, Vector3 b, float t);
这边我用Unity中的Quaternion类来减少一些类似叉乘的方法,专注于Slerp的实现。
首先我们来看一下Unity直接使用Quaternion进行插值的效果。
public class TestSlerp : MonoBehaviour
{
public Vector3 TargetRot;
public Quaternion targetRot;
private Quaternion startRot;
private float dTime = 0f;
void OnEnable()
{
dTime = 0f;
startRot = transform.rotation;
targetRot = Quaternion.Euler(TargetRot);
}
void Update()
{
dTime += Time.deltaTime;
if (dTime > 1f)
{
dTime = 1f;
enabled = false;
}
// 进行插值
transform.rotation = Quaternion.Slerp(startRot, targetRot, dTime);
}
}
跟Mathf.Lerp类似的使用。
好,现在我们根据上面的公式来实现一下Slerp:
public class TestSlerp2 : MonoBehaviour
{
public Vector3 TargetRot;
public Quaternion targetRot;
private Quaternion startRot;
private float dTime = 0f;
void OnEnable()
{
dTime = 0f;
startRot = transform.rotation;
targetRot = Quaternion.Euler(TargetRot);
}
void Update()
{
dTime += Time.deltaTime;
if (dTime > 1f)
{
dTime = 1f;
enabled = false;
}
// 进行插值
transform.rotation = MySlerp(startRot, targetRot, dTime);
}
Quaternion MySlerp(Quaternion a, Quaternion b, float t)
{
var q = (Quaternion.Inverse(a) * b);
var result = a * Power(q, t);
return result;
}
Quaternion Power(Quaternion q, float t)
{
float x = q.x;
float y = q.y;
float z = q.z;
float w = q.w;
// 防止除零
if (Mathf.Abs(w) < 0>
{
// 提取半角alpha = theta/2
float alpha = Mathf.Acos(w);
// 计算新的alpha
float newAlpha = alpha * t;
// 转换成w
w = Mathf.Cos(newAlpha);
// 消去sin(alpha)
float mult = Mathf.Sin(newAlpha) / Mathf.Sin(alpha);
x *= mult;
y *= mult;
z *= mult;
}
return new Quaternion(x, y, z, w);
}
}
以上是我直接照搬公式实现的插值方法,实际上书中的方法针对性得优化了一些性能:
public Quaternion SlerpBook(Quaternion a, Quaternion b, float t)
{
// 使用点乘计算四元数的夹角
float cosOmega = Quaternion.Dot(a, b);
// 如果点乘为负,则反转一个四元数取得最短的弧
if (cosOmega < 0f>
{
a.x = -a.x;
a.y = -a.y;
a.z = -a.z;
a.w = -a.w;
}
float k0, k1;
if (cosOmega > 0.9999f)
{
// 非常接近 进行线性插值
k0 = 1.0f - t;
k1 = t;
}
else
{
//使用sin^2(z)+cos^2(z)=1计算sin值
float sinOmega = Mathf.Sqrt(1.0f - cosOmega * cosOmega);
// 通过sin和cos计算角度
float omega = Mathf.Atan2(sinOmega, cosOmega);
// 计算分母的倒数
float oneOverSinOmega = 1.0f / sinOmega;
// 计算插值变量
k0 = Mathf.Sin((1.0f - t) * omega) * oneOverSinOmega;
k1 = Mathf.Sin(t * omega) * oneOverSinOmega;
}
// 最后插值
return new Quaternion(
a.x * k0 + b.x * k1,
a.y * k0 + b.y * k1,
a.z * k0 + b.z * k1,
a.w * k0 + b.w * k1);
}
相关问题推荐
第一种方法:通过点击场景文件打开Unity游戏工程找到Unity游戏工程所在的目录,我这里的工程放在在E盘根路径的Unity_workspace文件夹中。注意:unity软件不支持中文路径,所以不要把工程放在中文文件夹下。我们在这里就打开New Unity Project 4工程,进入到Ne...
如果是学习研究的话,当然是体验官方的最新版本。要是项目开发的话,还是要选择长期稳定版本,也就是大版本的LTS。比如2017.4或者是2018.4都是LTS版本,至于后面的小版本可以去看下更新的内容来做选择吧!...
unity3D是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC...
1、Unity3D:如果你需要开发大型游戏,或需要开发3D游戏的,请选这个。2、Cocos2D-x:如果你开发的是中小型游戏,对安装包大小比较在意的,请选这个。3、Andengine、Cocos2D-iPhone:如果你只为开发单平台游戏,又非常在意速度和安装包大小,请选这个。最后。...
首先在场景中调整好你要观看的视角选择摄像机,按下Ctrl+Shift+F或者菜单栏->GameObject->Align with view在不行的话,可以调整摄像机的Position 和 Rotation
将MeshRender组件移除即可:
1.在Asset store里选择一个skybox。 2.从素材库中选择一个人物角色,也可以自己建模或者在其他软件中做好再导进来。 3.想好角色如何运动,然后用自己比较熟悉的语言编写来作展示,这段代码可以实现当你按下键盘上的A/D/S/W的按键时,角色会向前后左右四个方向的...
还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学 学学js flash as等等 有个梯度就好多了如果要用好unity 不会编程那是不行的 学习的过程中都有个头疼的过程 记住 头越痛 代表你要接受的东西越多 坚持 你的大脑在和知识兼容中:D...
xcel 表的操作少不了要引入第三方库,首先我们需要引入 Excel.dll 和 ICSharpCode.SharpZipLib.dll,这两个类库在网上都能找到;然后我们还需要引入 System.Data.dll,这个类库在 Unity3D 的安装路径下的 Editor\Data\Mono\lib\mono\unity 文件夹下能找到...
需要添加如下引用: System.Configuration System.Data System.EnterpriseServices System.Security System.XML using UnityEngine; using System.Collections; using System; using System.Data; using System.Data...
物理引擎则使用动量、扭矩等用高等数学手段来模拟真实物体,这将得到更真实的效果且使我们的编码更加容易。
不能这样表述,三维通常是立体的空间,二维则是平面的。数学中通常是Oxyz表示空间直角坐标系,Oxy表示表示的是平面直角坐标系,你可以说空间直角坐标系中去掉Z轴可以转换为二维,因为去掉X或Y轴都能转换为二维。...
GameObject.renderer.enabled//是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的GameObject.Destroy()//表示移除物体或物体上的组件 代表销毁该物体 实际上该物体的内存并没有立即释放,而是等到这...
一:Overlay—覆盖模式类似于手机贴膜,所有UI都会显示在场景中2D,3D物体的上层在同一个Canvas下可以调整Canvas子物体的先后顺序,层级面板中越靠上则先被渲染多个Canvas下可以调整Canvas组件的Sort Order属性调整渲染顺序,数值越小的画布越先被渲染:Camer...
不得不说,Unity3d是个解放生产力的游戏引擎,自带了各种编辑器,可以进行一系列的可视化操作。需要注意的是,unity3d适合FPS游戏,物理游戏等中小型的游戏,并不太适合MMO开发。unity3d难学吗?如何学习unity3d呢?在学习之前又应该了解哪些内容呢?代码写不...
不是人工检查的,如果你的问题里面有敏感关键字,是发不出去的,现在国内所有的网站在发布文章时都要进行检查的,所以你在发之前先检查一下看问题里面是否有违禁词语。