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); + } }