免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4931 | 回复: 1

[C] unity引擎写的3D魔方 [复制链接]

论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
发表于 2019-01-18 14:55 |显示全部楼层
本帖最后由 __BlueGuy_ 于 2019-05-19 16:03 编辑

https://github.com/BlueGuy0818/MagicCube

cube.png

  1. using UnityEngine;

  2. public class Cube : MonoBehaviour
  3. {
  4.     struct RotateInfo
  5.     {
  6.         public string axis;
  7.         public float dir;
  8.         public float a;
  9.     };

  10.     const int TRANS = 2;
  11.     public Camera camera;
  12.     Vector3 offset;
  13.     public GameObject cubePrefab;
  14.     public GameObject cubeParent;
  15.     GameObject[] cubes = new GameObject[27];
  16.     Transform[] matx = new Transform[27];
  17.     Vector3 vecs;
  18.     Vector3 vece;
  19.     GameObject pickedNodes;
  20.     GameObject pickedNodee;
  21.     Vector3 vecms;
  22.     Vector3 vecme;
  23.     bool done = false;
  24.     RotateInfo rotateInfo;
  25.     bool isRotate = false;
  26.     float rotateDegree = 0;

  27.     void Start()
  28.     {
  29.         for (int i = 0; i < 27; i++)
  30.         {
  31.             cubes[i] = Instantiate(cubePrefab, new Vector3(0, 0, 0), Quaternion.identity);
  32.             cubes[i].transform.parent = cubeParent.transform;
  33.         }

  34.         for (int i = -1; i <= 1; i++)
  35.         {
  36.             for (int j = -1; j <= 1; j++)
  37.             {
  38.                 for (int k = -1; k <= 1; k++)
  39.                 {
  40.                     int number = 9 * (i + 1) + 3 * (j + 1) + (k + 2);
  41.                     GameObject cube = cubes[number-1];
  42.                     cube.name = "Cube" + number;
  43.                     cube.transform.Translate(new Vector3(i * TRANS, j * TRANS, k * TRANS));
  44.                     matx[number - 1] = cube.transform;
  45.                 }
  46.             }
  47.         }

  48.         offset = camera.transform.position - cubeParent.transform.position;
  49.     }

  50.     void Update()
  51.     {
  52.         if (Input.GetMouseButtonUp(0))
  53.         {
  54.             done = false;
  55.         }

  56.         if (isRotate)
  57.         {
  58.             if ((rotateDegree+3.0f) > 90)
  59.             {
  60.                 rotate(rotateInfo, 90 - rotateDegree);
  61.                 rotateDegree = 0;
  62.                 isRotate = false;
  63.                 return;
  64.             }

  65.             rotateDegree += 3.0f;
  66.             rotate(rotateInfo, 3.0f);
  67.             return;
  68.         }

  69.         if (Input.GetMouseButtonDown(0))
  70.         {
  71.             pickedNodes = null;
  72.             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  73.             RaycastHit hit;

  74.             if (Physics.Raycast(ray, out hit, 100))
  75.             {
  76.                 pickedNodes = hit.collider.gameObject;
  77.                 vecs = hit.point;
  78.             }

  79.             if (pickedNodes != null)
  80.             {
  81.                 for (int i = 0; i < 27; i++)
  82.                 {
  83.                     if (pickedNodes.name == cubes[i].name)
  84.                     {
  85.                         vecms = matx[i].transform.position;
  86.                         Debug.Log(pickedNodes.name);
  87.                     }
  88.                 }
  89.             }
  90.         }

  91.         if (Input.GetMouseButton(0))
  92.         {
  93.             if (!done)
  94.             {
  95.                 pickedNodee = null;
  96.                 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  97.                 RaycastHit hit;

  98.                 if (Physics.Raycast(ray, out hit, 100))
  99.                 {
  100.                     pickedNodee = hit.collider.gameObject;
  101.                     vece = hit.point;
  102.                 }

  103.                 if (pickedNodes != null)
  104.                 {
  105.                     if (pickedNodee != null)
  106.                     {
  107.                         for (int i = 0; i < 27; i++)
  108.                         {
  109.                             if (pickedNodee.name == cubes[i].name)
  110.                             {
  111.                                 vecme = matx[i].transform.position;
  112.                             }
  113.                         }
  114.                     }

  115.                     rotateInfo = rotationinfo();

  116.                     if (rotateInfo.axis != "")
  117.                     {
  118.                         done = true;
  119.                         isRotate = true;
  120.                     }
  121.                 }
  122.             }
  123.         }

  124.         Rotate();
  125.         Scale();
  126.     }

  127.     RotateInfo rotationinfo()
  128.     {
  129.         RotateInfo rotateInfo = new RotateInfo();
  130.         string axis = "";
  131.         float dir = 0.0f;
  132.         float a = 0.0f;

  133.         if ((Mathf.Abs(vecme.x - vecms.x) >= 0.01) || (Mathf.Abs(vecme.y - vecms.y) >= 0.01) || (Mathf.Abs(vecme.z - vecms.z) >= 0.01))
  134.         {
  135.             if ((Mathf.Abs(vecme.x - vecms.x) < 0.01) && (Mathf.Abs(vecme.y - vecms.y) < 0.01))
  136.             {
  137.                 if ((Mathf.Abs(Mathf.Abs(vece.x) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vecs.x) - 3.0f) < 0.01))
  138.                 {
  139.                     axis = "y";
  140.                     a = vecme.y / 100;
  141.                     float temp = (vece.z - vecs.z) * vece.x;
  142.                     dir = (-1) * temp / Mathf.Abs(temp);
  143.                 }
  144.                 else if ((Mathf.Abs(Mathf.Abs(vece.y) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vecs.y) - 3.0f) < 0.01))
  145.                 {
  146.                     axis = "x";
  147.                     a = vecme.x / 100;
  148.                     float temp = (vece.z - vecs.z) * vece.y;
  149.                     dir = temp / Mathf.Abs(temp);
  150.                 }
  151.             }
  152.             else if ((Mathf.Abs(vecme.x - vecms.x) < 0.01) && (Mathf.Abs(vecme.z - vecms.z) < 0.01))
  153.             {
  154.                 if ((Mathf.Abs(Mathf.Abs(vece.x) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vecs.x) - 3.0f) < 0.01))
  155.                 {
  156.                     axis = "z";
  157.                     a = vecme.z / 100;
  158.                     float temp = (vece.y - vecs.y) * vece.x;
  159.                     dir = temp / Mathf.Abs(temp);
  160.                 }
  161.                 else if ((Mathf.Abs(Mathf.Abs(vece.z) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vecs.z) - 3.0f) < 0.01))
  162.                 {
  163.                     axis = "x";
  164.                     a = vecme.x / 100;
  165.                     float temp = (vece.y - vecs.y) * vece.z;
  166.                     dir = (-1) * temp / Mathf.Abs(temp);
  167.                 }
  168.             }
  169.             else if ((Mathf.Abs(vecme.y - vecms.y) < 0.01) && (Mathf.Abs(vecme.z - vecms.z) < 0.01))
  170.             {
  171.                 if ((Mathf.Abs(Mathf.Abs(vece.y) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vecs.y) - 3.0f) < 0.01))
  172.                 {
  173.                     axis = "z";
  174.                     a = vecme.z / 100;
  175.                     float temp = (vece.x - vecs.x) * vece.y;
  176.                     dir = (-1) * temp / Mathf.Abs(temp);
  177.                 }
  178.                 else if ((Mathf.Abs(Mathf.Abs(vece.z) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vecs.z) - 3.0f) < 0.01))
  179.                 {
  180.                     axis = "y";
  181.                     a = vecme.y / 100;
  182.                     float temp = (vece.x - vecs.x) * vece.z;
  183.                     dir = temp / Mathf.Abs(temp);
  184.                 }
  185.             }
  186.         }
  187.         else if ((Mathf.Abs(vecme.x - vecms.x) < 0.01) && (Mathf.Abs(vecme.y - vecms.y) < 0.01) && (Mathf.Abs(vecme.z - vecms.z) < 0.01))
  188.         {
  189.             if (((Mathf.Abs(Mathf.Abs(vecs.x) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vece.y) - 3.0f) < 0.01)) ||
  190.                 ((Mathf.Abs(Mathf.Abs(vecs.y) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vece.x) - 3.0f) < 0.01)))
  191.             {
  192.                 if ((Mathf.Abs(vece.y - vecs.y) > 0.1) && (Mathf.Abs(vece.x - vecs.x) > 0.1))
  193.                 {
  194.                     axis = "z";
  195.                     a = vecme.z / 100;
  196.                     float temp = vecs.x * vece.y * (Mathf.Abs(vece.y) - Mathf.Abs(vecs.y));
  197.                     dir = temp / Mathf.Abs(temp);
  198.                 }
  199.             }
  200.             else if (((Mathf.Abs(Mathf.Abs(vecs.x) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vece.z) - 3.0f) < 0.01)) ||
  201.                 ((Mathf.Abs(Mathf.Abs(vecs.z) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vece.x) - 3.0f) < 0.01)))
  202.             {
  203.                 if ((Mathf.Abs(vece.z - vecs.z) > 0.1) && (Mathf.Abs(vece.x - vecs.x) > 0.1))
  204.                 {
  205.                     axis = "y";
  206.                     a = vecme.y / 100;
  207.                     float temp = vecs.z * vece.x * (Mathf.Abs(vece.x) - Mathf.Abs(vecs.x));
  208.                     dir = temp / Mathf.Abs(temp);
  209.                 }
  210.             }
  211.             else if (((Mathf.Abs(Mathf.Abs(vecs.z) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vece.y) - 3.0f) < 0.01)) ||
  212.                 ((Mathf.Abs(Mathf.Abs(vecs.y) - 3.0f) < 0.01) && (Mathf.Abs(Mathf.Abs(vece.z) - 3.0f) < 0.01)))
  213.             {
  214.                 if ((Mathf.Abs(vece.z - vecs.z) > 0.1) && (Mathf.Abs(vece.y - vecs.y) > 0.1))
  215.                 {
  216.                     axis = "x";
  217.                     a = vecme.x / 100;
  218.                     float temp = vecs.y * vece.z * (Mathf.Abs(vece.z) - Mathf.Abs(vecs.z));
  219.                     dir = temp / Mathf.Abs(temp);
  220.                 }
  221.             }
  222.         }

  223.         if (pickedNodee == null)
  224.         {
  225.             if (Mathf.Abs(Mathf.Abs(vecs.x) - 3.0f) < 0.01)
  226.             {
  227.                 axis = (Mathf.Abs(vece.y) >= Mathf.Abs(vece.z)) ? "z" : "y";
  228.                 string tempos = Mathf.Abs(vece.y) >= Mathf.Abs(vece.z) ? "y" : "z";

  229.                 if (axis == "z")
  230.                 {
  231.                     a = vecms.z / 100;
  232.                 }
  233.                 else
  234.                 {
  235.                     a = vecms.y / 100;
  236.                 }

  237.                 float temp;

  238.                 if (axis == "z")
  239.                 {
  240.                     if (tempos == "y")
  241.                     {
  242.                         temp = vecs.x * vece.y;
  243.                     }
  244.                     else
  245.                     {
  246.                         temp = vecs.x * vece.z;
  247.                     }
  248.                 }
  249.                 else
  250.                 {
  251.                     if (tempos == "y")
  252.                     {
  253.                         temp = (-1) * vecs.x * vece.y;
  254.                     }
  255.                     else
  256.                     {
  257.                         temp = (-1) * vecs.x * vece.z;
  258.                     }
  259.                 }

  260.                 dir = temp / Mathf.Abs(temp);
  261.             }
  262.             else if (Mathf.Abs(Mathf.Abs(vecs.y) - 3.0f) < 0.01)
  263.             {
  264.                 axis = (Mathf.Abs(vece.x) >= Mathf.Abs(vece.z)) ? "z" : "x";
  265.                 string tempos = Mathf.Abs(vece.x) >= Mathf.Abs(vece.z) ? "x" : "z";

  266.                 if (axis == "z")
  267.                 {
  268.                     a = vecms.z / 100;
  269.                 }
  270.                 else
  271.                 {
  272.                     a = vecms.x / 100;
  273.                 }

  274.                 float temp;

  275.                 if (axis == "x")
  276.                 {
  277.                     if (tempos == "x")
  278.                     {
  279.                         temp = vecs.y * vece.x;
  280.                     }
  281.                     else
  282.                     {
  283.                         temp = vecs.y * vece.z;
  284.                     }
  285.                 }
  286.                 else
  287.                 {
  288.                     if (tempos == "x")
  289.                     {
  290.                         temp = (-1) * vecs.y * vece.x;
  291.                     }
  292.                     else
  293.                     {
  294.                         temp = (-1) * vecs.y * vece.z;
  295.                     }
  296.                 }

  297.                 dir = temp / Mathf.Abs(temp);
  298.             }
  299.             else if (Mathf.Abs(Mathf.Abs(vecs.z) - 3.0f) < 0.01)
  300.             {
  301.                 axis = (Mathf.Abs(vece.y) >= Mathf.Abs(vece.x)) ? "x" : "y";
  302.                 string tempos = Mathf.Abs(vece.y) >= Mathf.Abs(vece.x) ? "y" : "x";

  303.                 if (axis == "x")
  304.                 {
  305.                     a = vecms.x / 100;
  306.                 }
  307.                 else
  308.                 {
  309.                     a = vecms.y / 100;
  310.                 }

  311.                 float temp;

  312.                 if (axis == "y")
  313.                 {
  314.                     if (tempos == "x")
  315.                     {
  316.                         temp = vecs.z * vece.x;
  317.                     }
  318.                     else
  319.                     {
  320.                         temp = vecs.z * vece.y;
  321.                     }
  322.                 }
  323.                 else
  324.                 {
  325.                     if (tempos == "x")
  326.                     {
  327.                         temp = (-1) * vecs.z * vece.x;
  328.                     }
  329.                     else
  330.                     {
  331.                         temp = (-1) * vecs.z * vece.y;
  332.                     }
  333.                 }

  334.                 dir = temp / Mathf.Abs(temp);
  335.             }
  336.         }

  337.         rotateInfo.axis = axis;
  338.         rotateInfo.dir = dir;
  339.         rotateInfo.a = a;

  340.         return rotateInfo;
  341.     }

  342.     void rotate(RotateInfo rotateInfo, float degree)
  343.     {
  344.         if (rotateInfo.axis != "")
  345.         {
  346.             if (rotateInfo.axis == "x")
  347.             {
  348.                 for (int i = 0; i < 27; i++)
  349.                 {
  350.                     if (Mathf.Abs(matx[i].transform.localPosition.x - 100 * rotateInfo.a) < 1)
  351.                     {
  352.                         matx[i].RotateAround(cubeParent.transform.localPosition, Vector3.right * rotateInfo.dir, degree);
  353.                     }
  354.                 }
  355.             }
  356.             else if (rotateInfo.axis == "y")
  357.             {
  358.                 for (int i = 0; i < 27; i++)
  359.                 {
  360.                     if (Mathf.Abs(matx[i].transform.localPosition.y - 100 * rotateInfo.a) < 1)
  361.                     {
  362.                         matx[i].RotateAround(cubeParent.transform.localPosition, Vector3.up * rotateInfo.dir, degree);
  363.                     }
  364.                 }
  365.             }
  366.             else if (rotateInfo.axis == "z")
  367.             {
  368.                 for (int i = 0; i < 27; i++)
  369.                 {
  370.                     if (Mathf.Abs(matx[i].transform.localPosition.z - 100 * rotateInfo.a) < 1)
  371.                     {
  372.                         matx[i].RotateAround(cubeParent.transform.localPosition, Vector3.forward * rotateInfo.dir, degree);
  373.                     }
  374.                 }
  375.             }
  376.         }
  377.     }

  378.     private void Scale()
  379.     {
  380.         float dis = offset.magnitude;
  381.         dis += Input.GetAxis("Mouse ScrollWheel") * (-5);

  382.         if (dis < 10 || dis > 40)
  383.         {
  384.             return;
  385.         }

  386.         offset = offset.normalized * dis;
  387.         camera.transform.position = cubeParent.transform.position + offset;
  388.     }

  389.     private void Rotate()
  390.     {
  391.         if (Input.GetMouseButton(1))
  392.         {
  393.             camera.transform.RotateAround(cubeParent.transform.position, Vector3.up, Input.GetAxis("Mouse X") * 10);
  394.             camera.transform.RotateAround(cubeParent.transform.position, Vector3.left, Input.GetAxis("Mouse Y") * 10);
  395.             offset = camera.transform.position - cubeParent.transform.position;
  396.         }
  397.     }
  398. }
复制代码


论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
发表于 2019-04-13 13:13 |显示全部楼层
本帖最后由 __BlueGuy_ 于 2019-05-19 15:37 编辑

这个魔方帖图用的cubemap
  1. Shader "Debug/cube"
  2. {
  3.         Properties
  4.         {
  5.                 _CubeMap("CubeMap", CUBE) = ""{}
  6.         }

  7.         SubShader
  8.         {
  9.                 Pass
  10.                 {
  11.                         CGPROGRAM

  12.                         #pragma vertex vert
  13.                         #pragma fragment frag

  14.                         struct appdata
  15.                         {
  16.                                 float4 vertex : POSITION;
  17.                                 float4 normal  : NORMAL;
  18.                         };

  19.                         struct v2f
  20.                         {
  21.                                 float4 vertex : SV_POSITION;
  22.                                 float4 texCoords : TEXCOORD1;
  23.                         };

  24.                         v2f vert (appdata v)
  25.                         {
  26.                                 v2f o;
  27.                                 o.vertex = UnityObjectToClipPos(v.vertex);
  28.                                 o.texCoords = v.vertex;
  29.                                 return o;
  30.                         }

  31.                         samplerCUBE _CubeMap;

  32.                         fixed4 frag (v2f i) : COLOR0
  33.                         {
  34.                                 fixed4 col = texCUBE(_CubeMap, i.texCoords.xyz);
  35.                                 return col;
  36.                         }

  37.                         ENDCG
  38.                 }
  39.         }
  40. }
复制代码


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP