【CryENGINE】5.5でWindows Mixed Realityを試す

CRYENGINE 5.5でWindows Mixed Realityが無事動作するようになったみたいです。
が、相変わらずまだ不安定
ちょくちょく落ちます

で今回の本題はこれ
Entityまわりが更新されたわけですが

なんか怪しいですね
ちゃんと描画されていないような…

Shadowの設定ありましたっけ??

情報求む‼

<モデルはつみ式ミクさんをお借りしました>


Samsung の HMD Odysseyの分解・修理

頭部を固定するベルト部分のロック機構がバカになってしまったので修理しました。

クッション部を外し

ここはツメだけで留まっておりました。

さらに分解
タッピングビス6+1本です

どうやらこいつがダレて舐めていたよう

ポリウレタンチューブを突っ込んで様子見
構造上、外れてどこかいっちゃうことはないはず


【Python】scikit-learnを使ってみた

データは昭和電業社の「モータ制御開発 支援システム Simtrol-m」から
まぁこんなデータなわけです

普通のPID制御なんですが、これを学習させて実測値に近いシミュレートをしようという魂胆です
具体的には、
比例定数と積分定数、微分定数を突っ込めば、電流、電圧、回転数が出るよというものを目指します。

と書きましたが諸事情によりとりあえず積分定数のみ

import csv
import os
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
import numpy as np

train_X = []
train_Y = []
test_X = [[] for i in range(6)]
test_Y = [[] for i in range(6)]
filepathS = ["*:\*******\****.csv", \
             "*:\*******\****.csv", \
             "*:\*******\****.csv", \
             "*:\*******\****.csv", \
             "*:\*******\****.csv", \
             "*:\*******\****.csv"]

for a,filepath in enumerate(filepathS):
    basename = os.path.basename(filepath)
    basename = basename[:-4]
    basename = basename.split("d")

    ConstInteg = float(basename[1])
  
  #csv読み込み
    csv_file = open(filepath, "r", encoding="ms932", errors="", newline="" )
    f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

    i = 0
    for row in f:
        if i > 5 :
            print(row)

            train_X.append([ConstInteg,float(row[0])])
            train_Y.append([float(row[2]),float(row[3]),float(row[4])])

            test_X[a].append([ConstInteg,float(row[0])])
            test_Y[a].append([float(row[2]),float(row[3]),float(row[4])])

        i += 1

clf = DecisionTreeRegressor()
# 学習させる
clf.fit(train_X, train_Y)

print(clf.score(train_X, train_Y))

# -----------------------------------------------------
# 以下、結果

ConstantOfIntegration = 3.8

test_X1 = []
for b in test_X[1]:
    test_X1.append([ConstantOfIntegration,b[1]])

result = clf.predict(test_X1)

# 以下グラフ用
result = np.array(result)
test_X = np.array(test_X)

x = test_X[0][:,[1]]
y1 = result[:,[0]]
y2 = result[:,[1]]
y3 = result[:,[2]]

fig, (axL, axR) = plt.subplots(ncols=2, figsize=(22,12))

axL.plot(x, y1, label='(rpm)')
axL.set_title("Constant of Integration = "+str(ConstantOfIntegration))
axL.set_xlabel('time[s]')
axL.set_ylabel('Rotational speed')
axL.grid(True)

y_2000 = []
for c,yy1 in enumerate(y1):
    if yy1 >= 2000:
        y_2000.append(x[c])

axL.legend(title='2000rpm>= '+str(y_2000[0]), loc='upper left')

axR.plot(x, y2, label='(V)', color='r')
axR.plot(x, y3, label='(A)', color='m')
axR.set_title("Constant of Integration = "+str(ConstantOfIntegration))
axR.set_xlabel('time[s]')
axR.set_ylabel('Voltage / Intecity of Current')
axR.grid(True)
axR.legend(title='Vmax = '+str(max(y2))+'\nAmax = '+str(max(y3)))

plt.show()

シリアライズはしてません。

実行結果がこちら

学習データの範囲内ならそこそこの精度?
scikit-learn万歳!!
もっと学習用のデータが欲しい!!


【MAXScript】WPFをMAXScriptで使ってみる

Windows Presentation Foundation (WPF)のGUIをMAXScriptで使ってみよう企画?です。

ライブラリ(DLL)にしてMAXScriptでアクセスするという感じ

Visual Studioで普通にWPFアプリケーションを作成すると普通に.exeになってしまうので、ちょっと回り道をします。

「WPF ユーザーコントロール ライブラリ」として作成し
ウインドウを追加

あとはゴリゴリ書きたいことを書くだけ

今回はこんな感じ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace WpfControlLibrary1
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>

    public partial class Window1 : Window
    {
        private ObservableCollection<string> messages = new ObservableCollection<string>();
        private ObservableCollection<LvList> ListView_List = new ObservableCollection<LvList>();

        public Window1()
        {
            InitializeComponent();

            ListBox1.ItemsSource = messages;
            ListView1.ItemsSource = ListView_List;
        }

        public void AddItemToList(string mess) // MAX君から来たやつ
        {
            messages.Add(mess); // 突っ込む 
        }

        public void Fill_ListView(bool MAXcheck, string MAXName, string MAXState) // MAX君から来たやつ
        {
            LvList item = new LvList { Check = MAXcheck, Name = MAXName, State = MAXState }; // 追加する項目を作成
            ListView_List.Add(item); // Listに項目を追加

        }

        public class LvList
        {
            public bool Check { get; set; }
            public string Name { get; set; }
            public string State { get; set; }
        }

    }




}
<Window x:Class="WpfControlLibrary1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfControlLibrary1"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800">
    <Grid>
        <Grid.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                <GradientStop Color="#FFA9FFBD" Offset="0"/>
                <GradientStop Color="Black" Offset="1"/>
            </LinearGradientBrush>
        </Grid.Background>
        <Grid Margin="10,10,10,9.6">
            <Grid.RowDefinitions>
                <RowDefinition Height="12*"/>
                <RowDefinition Height="10*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="10*"/>
                <ColumnDefinition Width="5*"/>
            </Grid.ColumnDefinitions>
            <Button x:Name="Button" Content="Button" x:FieldModifier="public" Margin="30.2,0,30,10.4" Grid.Column="1" Height="39" VerticalAlignment="Bottom" Background="#FF64BF68" Grid.Row="1"/>
            <ListBox x:Name="ListBox1" x:FieldModifier="public" Margin="10,10,10,10.4"/>
            <ListView x:Name="ListView1" x:FieldModifier="public" Margin="10,10,9.8,10.4" Grid.Row="1">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="28">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox IsChecked="{Binding Check}" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="300" />
                        <GridViewColumn Header="State" DisplayMemberBinding="{Binding State}" Width="170"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>
    </Grid>
</Window>
fn main =(
	dotnet.loadAssembly (getFilenamePath (getSourceFileName()) +@"WpfControlLibrary1.dll")
	global Form1 = dotnetObject "WpfControlLibrary1.Window1"
		
	Form1.topmost = true	
	Form1.Show()
		
	Form1.AddItemToList "test"
	Form1.Fill_ListView true "こんにちは" "OK!!"
		
	fn test =(
		Form1.AddItemToList "Test!!"
	)
		
	dotNet.addEventHandler Form1.button "Click" test
)

main()

動きました

MAXでアクセスしたいUI要素には x:FieldModifier="public" を付けないとアクセスできません。
dotNet.addEventHandler WpfControlLibrary1.Window1 "Click" Fn で普通にイベントハンドラを追加できます。

dotNet.setLifetimeControl ******** #dotnetを実行するとMAX側にイベントハンドラを渡せるようです。これしないとgc()でメモリからハンドラが消える。

:おまけ
IL DASM便利です。