2025年魔方状态检测2

魔方状态检测2真神奇 续上贴 今天 我又将中心块的坐标列了出来 真就解决用一个魔方块的状态反推了魔方的颜色骚操作 我开发了一个魔方游戏 将 27 个小块组成的魔方置于原心 0 0 0 用坐标解决了魔方的旋转问题

大家好,我是讯享网,很高兴认识大家。

真神奇!!!

续上贴,今天,我又将中心块的坐标列了出来,真就解决用一个魔方块的状态反推了魔方的颜色骚操作。

我开发了一个魔方游戏,将27个小块组成的魔方置于原心(0,0,0),用坐标解决了魔方的旋转问题,用摄像机维着魔方转的方式,解决了魔方的观察问题,但不知是那面和那面,于是我在魔方的中心块上加了转动标示,后来遇到了一个天大的问题,要用魔方块的position和eulerAngles去推魔方块在打乱后形成的颜色分部。

如:


讯享网

看上面的图,M25是白蓝橙魔方块,要根据M2:(1.0, 1.0, -1.0):(270.0, 90, 0.0),它的坐标和它的欧拉角去推出F白U蓝R橙的结论,肯定有人说这不可能,绝对不可能,但是它确确实实的发生了,一个坐标加物体的旋转角就能表示一个物体的状态。

首先,我设定魔方转动标符相对魔方整体来说是静止不动的,它能很好的充当参照物,然后我确定了27个魔方块的欧拉角只有24种,为了好辨认我给它们编了号:

中心块可去到的位置有6种,旋转状态有4种

黄色中心块:                                     白色中心块:     

F(8,14,22,23)         B(7,11,13,17)        F(7,11,13,17)        B(8,14,22,23)

U(0,1,2,3)              D(5,12,15,19)        U(5,12,15,19)       D(0,1,2,3)

L(4,18,20,21)         R(6,9,10,16)         L(6,9,10,16)         R(4,18,20,21)

绿色中心块:                                    蓝色中心块:

F(0,4,5,6)             B(2,12,16,18)        F(2,12,16,18)        B(0,4,5,6)

U(7,9,14,20)         D(8,10,17,21)        U(8,10,17,21)        D(7,9,14,20)

L(1,11,15,22)        R(3,13,19,23)        L(3,13,19,23)        R(1,11,15,22)

红色中心块:                                    橙色中心块:

F(3,10,15,20)        B(1,9,19,21)         F(1,9,19,21)        B(3,10,15,20)

U(6,13,18,22)       D(4,11,16,23)       U(4,11,16,23)       D(6,13,18,22)

L(0,7,8,12)            R(2,5,14,17)        L(2,5,14,17)          R(0,7,8,12)

接下正式开始推:

M7代表白蓝橙魔方块,根据position的(1,1,-1),对应在UFR位置(此处为了简便没列出来),根eulerAngles的(270.0, 180.0, 0.0),对应第21种旋转的欧拉角,则:

U F R和白 蓝 橙要组成一个正确的组合。

U F R分别对应是什么颜色呢?

答案:去上面找。

如U:则去找白 蓝 橙的U是否包括了这第21种欧拉角,于是找到蓝色中心块的U(8,10,17,21),则U对应则是蓝。

如F: 则去找白 蓝 橙的F是否包括了这第21种欧拉角,于是找到白色中心块的R(4,18,20,21),则R对应则是白色。

如R: 则去找白 蓝 橙的R是否包括了这第21种欧拉角,于是找到橙色中心块的F(1,9,19,21),则F对应则是橙色。

根据坐标和欧拉角来推出的的组合则是:U蓝R白F

或者换一种思路:

输入白色,在白色中心块那找,得到R;输入蓝色,在蓝色中心块那找,得到U;输入橙色,在橙色中心块那找得到F;则同为U蓝R白F

棱块和中心块都是同理,上面的表相当于用颜色和旋转状态得到对应的位置。

作用不仅如此,还有可以很轻易的检测魔方它是颜色同面,如检测魔方的第三阶段的翻色是否全部成功:

代码实现:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class MofanRestore : MonoBehaviour { public static MofanRestore Instance = null; int n; string mofanColor; string str; private void Start() { Instance = this; } //确定魔方的状态 public string MofanStata(string mofanName) { n = int.Parse(mofanName.Substring(1)) - 1; int mofanNum = rType(GameManager.Instance.cubePrefabList[n].transform.rotation.ToString()); mofanColor = mofanReColor(mofanName); switch (mofanColor.Length) { case 1: str = A(mofanColor, mofanNum); break; case 2: str = A(mofanColor[0].ToString(), mofanNum)+A(mofanColor[1].ToString(), mofanNum); break; case 3: str = A(mofanColor[0].ToString(), mofanNum) +A(mofanColor[1].ToString(), mofanNum)+ A(mofanColor[2].ToString(), mofanNum); break; } return str; } string A(string mofanColor,int mofanNum) { switch (mofanColor) { case "绿": case "蓝": switch (mofanNum) { //F或B case 0: case 4: case 5: case 6: if (mofanColor == "绿") return "F" + mofanColor; return "B" + mofanColor; case 2: case 12: case 16: case 18: if (mofanColor == "绿") return "B" + mofanColor; return "F" + mofanColor; //U或D case 7: case 9: case 14: case 20: if (mofanColor == "绿") return "U" + mofanColor; return "D" + mofanColor; case 8: case 10: case 17: case 21: if (mofanColor == "绿") return "D" + mofanColor; return "U" + mofanColor; //L或R case 1: case 11: case 15: case 22: if (mofanColor == "绿") return "L" + mofanColor; return "R" + mofanColor; case 3: case 13: case 19: case 23: if (mofanColor == "绿") return "R" + mofanColor; return "L" + mofanColor; } break; case "红": case "橙": switch (mofanNum) { //F或B case 1: case 9: case 19: case 21: if (mofanColor == "红") return "B" + mofanColor; return "F" + mofanColor; case 3: case 10: case 15: case 20: if (mofanColor == "红") return "F" + mofanColor; return "B" + mofanColor; //U或D case 4: case 11: case 16: case 23: if (mofanColor == "红") return "D" + mofanColor; return "U" + mofanColor; case 6: case 13: case 18: case 22: if (mofanColor == "红") return "U" + mofanColor; return "D" + mofanColor; //L或R case 2: case 5: case 14: case 17: if (mofanColor == "红") return "R" + mofanColor; return "L" + mofanColor; case 0: case 7: case 8: case 12: if (mofanColor == "红") return "L" + mofanColor; return "R" + mofanColor; } break; case "黄": case "白": switch (mofanNum) { //F或B case 8: case 14: case 22: case 23: if (mofanColor == "黄") return "F" + mofanColor; return "B" + mofanColor; case 7: case 11: case 13: case 17: if (mofanColor == "黄") return "B" + mofanColor; return "F" + mofanColor; //U或D case 0: case 1: case 2: case 3: if (mofanColor == "黄") return "U" + mofanColor; return "D" + mofanColor; case 5: case 12: case 15: case 19: if (mofanColor == "黄") return "D" + mofanColor; return "U" + mofanColor; //L或R case 4: case 18: case 20: case 21: if (mofanColor == "黄") return "L" + mofanColor; return "R" + mofanColor; case 6: case 9: case 10: case 16: if (mofanColor == "黄") return "R" + mofanColor; return "L" + mofanColor; } break; } return ""; } //魔方块编号转对应颜色 public string mofanReColor(string mofanName) { switch (mofanName) { #region 中心块 case "M11": return "绿"; case "M17": return "蓝"; case "M5": return "红"; case "M23": return "橙"; case "M13": return "白"; case "M15": return "黄"; #endregion #region 角块 case "M21": return "黄绿橙"; case "M27": return "黄橙蓝"; case "M9": return "黄蓝红"; case "M3": return "黄红绿"; case "M7": return "白蓝红"; case "M1": return "白红绿"; case "M19": return "白绿橙"; case "M25": return "白橙蓝"; #endregion #region 棱块 case "M6": return "黄红"; case "M18": return "黄蓝"; case "M24": return "黄橙"; case "M12": return "黄绿"; case "M4": return "白红"; case "M10": return "白绿"; case "M22": return "白橙"; case "M16": return "白蓝"; case "M8": return "蓝红"; case "M20": return "绿橙"; case "M2": return "绿红"; case "M26": return "蓝橙"; #endregion } return ""; } //总24个状态角度,状态角度转成一个编号 public int rType(string s) { switch (s) { #region 0-8 case "(0.0, 0.0, 0.0)": case "(0.0, 0.0, 0.0, 1.0)": case "(0.0, 0.0, 0.0, -1.0)": return 0; case "(0.0, 90.0, 0.0)": case "(0.0, 0.7, 0.0, 0.7)": case "(0.0, -0.7, 0.0, -0.7)": return 1; case "(0.0, 180.0, 0.0)": case "(0.0, -1.0, 0.0, 0.0)": case "(0.0, 1.0, 0.0, 0.0)": return 2; case "(0.0, 270.0, 0.0)": case "(0.0, -0.7, 0.0, 0.7)": case "(0.0, 0.7, 0.0, -0.7)": return 3; case "(0.0, 0.0, 90.0)": case "(0.0, 0.0, -0.7, -0.7)": case "(0.0, 0.0, 0.7, 0.7)": return 4; case "(0.0, 0.0, 180.0)": case "(0.0, 0.0, 1.0, 0.0)": case "(0.0, 0.0, -1.0, 0.0)": return 5; case "(0.0, 0.0, 270.0)": case "(0.0, 0.0, 0.7, -0.7)": case "(0.0, 0.0, -0.7, 0.7)": return 6; case "(90.0, 0.0, 0.0)": case "(0.7, 0.0, 0.0, 0.7)": case "(-0.7, 0.0, 0.0, -0.7)": return 7; case "(270.0, 0.0, 0.0)": case "(-0.7, 0.0, 0.0, 0.7)": case "(0.7, 0.0, 0.0, -0.7)": return 8; #endregion #region 9-23 case "(90.0, 90.0, 0.0)": case "(-0.5, -0.5, 0.5, -0.5)": case "(0.5, 0.5, -0.5, 0.5)": return 9; case "(270.0, 270.0, 0.0)": case "(-0.5, -0.5, -0.5, 0.5)": case "(0.5, 0.5, 0.5, -0.5)": return 10; case "(0.0, 90.0, 90.0)": case "(0.5, 0.5, 0.5, 0.5)": case "(-0.5, -0.5, -0.5, -0.5)": return 11; case "(0.0, 180.0, 180.0)": case "(1.0, 0.0, 0.0, 0.0)": case "(-1.0, 0.0, 0.0, 0.0)": return 12; case "(0.0, 270.0, 270.0)": case "(-0.5, 0.5, 0.5, -0.5)": case "(0.5, -0.5, -0.5, 0.5)": return 13; case "(90.0, 180.0, 0.0)": case "(0.0, -0.7, 0.7, 0.0)": case "(0.0, 0.7, -0.7, 0.0)": return 14; case "(0.0, 90.0, 180.0)": case "(-0.7, 0.0, -0.7, 0.0)": case "(0.7, 0.0, 0.7, 0.0)": return 15; case "(0.0, 180.0, 90.0)": case "(-0.7, -0.7, 0.0, 0.0)": case "(0.7, 0.7, 0.0, 0.0)": return 16; case "(270.0, 180.0, 0.0)": case "(0.0, -0.7, -0.7, 0.0)": case "(0.0, 0.7, 0.7, 0.0)": return 17; case "(0.0, 180.0, 270.0)": case "(0.7, -0.7, 0.0, 0.0)": case "(-0.7, 0.7, 0.0, 0.0)": return 18; case "(0.0, 270.0, 180.0)": case "(0.7, 0.0, -0.7, 0.0)": case "(-0.7, 0.0, 0.7, 0.0)": return 19; case "(90.0, 270.0, 0.0)": case "(-0.5, 0.5, -0.5, -0.5)": case "(0.5, -0.5, 0.5, 0.5)": return 20; case "(270.0, 90.0, 0.0)": case "(0.5, -0.5, -0.5, -0.5)": case "(-0.5, 0.5, 0.5, 0.5)": return 21; case "(0.0, 90.0, 270.0)": case "(-0.5, 0.5, -0.5, 0.5)": case "(0.5, -0.5, 0.5, -0.5)": return 22; case "(0.0, 270.0, 90.0)": case "(-0.5, -0.5, 0.5, 0.5)": case "(0.5, 0.5, -0.5, -0.5)": return 23; #endregion default: return -1; } } } 

讯享网

小讯
上一篇 2025-04-05 19:47
下一篇 2025-02-22 09:54

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/29450.html