1. GameObject.CreatePrimitive(PrimitiveType.Cube);
  2.  
  3. GameObject.CreatePrimitive(PrimitiveType.Plane);
  4.  
  5. GameObject.CreatePrimitive(PrimitiveType.Sphere);
  6.  
  7. GameObject.CreatePrimitive(PrimitiveType.Cylinder);

然后设置transform组件:

  1. using System;
  2. using UnityEngine;
  3. using UnityEditor;
  4.  
  5. public class MatrixArray
  6. {
  7. private Vector3 scale;
  8. private Vector3 angle;
  9. private Matrix4x4 m_Materix;
  10. private Quaternion m_Quaternion;
  11.  
  12. private double[] init =
  13. {
  14. -7.143478,3.521163,-7.232108,,-1.87758,1.747491,2.705387,,2.692082,3.996646,-0.713207,,5.061553,4.274189,5.206913,
  15. };
  16.  
  17. public MatrixArray()
  18. {
  19. SetScaleAndAngle();
  20. }
  21.  
  22. public Vector3 GetPosition()
  23. {
  24. float[] arr = DoubleToFloat(init);
  25. Vector3 position = new Vector3(arr[], arr[], arr[]);
  26. return position;
  27. }
  28.  
  29. public Vector3 GetScale()
  30. {
  31. return scale;
  32. }
  33. public Vector3 GetAngle()
  34. {
  35. return angle;
  36. }
  37.  
  38. private float[] DoubleToFloat(double[] arrs)
  39. {
  40. float[] outs = new float[arrs.Length];
  41. float b = ;
  42. int index = ;
  43. foreach (var a in arrs)
  44. {
  45. b = (float) a;
  46. outs[index] = b;
  47. index++;
  48. }
  49. return outs;
  50. }
  51.  
  52. private void SetScaleAndAngle()
  53. {
  54. float[] arr = DoubleToFloat(init);
  55. var te = arr;
  56. var sx = Length(new Vector3(te[], te[], te[]));
  57. var sy = Length(new Vector3(te[], te[], te[]));
  58. var sz = Length(new Vector3(te[], te[], te[]));
  59.  
  60. var det = Determinant();
  61. if (det < )
  62. {
  63. sx = -sx;
  64. }
  65.  
  66. scale.x = sx;
  67. scale.y = sy;
  68. scale.z = sz;
  69.  
  70. var invSX = / sx;
  71. var invSY = / sy;
  72. var invSZ = / sz;
  73.  
  74. Vector4 v4;
  75. for (int j = ; j < arr.Length; j++)
  76. {
  77. if (j % == )
  78. {
  79. v4 = new Vector4(arr[j - ], arr[j - ], arr[j - ], arr[j]);
  80. m_Materix.SetColumn((int) (j / ), v4);
  81. }
  82. }
  83.  
  84. m_Materix[] *= invSX;
  85. m_Materix[] *= invSX;
  86. m_Materix[] *= invSX;
  87.  
  88. m_Materix[] *= invSY;
  89. m_Materix[] *= invSY;
  90. m_Materix[] *= invSY;
  91.  
  92. m_Materix[] *= invSZ;
  93. m_Materix[] *= invSZ;
  94. m_Materix[] *= invSZ;
  95.  
  96. QuaternionSetFromMatrix(m_Materix);
  97. }
  98.  
  99. private void QuaternionSetFromMatrix(Matrix4x4 m)
  100. {
  101. var trace = m.m00 + m.m11 + m.m22;
  102. var s = 0f;
  103. if (trace > )
  104. {
  105. s = 0.5f / Mathf.Sqrt(trace + 1.0f);
  106.  
  107. m_Quaternion.w = 0.25f / s;
  108. m_Quaternion.x = (m.m21 - m.m12) * s;
  109. m_Quaternion.y = (m.m02 - m.m20) * s;
  110. m_Quaternion.z = (m.m10 - m.m01) * s;
  111. }
  112. else if (m.m00 > m.m11 && m.m00 > m.m22)
  113. {
  114. s = 2.0f * Mathf.Sqrt(1.0f + m.m00 - m.m11 - m.m22);
  115.  
  116. m_Quaternion.w = (m.m21 - m.m12) / s;
  117. m_Quaternion.x = 0.25f * s;
  118. m_Quaternion.y = (m.m10 + m.m01) / s;
  119. m_Quaternion.z = (m.m20 + m.m02) / s;
  120. }
  121. else if (m.m11 > m.m22)
  122. {
  123. s = 2.0f * Mathf.Sqrt(1.0f + m.m11 - m.m00 - m.m22);
  124.  
  125. m_Quaternion.w = (m.m02 - m.m20) / s;
  126. m_Quaternion.x = (m.m10 + m.m01) / s;
  127. m_Quaternion.y = 0.25f * s;
  128. m_Quaternion.z = (m.m21 + m.m12) / s;
  129. }
  130. else
  131. {
  132. s = 2.0f * Mathf.Sqrt(1.0f + m.m22 - m.m00 - m.m11);
  133.  
  134. m_Quaternion.w = (m.m10 - m.m01) / s;
  135. m_Quaternion.x = (m.m20 + m.m02) / s;
  136. m_Quaternion.y = (m.m21 + m.m12) / s;
  137. m_Quaternion.z = 0.25f * s;
  138. }
  139.  
  140. SetFromRotationMatrix(MakeRotationFromQuaternion(m_Quaternion));
  141. }
  142.  
  143. private float[] MakeRotationFromQuaternion(Quaternion q)
  144. {
  145. float[] te = new float[];
  146. te[] = te[] = te[] = te[] = ;
  147. var x = q.x;
  148. var y = q.y;
  149. var z = q.z;
  150. var w = q.w;
  151. var x2 = x + x;
  152. var y2 = y + y;
  153. var z2 = z + z;
  154. var xx = x * x2;
  155. var xy = x * y2;
  156. var xz = x * z2;
  157. var yy = y * y2;
  158. var yz = y * z2;
  159. var zz = z * z2;
  160. var wx = w * x2;
  161. var wy = w * y2;
  162. var wz = w * z2;
  163.  
  164. te[] = - (yy + zz);
  165. te[] = xy - wz;
  166. te[] = xz + wy;
  167.  
  168. te[] = xy + wz;
  169. te[] = - (xx + zz);
  170. te[] = yz - wx;
  171.  
  172. te[] = xz - wy;
  173. te[] = yz + wx;
  174. te[] = - (xx + yy);
  175.  
  176. // last column
  177. te[] = ;
  178. te[] = ;
  179. te[] = ;
  180.  
  181. // bottom row
  182. te[] = ;
  183. te[] = ;
  184. te[] = ;
  185. te[] = ;
  186.  
  187. return te;
  188. }
  189.  
  190. private void SetFromRotationMatrix(float[] m)
  191. {
  192. var te = m;
  193. var m11 = te[];
  194. var m12 = te[];
  195. var m13 = te[];
  196. var m21 = te[];
  197. var m22 = te[];
  198. var m23 = te[];
  199. var m31 = te[];
  200. var m32 = te[];
  201. var m33 = te[];
  202.  
  203. angle.y = Mathf.Asin(Mathf.Clamp(m13, -, ));
  204.  
  205. if (Mathf.Abs(m13) < 0.99999)
  206. {
  207. angle.x = Mathf.Atan2(-m23, m33);
  208. angle.z = Mathf.Atan2(-m12, m11);
  209. }
  210. else
  211. {
  212. angle.x = Mathf.Atan2(m32, m22);
  213. angle.z = ;
  214. }
  215.  
  216. angle.x = angle.x * 180f / Mathf.PI;
  217. angle.y = angle.y * 180f / Mathf.PI;
  218. angle.z = angle.z * 180f / Mathf.PI;
  219.  
  220. m_Quaternion = Quaternion.Euler(angle);
  221. }
  222.  
  223. private float Length(Vector3 vector3)
  224. {
  225. return Mathf.Sqrt(vector3.x * vector3.x + vector3.y * vector3.y + vector3.z * vector3.z);
  226. }
  227.  
  228. private float Determinant()
  229. {
  230. float[] arr = DoubleToFloat(init);
  231. var te = arr;
  232.  
  233. var n11 = te[];
  234. var n12 = te[];
  235. var n13 = te[];
  236. var n14 = te[];
  237. var n21 = te[];
  238. var n22 = te[];
  239. var n23 = te[];
  240. var n24 = te[];
  241. var n31 = te[];
  242. var n32 = te[];
  243. var n33 = te[];
  244. var n34 = te[];
  245. var n41 = te[];
  246. var n42 = te[];
  247. var n43 = te[];
  248. var n44 = te[];
  249.  
  250. return (
  251. n41 * (
  252. +n14 * n23 * n32
  253. - n13 * n24 * n32
  254. - n14 * n22 * n33
  255. + n12 * n24 * n33
  256. + n13 * n22 * n34
  257. - n12 * n23 * n34
  258. ) +
  259. n42 * (
  260. +n11 * n23 * n34
  261. - n11 * n24 * n33
  262. + n14 * n21 * n33
  263. - n13 * n21 * n34
  264. + n13 * n24 * n31
  265. - n14 * n23 * n31
  266. ) +
  267. n43 * (
  268. +n11 * n24 * n32
  269. - n11 * n22 * n34
  270. - n14 * n21 * n32
  271. + n12 * n21 * n34
  272. + n14 * n22 * n31
  273. - n12 * n24 * n31
  274. ) +
  275. n44 * (
  276. -n13 * n22 * n31
  277. - n11 * n23 * n32
  278. + n11 * n22 * n33
  279. + n13 * n21 * n32
  280. - n12 * n21 * n33
  281. + n12 * n23 * n31
  282. )
  283. );
  284. }
  285. }
  1. MatrixArray类是解析
"matrix": [0.015579,0,0.999879,0,0,1,0,0,-0.999879,0,0.015579,0,-30.749359,4.370426,0,1]用的;
  1. private void SetTransform(GameObject game)
  2. {
  3. MatrixArray matrix = new MatrixArray();
  4. game.transform.position = matrix.GetPosition();
  5. game.transform.localScale = matrix.GetScale();
  6. game.transform.Rotate(new Vector3(matrix.GetAngle().x,,),Space.Self);
  7. game.transform.Rotate(new Vector3(,matrix.GetAngle().y,),Space.Self);
  8. game.transform.Rotate(new Vector3(,,matrix.GetAngle().z),Space.Self);
  9.  
  10. game.transform.parent = gameObject.transform;
  11.  
  12. Reverse(game.transform,matrix);
  13. }

上面代码为unity的对象还原位移旋转缩放。

  1. private void Reverse(Transform form,MatrixArray matrixParse)
  2. {
  3. //反转
  4. Vector3 pos = matrixParse.GetPosition();
  5. form.position = new Vector3(-pos.x,pos.y,pos.z);
  6.  
  7. Vector3 scale = matrixParse.GetScale();
  8. form.localScale = new Vector3(scale.x,-scale.y,-scale.z);
  9.  
  10. form.Rotate(new Vector3(,,),Space.World);
  11. }

由于three.js是右手坐标系,unity是左手坐标系,摄像机看到的场景会反向,上述代码解决。

unity还原three导出的json——基本模型,位移,旋转,缩放的更多相关文章

  1. unity还原three——顶点,三角面,uv

    public class Geometry { public Geometry(string name, Data data, Hashtable hash) { Debug.Log("解析 ...

  2. Blender模型导入进Unity,旋转缩放的调整

    Blender跟Unity的XYZ轴不同的原因,导致Blender模型导入Unity之后会发生模型朝向不对. 请先看看下边这个情况: 首先,Blender物体模式下,对模型进行 旋转 缩放,将会在右边 ...

  3. unity还原three之旋转

    http://www.360doc.com/content/16/0829/14/12282510_586760119.shtml unity使用左手坐标系,另外在做旋转的时候必须弄清楚旋转坐标轴和旋 ...

  4. 【Mongodb】数据库操作--备份、还原、导出和导入

    文章转载自点这里 mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport. mongo ...

  5. Twaver的mono-desiner导出的json文件解析

    以画的交换机为例,其他大概都差不多. 利用Twaver做出交换机模型如图1所示,其中,每一个端口都是一个单独的对象.具体Twaver操作流程参见网址:http://twaver.servasoft.c ...

  6. consul备份还原导入导出

    工作中要保证生产环境部署的consul的集群能够安全稳定地对外提供服务,即使出现系统故障也能快速恢复,这里将讲述部分的备份还原操作及KV的导入导出操作. 备份与还原 需要备份的主要有两类数据:cons ...

  7. Elasticsearch集群状态脚本及grafana监控面板导出的json文件

    脚本文件: #!/usr/bin/env python import datetime import time import urllib import json import urllib2 imp ...

  8. grafana日志分析界面及导出的json文件

    日志分析面板导出的json文件,效果图如下: 下载地址:http://files.cnblogs.com/files/xiaoming279/%E9%9D%A2%E6%9D%BF.zip 主机面板 主 ...

  9. apache poi 读取xlsx并导出为json(没考虑xls)

    1.用到的jar包:fastjson-1.2.9.poi(poi-3.15.poi-ooxml-3.15.poi-ooxml-schemas-3.15.xmlbeans-2.6.0.commons-c ...

随机推荐

  1. Knockoutjs : Unable to process binding "value:

    刚刚自学knockoutjs,老是碰到稀奇古怪的问题. 在自学knockout.js的时候经常遇到 Unable to process binding "value:的问题.目前总结了以下几 ...

  2. 对于反射中的invoke()方法的理解

    先讲一下java中的反射: 反射就是将类别的各个组成部分进行剖析,可以得到每个组成部分,就可以对每一部分进行操作 在比较复杂的程序或框架中来使用反射技术,可以简化代码提高程序的复用性. 讲的是Meth ...

  3. python终端中退格键,方向键不能使用

    在安装Python的时候先安装 yum install readline-devel.x86_64 -y 如果python已经安装过了就重新安装 ./configure    make all mak ...

  4. Modbus通信协议的压力测试

    最近物联网都比较的火,因此,特别为各位兄弟姐妹们,奉上一款Mobus协议的测试软件,可以用来做设备的压力测试,和通信测试. 起初软件开发缘由是我们最近在开发一款设备,需要将多个DS18B20并联起来, ...

  5. webSocket学习与应用

    非原创,版权归原作者所有http://www.cnblogs.com/shizhouyu/p/4975409.html 1.什么是WebSocket WebSocket 是一种自然的全双工.双向.单套 ...

  6. Java 对象序列化和反序列化

         之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反.在我们看来这种行 ...

  7. 老李分享:《Linux Shell脚本攻略》 要点(八)

    老李分享:<Linux Shell脚本攻略> 要点(八)   1.打印进程 [root@localhost program_test]# ps -e | head  PID TTY     ...

  8. hdu 3032 Nim or not Nim? (sg函数打表找规律)

    题意:有N堆石子,每堆有s[i]个,Alice和Bob两人轮流取石子,可以从一堆中取任意多的石子,也可以把一堆石子分成两小堆 Alice先取,问谁能获胜 思路:首先观察这道题的数据范围  1 ≤ N ...

  9. MySQL flashback 功能

    1. 简介 mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据.在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos).比如忘了带wh ...

  10. Android 学习笔记之实时保存数据-现场保护onSaveInstanceState()

    数据保存:在软件开发中我们希望保存下各个Activity数据,以实现客户数据的时时保存,达到较好的用户体验. 那么我们需要解决如下问题: 1.什么时候保存? 2.保存哪些数据?     我想保存应用产 ...