FMBE をベースに、エンティティの判定を残したままブロックをリアルに回転させる仕組みを作りました。
かなり試行錯誤した式になっているので、数学に強い方がいれば、もっとシンプルに・きれいにできないか教えていただけると嬉しいです。
【できること】
・エンティティの挙動をそのまま維持(殴る/吹き飛ばす/押して動かす、コマンドの実行起点にもなる)
・最終的にいずれかの面が下を向き、安定した姿勢で止まる
【コマンド紹介】
① 以下常時実行用のコマンドです。チェーンで繋いでください。
effect @e[type=fox,name=rolling_block,tag=!fmbe:rolling_block] invisibility infinite 100 true
effect @e[type=fox,name=rolling_block,tag=!fmbe:rolling_block] slowness infinite 255 true
effect @e[type=fox,name=rolling_block,tag=!fmbe:rolling_block] resistance infinite 255 true
replaceitem entity @e[type=fox,name=rolling_block,tag=!fmbe:rolling_block] slot.weapon.mainhand 0 oak_planks 1
tag @e[type=fox,name=rolling_block] add fmbe:rolling_block
### FMBEのベースとなる定義
playanimation @e[tag=fmbe:rolling_block] animation.player.sleeping _ 0 “v.xpos=v.xpos??0;v.ypos=v.ypos??0;v.zpos=v.zpos??0;v.xrot=v.xrot??0;v.yrot=v.yrot??0;v.zrot=v.zrot??0;v.scale=v.scale??1;v.extend_scale=v.extend_scale??1;v.extend_xrot=v.extend_xrot??-90;v.extend_yrot=v.extend_yrot??0;v.xbasepos=v.xbasepos??0;v.ybasepos=v.ybasepos??0;v.zbasepos=v.zbasepos??0;v.F.r5=-math.sin(v.xrot);v.F.r2=-math.sin(v.yrot);v.F.r3=-math.sin(v.zrot);v.F.r4=math.cos(v.zrot);v.F.r8=math.cos(v.yrot);v.F.r0=-v.F.r5*v.F.r2*v.F.r3+v.F.r8*v.F.r4;v.F.r1=-v.F.r5*v.F.r2*v.F.r4-v.F.r8*v.F.r3;v.F.r6=-v.F.r5*v.F.r8*v.F.r3-v.F.r2*v.F.r4;v.F.r7=-v.F.r5*v.F.r8*v.F.r4+v.F.r2*v.F.r3;v.F.r2=v.F.r2*math.cos(v.xrot);v.F.r3=v.F.r3*math.cos(v.xrot);v.F.r4=v.F.r4*math.cos(v.xrot);v.F.r8=v.F.r8*math.cos(v.xrot);v.F.e0=math.cos(v.extend_yrot);v.F.e4=math.cos(v.extend_xrot);v.F.e5=-math.sin(v.extend_xrot);v.F.e6=math.sin(v.extend_yrot);v.F.e1=v.F.e5*v.F.e6;v.F.e2=-v.F.e4*v.F.e6;v.F.e7=-v.F.e5*v.F.e0;v.F.e8=v.F.e4*v.F.e0;v.F.p0=v.F.r0*v.F.e0+v.F.r2*v.F.e6;v.F.p1=v.F.r0*v.F.e1+v.F.r1*v.F.e4+v.F.r2*v.F.e7;v.F.p2=v.F.r0*v.F.e2+v.F.r1*v.F.e5+v.F.r2*v.F.e8;v.F.p3=v.F.r3*v.F.e0+v.F.r5*v.F.e6;v.F.p4=v.F.r3*v.F.e1+v.F.r4*v.F.e4+v.F.r5*v.F.e7;v.F.p5=v.F.r3*v.F.e2+v.F.r4*v.F.e5+v.F.r5*v.F.e8;v.F.p6=v.F.r6*v.F.e0+v.F.r8*v.F.e6;v.F.p7=v.F.r6*v.F.e1+v.F.r7*v.F.e4+v.F.r8*v.F.e7;v.F.p8=v.F.r6*v.F.e2+v.F.r7*v.F.e5+v.F.r8*v.F.e8;” controller.animation.fox.move
playanimation @e[tag=fmbe:rolling_block] animation.creeper.swelling _ 0 “v.swelling_scale2=v.extend_scale*(v.swelling_scale1=(v.F.s=math.sqrt(32/7*v.scale)));” wiki.fmbe.3d_blocks.anim1
playanimation @e[tag=fmbe:rolling_block] animation.ender_dragon.neck_head_movement _ 0 “v.head_position_x=-16/v.F.s*((v.xpos-1)*v.F.p1+(v.ypos-1/128)*v.F.p4+v.zpos*v.F.p7+(v.xbasepos*v.F.e1+(v.ybasepos+10/7)*v.extend_scale*v.F.e4+(v.zbasepos-16/7)*v.F.e7)*v.scale);v.head_position_y=16/v.F.s*(((v.xpos-1)*v.F.p2+(v.ypos-1/128)*v.F.p5+v.zpos*v.F.p8)/v.extend_scale+(v.xbasepos*v.F.e2+(v.ybasepos+10/7)*v.extend_scale*v.F.e5+(v.zbasepos-16/7)*v.F.e8)*v.scale);v.head_position_z=16/v.F.s*((v.xpos-1)*v.F.p0+(v.ypos-1/128)*v.F.p3+v.zpos*v.F.p6+(v.xbasepos*v.F.e0+(v.zbasepos-16/7)*v.F.e6)*v.scale);v.head_rotation_x=v.F.e6?math.atan2(0,-v.F.e6):math.atan2(-v.F.e8,v.F.e5);v.head_rotation_y=math.asin(-v.F.e0);v.head_rotation_z=v.F.e6?math.atan2(-v.F.e2,-v.F.e1):0;” wiki.fmbe.3d_blocks.anim2
playanimation @e[tag=fmbe:rolling_block] animation.warden.move _ 0 “v.body_x_rot=v.F.p5||v.F.p3?math.atan2(v.F.p5,-v.F.p3):math.atan2(-v.F.p0,-v.F.p2);v.body_z_rot=v.F.p5||v.F.p3?math.atan2(-v.F.p1,v.F.p7):0;” wiki.fmbe.3d_blocks.anim3
playanimation @e[tag=fmbe:rolling_block] animation.player.attack.rotations _ 0 “v.attack_body_rot_y=math.asin(-v.F.p4);” wiki.fmbe.3d_blocks.anim4
# 挙動の制御パラメータ
playanimation @e[tag=fmbe:rolling_block] animation.player.attack.positions _ 0 “v.roll_angle_per_block=90;v.fall_angular_velocity=0.1;v.fall_bounce_ratio=0.67;v.velocity_threshold_to_stop=0.03;v.velocity_damping=0.5;v.scale=v.scale??1;” cfg
playanimation @e[tag=fmbe:rolling_block] animation.player.attack.positions _ 0 “v.R0=v.R0??1;v.R1=v.R1??0;v.R2=v.R2??0;v.R3=v.R3??0;v.R4=v.R4??1;v.R5=v.R5??0;v.R6=v.R6??0;v.R7=v.R7??0;v.R8=v.R8??1;v.prev_x=v.prev_x??q.position(0);v.prev_z=v.prev_z??q.position(2);” init
playanimation @e[tag=fmbe:rolling_block] animation.player.attack.positions _ 0 “v.dx=q.position(0)-v.prev_x;v.dz=q.position(2)-v.prev_z;v.dist=math.sqrt(v.dx*v.dx+v.dz*v.dz);v.inv=v.dist>0.000001?1/v.dist:0;v.ax=v.dz*v.inv;v.az=-v.dx*v.inv;v.ang=v.dist*v.roll_angle_per_block;v.lx=v.R0*v.ax+v.R6*v.az;v.ly=v.R1*v.ax+v.R7*v.az;v.lz=v.R2*v.ax+v.R8*v.az;v.c=math.cos(v.ang);v.s=math.sin(v.ang);v.t=1-v.c;v.d0=v.t*v.lx*v.lx+v.c;v.d1=v.t*v.lx*v.ly-v.s*v.lz;v.d2=v.t*v.lx*v.lz+v.s*v.ly;v.d3=v.t*v.lx*v.ly+v.s*v.lz;v.d4=v.t*v.ly*v.ly+v.c;v.d5=v.t*v.ly*v.lz-v.s*v.lx;v.d6=v.t*v.lx*v.lz-v.s*v.ly;v.d7=v.t*v.ly*v.lz+v.s*v.lx;v.d8=v.t*v.lz*v.lz+v.c;v.m0=v.R0*v.d0+v.R1*v.d3+v.R2*v.d6;v.m1=v.R0*v.d1+v.R1*v.d4+v.R2*v.d7;v.m2=v.R0*v.d2+v.R1*v.d5+v.R2*v.d8;v.m3=v.R3*v.d0+v.R4*v.d3+v.R5*v.d6;v.m4=v.R3*v.d1+v.R4*v.d4+v.R5*v.d7;v.m5=v.R3*v.d2+v.R4*v.d5+v.R5*v.d8;v.m6=v.R6*v.d0+v.R7*v.d3+v.R8*v.d6;v.m7=v.R6*v.d1+v.R7*v.d4+v.R8*v.d7;v.m8=v.R6*v.d2+v.R7*v.d5+v.R8*v.d8;v.R0=v.m0;v.R1=v.m1;v.R2=v.m2;v.R3=v.m3;v.R4=v.m4;v.R5=v.m5;v.R6=v.m6;v.R7=v.m7;v.R8=v.m8;” roll
playanimation @e[tag=fmbe:rolling_block] animation.player.attack.positions _ 0 “v.speed=math.max((v.speed??0)*v.velocity_damping,v.dist);v.stopped=v.speed<v.velocity_threshold_to_stop;(v.stopped)?{(!(v.was_stopped??0))?{v.a3=math.abs(v.R3);v.a4=math.abs(v.R4);v.a5=math.abs(v.R5);v.face=(v.a3>=v.a4&&v.a3>=v.a5)?0:((v.a4>=v.a5)?1:2);};v.was_stopped=1;(v.face<0.5)?{v.upx=v.R0;v.upy=v.R3;v.upz=v.R6;};(v.face>=0.5&&v.face<1.5)?{v.upx=v.R1;v.upy=v.R4;v.upz=v.R7;};(v.face>=1.5)?{v.upx=v.R2;v.upy=v.R5;v.upz=v.R8;};v.dir=v.upy>=0?1:-1;v.tiltx=-v.upz*v.dir;v.tiltz=v.upx*v.dir;v.spinx=v.spinx*v.fall_bounce_ratio+v.tiltx*v.fall_angular_velocity;v.spinz=v.spinz*v.fall_bounce_ratio+v.tiltz*v.fall_angular_velocity;(v.tiltx*v.tiltx+v.tiltz*v.tiltz>0.0004||v.spinx*v.spinx+v.spinz*v.spinz>0.00002)?{v.m0=v.R0-v.spinz*v.R3;v.m1=v.R1-v.spinz*v.R4;v.m2=v.R2-v.spinz*v.R5;v.m3=v.R3+v.spinz*v.R0-v.spinx*v.R6;v.m4=v.R4+v.spinz*v.R1-v.spinx*v.R7;v.m5=v.R5+v.spinz*v.R2-v.spinx*v.R8;v.m6=v.R6+v.spinx*v.R3;v.m7=v.R7+v.spinx*v.R4;v.m8=v.R8+v.spinx*v.R5;v.R0=v.m0;v.R1=v.m1;v.R2=v.m2;v.R3=v.m3;v.R4=v.m4;v.R5=v.m5;v.R6=v.m6;v.R7=v.m7;v.R8=v.m8;}:{v.spinx=0;v.spinz=0;};}:{v.was_stopped=0;v.spinx=0;v.spinz=0;};” settle
playanimation @e[tag=fmbe:rolling_block] animation.player.attack.positions _ 0 “v.len=math.sqrt(v.R0*v.R0+v.R1*v.R1+v.R2*v.R2);v.R0=v.R0/v.len;v.R1=v.R1/v.len;v.R2=v.R2/v.len;v.dot=v.R3*v.R0+v.R4*v.R1+v.R5*v.R2;v.R3=v.R3-v.dot*v.R0;v.R4=v.R4-v.dot*v.R1;v.R5=v.R5-v.dot*v.R2;v.len=math.sqrt(v.R3*v.R3+v.R4*v.R4+v.R5*v.R5);v.R3=v.R3/v.len;v.R4=v.R4/v.len;v.R5=v.R5/v.len;v.R6=v.R1*v.R5-v.R2*v.R4;v.R7=v.R2*v.R3-v.R0*v.R5;v.R8=v.R0*v.R4-v.R1*v.R3;” normalize
playanimation @e[tag=fmbe:rolling_block] animation.player.attack.positions _ 0 “v.xrot=math.asin(-math.clamp(v.R5,-1,1));v.yrot=math.atan2(-v.R2,v.R8);v.zrot=math.atan2(-v.R3,v.R4);v.half=v.scale/2;v.lift=math.max(0,v.half*(math.abs(v.R3)+math.abs(v.R4)+math.abs(v.R5)-1));v.ypos=v.half+v.lift;v.prev_x=q.position(0);v.prev_z=q.position(2);” output
② 以下は、ブロックを召喚するコマンドです
summon fox ~~~~~ minecraft:as_adult rolling_block



コメント
なんかすごい..
このFMBEのコマンドってSwitchでも出来ますか?
頭イカれてるよ 良い意味で
データパック・アドオンにしてもいいですか?