真神奇!!!
续上贴,今天,我又将中心块的坐标列了出来,真就解决用一个魔方块的状态反推了魔方的颜色骚操作。
我开发了一个魔方游戏,将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; } } }
讯享网

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