fuyofuto
03/09/2025, 1:12 PMhi03
03/09/2025, 2:05 PMjs
//回転する処理
GL11.glPushMatrix();
GL11.glTranslatef(x, y, z);//元の位置に戻る
GL11.glRotatef(angle, 0, 1, 0);//回転する 引数の2, 3, 4番目は回転軸のベクトルX, Y, Z
GL11.glTranslatef(-x, -y, -z);//原点へ移動する
parts.render(renderer);//描画する
GL11.glPopMatrix();
//これとほぼ同等の処理がRTM側にも実装されているため、以下のように書くことも可能
GL11.glPushMatrix();
renderer.rotate("Y", angle, x, y, z);//移動&回転の処理
parts.render(renderer);//描画する
GL11.glPopMatrix();
文字列から特定の要素を抜き出すには正規表現/RegExpを使用します。
js
//文字列から特定の要素を抜き出す(RegExp/正規表現)
var name = entity.getModelName();//jsonから名前を取得
var name = entity.getResourceState().getName();//モデル選択画面で設定した名前から取得(多分)
var angle = 0;
var match = name.match(/Angle(\d+)/);//文字列中の Angle◯◯ (◯=数字)にマッチする部分を取得
if (match) {//matchがない場合はスルー
angle = parseInt(match[1]);//カッコで囲った数字部分 (\d+) の中身を拾って文字列型から数値型に変換
}
正規表現は結構奥深いので色々調べてみてくださいfuyofuto
03/09/2025, 3:10 PMfuyofuto
03/09/2025, 3:20 PMfuyofuto
03/09/2025, 3:21 PMfuyofuto
03/09/2025, 3:21 PMfuyofuto
03/09/2025, 3:22 PMpiposen_0801
03/09/2025, 3:22 PMfuyofuto
03/09/2025, 3:23 PMpiposen_0801
03/09/2025, 3:23 PMpiposen_0801
03/09/2025, 3:23 PMfuyofuto
03/09/2025, 3:24 PMpiposen_0801
03/09/2025, 3:26 PMpiposen_0801
03/09/2025, 3:26 PMfuyofuto
03/09/2025, 3:27 PMpiposen_0801
03/09/2025, 3:27 PMpiposen_0801
03/09/2025, 3:28 PMpiposen_0801
03/09/2025, 3:28 PMfuyofuto
03/09/2025, 3:30 PMfuyofuto
03/09/2025, 3:30 PMpiposen_0801
03/09/2025, 3:30 PMfuyofuto
03/09/2025, 3:33 PMfuyofuto
03/09/2025, 3:33 PMpiposen_0801
03/09/2025, 3:33 PMfuyofuto
03/09/2025, 3:33 PMfuyofuto
03/09/2025, 3:34 PMpiposen_0801
03/09/2025, 3:35 PMpiposen_0801
03/09/2025, 3:35 PMpiposen_0801
03/09/2025, 3:36 PMfuyofuto
03/09/2025, 3:37 PMfuyofuto
03/09/2025, 3:37 PMpiposen_0801
03/09/2025, 3:37 PMpiposen_0801
03/09/2025, 3:38 PMfuyofuto
03/09/2025, 3:41 PMpiposen_0801
03/09/2025, 3:42 PMjavascript
main.render(renderer);
if(entity){
var angle = entity.getResourceState().getName();
}else{
var angle = 0;
};
var x1 = 0;
var y1 = 0;
var z1 = 0;
GL11.glPushMatrix();
GL11.glTranslatef(x1, y1, z1);
GL11.glRotatef(angle, 0, 1, 0);
GL11.glTranslatef(-x1, -y1, -z1);
left.render(renderer);
GL11.glPopMatrix();
var x2 = 0;
var y2 = 0;
var z2 = 0;
GL11.glPushMatrix();
GL11.glTranslatef(x2, y2, z2);
GL11.glRotatef(angle, 0, 1, 0);
GL11.glTranslatef(-x2, -y2, -z2);
right.render(renderer);
GL11.glPopMatrix();
でどうでしょう。x1,y1,z1には左灯の軸の座標、x2,y2,z2には右灯の軸の座標が入ります。fuyofuto
03/09/2025, 3:43 PMpiposen_0801
03/09/2025, 3:43 PMjavascript
main = renderer.registerParts(new Parts("○○"));
left = renderer.registerParts(new Parts("○○"));
right = renderer.registerParts(new Parts("○○"));fuyofuto
03/09/2025, 3:44 PMfuyofuto
03/09/2025, 3:44 PMpiposen_0801
03/09/2025, 3:47 PMpiposen_0801
03/09/2025, 3:50 PMfuyofuto
03/09/2025, 3:51 PMfuyofuto
03/09/2025, 3:51 PMfuyofuto
03/10/2025, 8:36 AMfuyofuto
03/10/2025, 8:36 AMfuyofuto
03/10/2025, 8:42 AMfuyofuto
03/10/2025, 8:49 AMfuyofuto
03/10/2025, 8:49 AMfuyofuto
03/10/2025, 8:50 AMhi03
03/10/2025, 11:45 AMjs
var name = entity.getResourceState().getName();
var angle = 0;//デフォルト値
var pattern = /^-?\d+$/;
if (pattern.test(name) {//pattern(正規表現)に一致するかどうかをチェック
angle = parseInt(name, 10);//nameを数値型に変換してangleにいれる
}
正規表現の簡単な解説
・^ ⋯ $ 完全一致のチェック
・-? -が0個か1個ある
・\d+ 数値(1桁)が1個以上繰り返されているfuyofuto
03/10/2025, 11:56 AMfuyofuto
03/10/2025, 11:56 AMおれはでんしゃ
03/11/2025, 12:19 PMおれはでんしゃ
03/11/2025, 12:20 PMおれはでんしゃ
03/11/2025, 12:24 PMおれはでんしゃ
03/11/2025, 12:24 PMcactus_pc28k
03/11/2025, 12:25 PMcactus_pc28k
03/11/2025, 12:25 PMおれはでんしゃ
03/11/2025, 12:26 PMcactus_pc28k
03/11/2025, 12:26 PMおれはでんしゃ
03/11/2025, 12:27 PMおれはでんしゃ
03/11/2025, 12:29 PMおれはでんしゃ
03/11/2025, 12:30 PMcactus_pc28k
03/11/2025, 12:30 PMおれはでんしゃ
03/11/2025, 12:33 PMfuyofuto
03/11/2025, 12:34 PMfuyofuto
03/11/2025, 12:35 PMvar renderClass = 'jp.ngt.rtm.render.MachinePartsRenderer';
importPackage(Packages.org.lwjgl.opengl);
importPackage(Packages.jp.ngt.rtm.render);
//オブジェクト定義
function init(par1, par2) {
main = renderer.registerParts(new Parts('base'));
main2 = renderer.registerParts(new Parts('base2'));
left = renderer.registerParts(new Parts('left'));
right = renderer.registerParts(new Parts('right'));
light1 = renderer.registerParts(new Parts('light1'));
light2 = renderer.registerParts(new Parts('light2'));
}
function render(entity,pass,par3) {
GL11.glPushMatrix();
//名前の取得
if(entity){
var angle = entity.getResourceState().getName();
}else{
var angle = 0;
};
var light = renderer.getLightState(entity);
var x1 = -0.42; //左の警報灯器のX軸
var y1 = 2.5; //左の警報灯器のY軸
var z1 = 0; //左の警報灯器のZ軸
var x2 = 0.42; //右の警報灯器のX軸
var y2 = 2.5; //右の警報灯器のY軸
var z2 = 0; //右の警報灯器のZ軸fuyofuto
03/11/2025, 12:35 PM//発光なし
if(pass == 0){
//描画
main.render(renderer); //base描画
GL11.glPushMatrix();
GL11.glRotatef(angle, 0, 1, 0);
main2.render(renderer); //警標描画
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glTranslatef(x1, y1, z1);
GL11.glRotatef(angle, 0, 1, 0);
GL11.glTranslatef(-x1, -y1, -z1);
left.render(renderer); //左描画
light2.render(renderer);
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glTranslatef(x2, y2, z2);
GL11.glRotatef(angle, 0, 1, 0);
GL11.glTranslatef(-x2, -y2, -z2);
right.render(renderer); //右描画
light1.render(renderer);
GL11.glPopMatrix();
switch(light) { //レッドストーン信号入力時に発光しない
case 0:
GL11.glPushMatrix();
GL11.glTranslatef(x1, y1, z1);
GL11.glRotatef(angle, 0, 1, 0);
GL11.glTranslatef(-x1, -y1, -z1);
light2.render(renderer);
GL11.glPopMatrix();
break;
case 1:
GL11.glPushMatrix();
GL11.glTranslatef(x2, y2, z2);
GL11.glRotatef(angle, 0, 1, 0);
GL11.glTranslatef(-x2, -y2, -z2);
light1.render(renderer);
GL11.glPopMatrix();
break;
}fuyofuto
03/11/2025, 12:35 PM//発光あり
}else if(pass == 2){
switch(light) { //レッドストーン信号入力時に発光する
case 0:
GL11.glPushMatrix();
GL11.glTranslatef(x2, y2, z2);
GL11.glRotatef(angle, 0, 1, 0);
GL11.glTranslatef(-x2, -y2, -z2);
light1.render(renderer);
GL11.glPopMatrix();
break;
case 1:
GL11.glPushMatrix();
GL11.glTranslatef(x1, y1, z1);
GL11.glRotatef(angle, 0, 1, 0);
GL11.glTranslatef(-x1, -y1, -z1);
light2.render(renderer);
GL11.glPopMatrix();
break;
}
}
GL11.glPopMatrix();
}fuyofuto
03/11/2025, 12:36 PMfuyofuto
03/11/2025, 12:36 PMfuyofuto
03/11/2025, 12:36 PMfuyofuto
03/11/2025, 12:38 PMcactus_pc28k
03/11/2025, 12:39 PMcactus_pc28k
03/11/2025, 12:40 PMcactus_pc28k
03/11/2025, 12:41 PMおれはでんしゃ
03/11/2025, 12:42 PMcactus_pc28k
03/11/2025, 12:43 PMcactus_pc28k
03/11/2025, 12:43 PMcactus_pc28k
03/11/2025, 12:45 PMfuyofuto
03/11/2025, 12:47 PMfuyofuto
03/11/2025, 12:47 PMcactus_pc28k
03/11/2025, 12:48 PMcactus_pc28k
03/11/2025, 12:49 PMfuyofuto
03/11/2025, 12:50 PMcactus_pc28k
03/11/2025, 12:50 PMcactus_pc28k
03/11/2025, 12:51 PMおれはでんしゃ
03/11/2025, 12:56 PMおれはでんしゃ
03/11/2025, 12:57 PMcactus_pc28k
03/11/2025, 12:58 PMhi03
03/11/2025, 12:58 PMjs
var modelDataList = {
default: {
x1: 0.0, y1: 0, z1: 0.0,
x2: 0.0, y2: 0, z2: 0.0
},
fumikiri1: {//fumikiri1 がモデル名に相当する
x1: 0.25, y1: 0, z1: 0.05,
x2: -0.25, y2: 0, z2: 0.05
},
fumikiri2: {
x1: 0.5, y1: 0, z1: 0.05,
x2: -0.5, y2: 0, z2: 0.05
},
fumikiri3: {
x1: 0.125, y1: 0, z1: 0.05,
x2: -0.125, y2: 0, z2: 0.05
}
}
var modelName = entity.getResourceState().getName();//モデルのjsonで設定した名前
var axisPos = modelDataList[modelName];//modelDataList[モデル名] でテーブルを引く
if (axisPos === undefined) axisPos = axisPos.default;//未定義であればmodelDataList.defaultを当てる
var x1 = axisPos.x1;
var y1 = axisPos.y1;
var z1 = axisPos.z1;
var x2 = axisPos.x2;
var y2 = axisPos.y2;
var z2 = axisPos.z2;cactus_pc28k
03/11/2025, 12:58 PMcactus_pc28k
03/11/2025, 12:58 PMhi03
03/11/2025, 12:58 PMfuyofuto
03/11/2025, 12:59 PMhi03
03/11/2025, 1:00 PMおれはでんしゃ
03/11/2025, 1:05 PMpiposen_0801
03/11/2025, 2:00 PMjavascript
var modelName = entity.getModelName();
var axisList = modelName.split("_")
//axisList.map((item) => isNaN(Number(item)) ? item : Number(item));
var x1 = axisList[1];
var y1 = axisList[2];
var z1 = axisList[3];
var x2 = axisList[4];
var y2 = axisList[5];
var z2 = axisList[6];
例えば"wideSignal_-0.42_2.5_0_0.42_2.5_0"という名前なら
axisList[0] = "wideSignal", axisList[1] = -0.42...というふうに続き、axisList[1]の部分から回転軸の座標に入力されます。