diff --git a/src/ElectronBot.Braincase.Core/Models/ModelActionFrame.cs b/src/ElectronBot.Braincase.Core/Models/ModelActionFrame.cs
new file mode 100644
index 0000000..279dc6b
--- /dev/null
+++ b/src/ElectronBot.Braincase.Core/Models/ModelActionFrame.cs
@@ -0,0 +1,55 @@
+namespace Verdure.ElectronBot.Core.Models;
+public class ModelActionFrame
+{
+ public Stream FrameStream
+ {
+ get; set;
+ }
+ public float J1
+ {
+ get; set;
+ }
+ public float J2
+ {
+ get; set;
+ }
+ public float J3
+ {
+ get; set;
+ }
+ public float J4
+ {
+ get; set;
+ }
+ public float J5
+ {
+ get; set;
+ }
+ public float J6
+ {
+ get; set;
+ }
+ public bool Enable
+ {
+ get; set;
+ }
+ public ModelActionFrame(
+ Stream imgData,
+ bool enable = false,
+ float j1 = 0,
+ float j2 = 0,
+ float j3 = 0,
+ float j4 = 0,
+ float j5 = 0,
+ float j6 = 0)
+ {
+ FrameStream = imgData;
+ J1 = j1;
+ J2 = j2;
+ J3 = j3;
+ J4 = j4;
+ J5 = j5;
+ J6 = j6;
+ Enable = enable;
+ }
+}
diff --git a/src/ElectronBot.Braincase/Controls/CompactOverlay/ModelLoadCompactOverlayPage.xaml b/src/ElectronBot.Braincase/Controls/CompactOverlay/ModelLoadCompactOverlayPage.xaml
index 6841d07..547d97b 100644
--- a/src/ElectronBot.Braincase/Controls/CompactOverlay/ModelLoadCompactOverlayPage.xaml
+++ b/src/ElectronBot.Braincase/Controls/CompactOverlay/ModelLoadCompactOverlayPage.xaml
@@ -11,6 +11,7 @@
mc:Ignorable="d">
+
+
+
+
diff --git a/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs b/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs
index af89adc..6aeb7a6 100644
--- a/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs
+++ b/src/ElectronBot.Braincase/Helpers/ElectronBotHelper.cs
@@ -43,6 +43,8 @@ public class ElectronBotHelper
public event EventHandler? PlayEmojisRandom;
+ public event EventHandler? ModelActionFrame;
+
private MediaPlayer mediaPlayer = new();
private bool isTTS = false;
@@ -445,4 +447,9 @@ public class ElectronBotHelper
{
PlayEmojisRandom?.Invoke(this, new EventArgs());
}
+
+ public void ModelActionInvoke(ModelActionFrame frame)
+ {
+ ModelActionFrame?.Invoke(this, frame);
+ }
}
diff --git a/src/ElectronBot.Braincase/Services/ActionExpression/DefaultActionExpressionProvider.cs b/src/ElectronBot.Braincase/Services/ActionExpression/DefaultActionExpressionProvider.cs
index 4d5db71..6583991 100644
--- a/src/ElectronBot.Braincase/Services/ActionExpression/DefaultActionExpressionProvider.cs
+++ b/src/ElectronBot.Braincase/Services/ActionExpression/DefaultActionExpressionProvider.cs
@@ -186,6 +186,8 @@ public class DefaultActionExpressionProvider : IActionExpressionProvider
currentAction = actions[actionCount];
}
+
+
var mat1 = image.Resize(new OpenCvSharp.Size(240, 240), 0, 0, OpenCvSharp.InterpolationFlags.Lanczos4);
var mat2 = mat1.CvtColor(OpenCvSharp.ColorConversionCodes.RGBA2BGR);
@@ -204,9 +206,19 @@ public class DefaultActionExpressionProvider : IActionExpressionProvider
currentAction.J5,
currentAction.J6);
+ var stream = image.ToMemoryStream();
+
+ var modelFrameData = new ModelActionFrame(stream, true,
+ currentAction.J1,
+ currentAction.J2,
+ currentAction.J3,
+ currentAction.J4,
+ currentAction.J5,
+ currentAction.J6);
+
//EmojiPlayHelper.Current.Enqueue(frameData);
+ ElectronBotHelper.Instance.ModelActionInvoke(modelFrameData);
-
_ = await service.SendToUsbDeviceAsync(frameData);
//通过grpc通讯和树莓派传输数据
diff --git a/src/ElectronBot.Braincase/ViewModels/ModelLoadCompactOverlayViewModel.cs b/src/ElectronBot.Braincase/ViewModels/ModelLoadCompactOverlayViewModel.cs
index 4971918..7fc80e0 100644
--- a/src/ElectronBot.Braincase/ViewModels/ModelLoadCompactOverlayViewModel.cs
+++ b/src/ElectronBot.Braincase/ViewModels/ModelLoadCompactOverlayViewModel.cs
@@ -38,6 +38,20 @@ public partial class ModelLoadCompactOverlayViewModel : ObservableRecipient
};
}
+ [RelayCommand]
+ public void PlayAction()
+ {
+ var playEmojisLock = ElectronBotHelper.Instance.PlayEmojisLock;
+
+ if (!playEmojisLock)
+ {
+ //随机播放表情
+ ElectronBotHelper.Instance.ToPlayEmojisRandom();
+ }
+
+ ElectronBotHelper.Instance.PlayEmojisLock = true;
+ }
+
[RelayCommand]
public async Task Loaded()
@@ -201,6 +215,8 @@ public partial class ModelLoadCompactOverlayViewModel : ObservableRecipient
FocusCameraToScene();
DispatcherTimer.Start();
+
+ ElectronBotHelper.Instance.ModelActionFrame += Instance_ModelActionFrame;
}
catch (Exception)
{
@@ -208,6 +224,15 @@ public partial class ModelLoadCompactOverlayViewModel : ObservableRecipient
}
}
+ private void Instance_ModelActionFrame(object? sender, Verdure.ElectronBot.Core.Models.ModelActionFrame e)
+ {
+ Material = new DiffuseMaterial()
+ {
+ EnableUnLit = false,
+ DiffuseMap = LoadTextureByStream(e.FrameStream)
+ };
+ }
+
private void FocusCameraToScene()
{
var maxWidth = Math.Max(Math.Max(ModelBoundingBox.Width, ModelBoundingBox.Height), ModelBoundingBox.Depth) + 240;
@@ -240,6 +265,39 @@ public partial class ModelLoadCompactOverlayViewModel : ObservableRecipient
var tr5 = tr4 * Matrix.Translation(average.X, average.Y, average.Z);
RightArmModel.HxTransform3D = tr5;
+
+
+
+ var nodeList = HeadModel.GroupNode;
+
+
+ foreach (var itemMode in nodeList.Items)
+ {
+ if (itemMode.Name == "Head3.obj")
+ {
+ foreach (var node in itemMode.Traverse())
+ {
+ if (node is MeshNode meshNode)
+ {
+ meshNode.Material = Material;
+ }
+ }
+ }
+ }
+
+ //if (modelName == "Head3.obj")
+ //{
+ // if (newScene != null && newScene.Root != null)
+ // {
+ // foreach (var node in newScene.Root.Traverse())
+ // {
+ // if (node is MeshNode meshNode)
+ // {
+ // meshNode.Material = Material;
+ // }
+ // }
+ // }
+ //}
}
catch
{
@@ -321,4 +379,10 @@ public partial class ModelLoadCompactOverlayViewModel : ObservableRecipient
return TextureModel.Create(filePath);
}
+
+ private TextureModel LoadTextureByStream(Stream data)
+ {
+
+ return TextureModel.Create(data);
+ }
}