GameObject.CreatePrimitive(PrimitiveType.Cube);

GameObject.CreatePrimitive(PrimitiveType.Plane);

GameObject.CreatePrimitive(PrimitiveType.Sphere);

GameObject.CreatePrimitive(PrimitiveType.Cylinder);

然后设置transform组件:

using System;
using UnityEngine;
using UnityEditor; public class MatrixArray
{
private Vector3 scale;
private Vector3 angle;
private Matrix4x4 m_Materix;
private Quaternion m_Quaternion; private double[] init =
{
-7.143478,3.521163,-7.232108,,-1.87758,1.747491,2.705387,,2.692082,3.996646,-0.713207,,5.061553,4.274189,5.206913,
}; public MatrixArray()
{
SetScaleAndAngle();
} public Vector3 GetPosition()
{
float[] arr = DoubleToFloat(init);
Vector3 position = new Vector3(arr[], arr[], arr[]);
return position;
} public Vector3 GetScale()
{
return scale;
}
public Vector3 GetAngle()
{
return angle;
} private float[] DoubleToFloat(double[] arrs)
{
float[] outs = new float[arrs.Length];
float b = ;
int index = ;
foreach (var a in arrs)
{
b = (float) a;
outs[index] = b;
index++;
}
return outs;
} private void SetScaleAndAngle()
{
float[] arr = DoubleToFloat(init);
var te = arr;
var sx = Length(new Vector3(te[], te[], te[]));
var sy = Length(new Vector3(te[], te[], te[]));
var sz = Length(new Vector3(te[], te[], te[])); var det = Determinant();
if (det < )
{
sx = -sx;
} scale.x = sx;
scale.y = sy;
scale.z = sz; var invSX = / sx;
var invSY = / sy;
var invSZ = / sz; Vector4 v4;
for (int j = ; j < arr.Length; j++)
{
if (j % == )
{
v4 = new Vector4(arr[j - ], arr[j - ], arr[j - ], arr[j]);
m_Materix.SetColumn((int) (j / ), v4);
}
} m_Materix[] *= invSX;
m_Materix[] *= invSX;
m_Materix[] *= invSX; m_Materix[] *= invSY;
m_Materix[] *= invSY;
m_Materix[] *= invSY; m_Materix[] *= invSZ;
m_Materix[] *= invSZ;
m_Materix[] *= invSZ; QuaternionSetFromMatrix(m_Materix);
} private void QuaternionSetFromMatrix(Matrix4x4 m)
{
var trace = m.m00 + m.m11 + m.m22;
var s = 0f;
if (trace > )
{
s = 0.5f / Mathf.Sqrt(trace + 1.0f); m_Quaternion.w = 0.25f / s;
m_Quaternion.x = (m.m21 - m.m12) * s;
m_Quaternion.y = (m.m02 - m.m20) * s;
m_Quaternion.z = (m.m10 - m.m01) * s;
}
else if (m.m00 > m.m11 && m.m00 > m.m22)
{
s = 2.0f * Mathf.Sqrt(1.0f + m.m00 - m.m11 - m.m22); m_Quaternion.w = (m.m21 - m.m12) / s;
m_Quaternion.x = 0.25f * s;
m_Quaternion.y = (m.m10 + m.m01) / s;
m_Quaternion.z = (m.m20 + m.m02) / s;
}
else if (m.m11 > m.m22)
{
s = 2.0f * Mathf.Sqrt(1.0f + m.m11 - m.m00 - m.m22); m_Quaternion.w = (m.m02 - m.m20) / s;
m_Quaternion.x = (m.m10 + m.m01) / s;
m_Quaternion.y = 0.25f * s;
m_Quaternion.z = (m.m21 + m.m12) / s;
}
else
{
s = 2.0f * Mathf.Sqrt(1.0f + m.m22 - m.m00 - m.m11); m_Quaternion.w = (m.m10 - m.m01) / s;
m_Quaternion.x = (m.m20 + m.m02) / s;
m_Quaternion.y = (m.m21 + m.m12) / s;
m_Quaternion.z = 0.25f * s;
} SetFromRotationMatrix(MakeRotationFromQuaternion(m_Quaternion));
} private float[] MakeRotationFromQuaternion(Quaternion q)
{
float[] te = new float[];
te[] = te[] = te[] = te[] = ;
var x = q.x;
var y = q.y;
var z = q.z;
var w = q.w;
var x2 = x + x;
var y2 = y + y;
var z2 = z + z;
var xx = x * x2;
var xy = x * y2;
var xz = x * z2;
var yy = y * y2;
var yz = y * z2;
var zz = z * z2;
var wx = w * x2;
var wy = w * y2;
var wz = w * z2; te[] = - (yy + zz);
te[] = xy - wz;
te[] = xz + wy; te[] = xy + wz;
te[] = - (xx + zz);
te[] = yz - wx; te[] = xz - wy;
te[] = yz + wx;
te[] = - (xx + yy); // last column
te[] = ;
te[] = ;
te[] = ; // bottom row
te[] = ;
te[] = ;
te[] = ;
te[] = ; return te;
} private void SetFromRotationMatrix(float[] m)
{
var te = m;
var m11 = te[];
var m12 = te[];
var m13 = te[];
var m21 = te[];
var m22 = te[];
var m23 = te[];
var m31 = te[];
var m32 = te[];
var m33 = te[]; angle.y = Mathf.Asin(Mathf.Clamp(m13, -, )); if (Mathf.Abs(m13) < 0.99999)
{
angle.x = Mathf.Atan2(-m23, m33);
angle.z = Mathf.Atan2(-m12, m11);
}
else
{
angle.x = Mathf.Atan2(m32, m22);
angle.z = ;
} angle.x = angle.x * 180f / Mathf.PI;
angle.y = angle.y * 180f / Mathf.PI;
angle.z = angle.z * 180f / Mathf.PI; m_Quaternion = Quaternion.Euler(angle);
} private float Length(Vector3 vector3)
{
return Mathf.Sqrt(vector3.x * vector3.x + vector3.y * vector3.y + vector3.z * vector3.z);
} private float Determinant()
{
float[] arr = DoubleToFloat(init);
var te = arr; var n11 = te[];
var n12 = te[];
var n13 = te[];
var n14 = te[];
var n21 = te[];
var n22 = te[];
var n23 = te[];
var n24 = te[];
var n31 = te[];
var n32 = te[];
var n33 = te[];
var n34 = te[];
var n41 = te[];
var n42 = te[];
var n43 = te[];
var n44 = te[]; return (
n41 * (
+n14 * n23 * n32
- n13 * n24 * n32
- n14 * n22 * n33
+ n12 * n24 * n33
+ n13 * n22 * n34
- n12 * n23 * n34
) +
n42 * (
+n11 * n23 * n34
- n11 * n24 * n33
+ n14 * n21 * n33
- n13 * n21 * n34
+ n13 * n24 * n31
- n14 * n23 * n31
) +
n43 * (
+n11 * n24 * n32
- n11 * n22 * n34
- n14 * n21 * n32
+ n12 * n21 * n34
+ n14 * n22 * n31
- n12 * n24 * n31
) +
n44 * (
-n13 * n22 * n31
- n11 * n23 * n32
+ n11 * n22 * n33
+ n13 * n21 * n32
- n12 * n21 * n33
+ n12 * n23 * n31
)
);
}
}
MatrixArray类是解析
"matrix": [0.015579,0,0.999879,0,0,1,0,0,-0.999879,0,0.015579,0,-30.749359,4.370426,0,1]用的;
private void SetTransform(GameObject game)
{
MatrixArray matrix = new MatrixArray();
game.transform.position = matrix.GetPosition();
game.transform.localScale = matrix.GetScale();
game.transform.Rotate(new Vector3(matrix.GetAngle().x,,),Space.Self);
game.transform.Rotate(new Vector3(,matrix.GetAngle().y,),Space.Self);
game.transform.Rotate(new Vector3(,,matrix.GetAngle().z),Space.Self); game.transform.parent = gameObject.transform; Reverse(game.transform,matrix);
}

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

private void Reverse(Transform form,MatrixArray matrixParse)
{
//反转
Vector3 pos = matrixParse.GetPosition();
form.position = new Vector3(-pos.x,pos.y,pos.z); Vector3 scale = matrixParse.GetScale();
form.localScale = new Vector3(scale.x,-scale.y,-scale.z); form.Rotate(new Vector3(,,),Space.World);
}

由于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. 使用javascript解一道关于会议日程安排的面试题

    这道面试题是从 HarrisonHao 的一篇博文中看到的:原文链接 我看到之后,感觉此题十分有趣,遂自己用 node.js 以不同的思路实现了一遍,实现中使用了 lodash 原题比较长,而且是英文 ...

  2. Android开发遇到短信备份失败

    今天做了一个有关ContentProvider的短信备份的小案例,遇到短信备份失败,费了一番周折后终于找到了问题所在 该案例是将短信写到一个xml文件然后保存在手机存储中实现短信的备份功能,关键实现代 ...

  3. [原创]HBase学习笔记(3)- Java程序访问HBase

    这里介绍使用java api来访问和操作HBase,例如create.delete.select.update等操作. 1.HBase配置 配置HBase使用的zookeeper集群地址和端口. pr ...

  4. python3编码问题终结者--还搞不懂你来找我

    python unicode bytes str 编码 首先需要说明一下,该篇文章是以python3为基础的,python2是否适合没有验证过.由于python编码问题确实比较多,文章篇幅可能较长,请 ...

  5. Unity 3D Framework Designing(3)——构建View和ViewModel的生命周期

    > 对于一个View而言,本质上是一个MonoBehaviour.它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等.这些是非常好的方法,可以让开发者 ...

  6. as3中强制垃圾回收

    private function doClearance():void { // trace("clear"); try{ new LocalConnection().connec ...

  7. 老李推荐:第8章6节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动Monkey 4

    在获得比对设备序列号后,findAttachedDevice就会跟提供的序列号进行比对,如果吻合就返回给调用者” 代码8-6-3 AdbBackend - waitForConnection”了.而A ...

  8. 关于JavaScript的模块化

    为什么需要模块化 最近在学习网易微专业的<前端系统架构>课程,里面讲到了关于JavaScript的模块化问题.具体指的是当随着Web系统不断强大起来,需要在客户端进行的操作就多了起来(比如 ...

  9. shell脚本编写步骤及其常用命令和符号

    1,什么是Shell     Shell 是kernel的一个外壳,是一个命令解析器,负责用户与内核的交互.2,Shell脚本     Shell脚本类似于批处理,可以方便的执行大量命令.3,编写sh ...

  10. Java Level 2 学习的八大名著

    Java Level 2 学习的八大名著 前段时间有几天难得的假期,于是把自己认为Java技术栈中的精华总结了一下,但是一直没有时间写下来,今天终于得空希望本文可以对大家有所启发.通过多个实际项目的沉 ...