Definition for Matrix4x4 is from unity
                Matrix4x4 matrix = new Matrix4x4();
                matrix.SetRow(0, new Vector4(m[3], m[6], m[9], m[12] / scaleMultiplier));//经过实际测试前三个都是0,从第四个开始才跟transform中的数据一样,跟openIGTLink官方的协议说明不同,按实际的来,所以从m[3]开始
                matrix.SetRow(1, new Vector4(m[4], m[7], m[10], m[13] / scaleMultiplier));
                matrix.SetRow(2, new Vector4(m[5], m[8], m[11], m[14] / scaleMultiplier));
                matrix.SetRow(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f));

在Unity中使用Matrix4x4.Inverse(matrix)求得一个矩阵得逆矩阵

 IEnumerator ReceiveTransformMessage(byte[] data, string transformName){// Find Game Objects with Transform Name and determine if they should be updatedstring objectName;foreach (GameObject gameObject in GameObjects){// Could be a bit more efficientif (gameObject.name.Length > 20){objectName = gameObject.name.Substring(0, 20);}else{objectName = gameObject.name;}if (objectName.Equals(transformName) & gameObject.GetComponent<OpenIGTLinkFlag>().ReceiveTransform){// Transform Matrix starts from byte 58 until 106// Extract transform matrixbyte[] matrixBytes = new byte[4];float[] m = new float[15];for (int i = 0; i < 15; i++){Buffer.BlockCopy(data, 58 + i * 4, matrixBytes, 0, 4);if (BitConverter.IsLittleEndian){Array.Reverse(matrixBytes);}m[i] = BitConverter.ToSingle(matrixBytes, 0);//                   Debug.Log($"m{i},is {m[i]}");}// Slicer units are in millimeters, Unity is in meters, so convert accordingly// Definition for Matrix4x4 is from unityMatrix4x4 matrix = new Matrix4x4();/*            matrix.SetRow(0, new Vector4(m[0], m[3], m[6], m[9] / scaleMultiplier));matrix.SetRow(1, new Vector4(m[1], m[4], m[7], m[10] / scaleMultiplier));matrix.SetRow(2, new Vector4(m[2], m[5], m[8], m[11] / scaleMultiplier));*/matrix.SetRow(0, new Vector4(m[3], m[6], m[9], m[12] / scaleMultiplier));//经过实际测试前三个都是0,从第四个开始才跟transform中的数据一样,跟openIGTLink官方的协议说明不同,按实际的来,所以从m[3]开始matrix.SetRow(1, new Vector4(m[4], m[7], m[10], m[13] / scaleMultiplier));matrix.SetRow(2, new Vector4(m[5], m[8], m[11], m[14] / scaleMultiplier));matrix.SetRow(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f));Matrix4x4 IJKToRAS = new Matrix4x4();IJKToRAS.SetRow(0, new Vector4(-1.0f, 0, 0, 0));IJKToRAS.SetRow(1, new Vector4(0, -1.0f, 0, 2));IJKToRAS.SetRow(2, new Vector4(0, 0, 1.0f, 0));IJKToRAS.SetRow(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f));//在Unity中使用Matrix4x4.Inverse(matrix)求得一个矩阵得逆矩阵Matrix4x4 matrixRAS = matrix * IJKToRAS;//暂时没用上Vector3 translation = matrix.GetColumn(3);//上面matrix.SetRow已经转为以m为单位了tro = new Vector3(m[12], m[13], m[14]);//平移记录给全局变量,继续保持以mm为单位,为了在NDI设备中方位合成计算方便rro[0, 0] = matrix.m00; rro[0, 1] = matrix.m01; rro[0, 2] = matrix.m02; //旋转记录给全局变量rro[1, 0] = matrix.m10; rro[1, 1] = matrix.m11; rro[1, 2] = matrix.m12;//旋转记录给全局变量rro[2, 0] = matrix.m20; rro[2, 1] = matrix.m21; rro[2, 2] = matrix.m22;//旋转记录给全局变量if (tibiacontrolclass.targetflag)//如果ControllerTibia中点了button,tibiacontrolclass.targetflag变为true,表面现象是显示target plane位置{//                                  gameObject.transform.localPosition = new Vector3(-translation.x + TrackerOriginPosition.cubeposition.x, translation.y + TrackerOriginPosition.cubeposition.y, translation.z + TrackerOriginPosition.cubeposition.z);gameObject.transform.localPosition = TrackerOriginPosition.cuberotation * new Vector3(translation.y, translation.z, -translation.x) + TrackerOriginPosition.cubeposition;ReferenceInGlass = new Vector3(translation.y, translation.z, -translation.x);//从tracker设备坐标系下转换到glass坐标系下,标记到全局变量给ReceivePointMessage函数用Debug.Log($"Tracker is {TrackerOriginPosition.cubeposition};Reference is {-translation.x},{translation.y},{translation.z};sum is {gameObject.transform.localPosition}");}else{gameObject.transform.localPosition = new Vector3(-translation.x, translation.y, translation.z);Debug.Log($"Reference is {gameObject.transform.localPosition}");}
//                gameObject.transform.localPosition = new Vector3(-translation.x, translation.y, translation.z);
//               Debug.Log($"Reference is {gameObject.transform.localPosition}");Vector3 eulerAngles = matrix.rotation.eulerAngles;gameObject.transform.localRotation = Quaternion.Euler(eulerAngles.x, -eulerAngles.y, -eulerAngles.z);//               Debug.Log($"Rotation is {eulerAngles.x},{eulerAngles.y},{eulerAngles.z}");}else if (objectName.Equals(transformName) & gameObject.GetComponent<OpenIGTLinkFlag>().ReceiveImage)//官方协议是错误的,因此图片传输用OpenIGTLink没法进行下去。{}}// Place this inside the loop if you only want to perform one loop per update cycleyield return null;}

Unity中的旋转和矩阵操作相关推荐

  1. Python中的Numpy(4.矩阵操作(算数运算,矩阵积,广播机制))

    1.基本的矩阵操作: '''1.算数运算符:加减乘除''' n1 = np.random.randint(0, 10, size=(4, 5)) print(n1) n2 = n1 + 10 # 对n ...

  2. Unity使用c#开发遇上的问题(四)(3dmax做个风扇,unity中自动旋转)

    文章目录 前言 一.3dmax创建风扇的模型 1.创建两个二维的矩形 2.两个矩形中心对齐 3.编辑矩形的样条线 4.附加多个样条线 5.布尔选取并集 6.选择顶点圆角 7.设置顶点圆角 8.挤出立体 ...

  3. Unity中旋转方式的探究与对万向节死锁(Gimbal Lock)的理解

    Gimbal Lock Gimbal Lock的原理网上已经有很多资料,详细可以看介绍视频.视频讲到Gimbal Lock的时候提到x,y,z三个坐标轴是有从属关系(hierarchical syst ...

  4. [Unity] Unity 3D 中的旋转

    Unity 3D 中的旋转 一.Unity 3D 中 Rotation 在Unity中,旋转通常可以用一个三维向量(x,y,z)表示.实际上这是欧拉角.三个分量分别是绕x轴.y轴和z轴的旋转角度. 要 ...

  5. Unity中行星和恒星的旋转——Rotate和RotateAround

    Unity中的旋转--以行星环绕为例 实现效果 一.与之相关的两种旋转方式 1.Rotate 2.transform.RotateAround 二.行星案例的实现 Step1:我们先在场景中创建一个球 ...

  6. 浅谈Unity中的rotation和Quaternion的乘法

    动手写游戏以后一个比较切身的体会,就是实际操作能检验很多语言的细节,也许平时看API文档,或者看一些教程的时候并没有深刻的体会,因为大多情况下你只知道了该怎么做,却不知道为什么要这么做,或者怎么想到这 ...

  7. unity中3D数学相关类、属性、方法、用途总结+超级综合的案例

    这篇内容将与unity中移动旋转的控制密切相关,有关移动旋转. 主要涉及到的类:Vector3,Mathf,Quaternion,Transform. 1.三角函数 其实关于三角函数的使用并不会很常见 ...

  8. 将Revit模型转入unity中

    注意:先把Revit模型放到基点中心,方便后续unity中的旋转等操作. 先将Revit模型导出到Navisworks中 然后在Navisworks中把NWC导出为FBX格式 导出时单位改为毫米 FB ...

  9. Unity 中的坐标系

    参考 1.Shadow Map 原理和改进 2.[OpenGL]02 - OpenGL中的坐标系 3.矩阵理论 (这个是京东地址) 4.维基百科(文中的数学概念出处) 5.msdn mul 6.msd ...

最新文章

  1. javascript:document对象的常用属性和方法
  2. Oracle PL/SQL中如何使用%TYPE和%ROWTYPE
  3. if、for、while、do while、switch (区别于if、while)解析
  4. Linux 下 10 个最“危险”的命令,开发者应该了解
  5. jmeter进行性能测试_使用JMeter进行性能测试
  6. post提交参数过多时,取消Tomcat对 post长度限制
  7. 计算机组成原理201501,计算机组成原理201501.pdf
  8. 单曲循环 翻译_“单曲循环”用英语怎么说?
  9. Python+django网页设计入门(13):表单、修改密码
  10. Windows系统修改Docker镜像下载地址
  11. 佳信客服接口文档 REST API
  12. chromium编译android,Ubuntu下编译Chromium for Android
  13. 农村淘宝年货节开20条品牌大街,1分钱买高品质牛奶!
  14. bootstrap3 文件上传插件fileinput中文说明文档
  15. 图像算法工程师面试考点集锦
  16. one 主格 复数 宾格_数字 主格宾格复数所有格
  17. 【LAB4-Cisco】OSPF邻居建立过程与LSDB分析
  18. 【RS-Attack】Data Poisoning Attacks to Deep Learning Based Recommender Systems NDSS‘21
  19. Java 环境变量的配置的详细教程(Windows 10)
  20. qq令牌码怎么提取_QQ空间怎么引流?

热门文章

  1. DevExpress换肤
  2. 21年的第一场Gopher Meetup,北京我们来了!
  3. java程序将汉字转成拼音的两种方法
  4. Ubuntu Linux 软件寻找/安装/卸载 图文详解教程
  5. tmux使用(linux)
  6. mysql水仙花数_水仙花数
  7. 积分球原理及积分球类型介绍
  8. 广东计算机系大学生,热烈祝贺计算机系在2019年广东省大学生计算机设计大赛中荣获23项奖项...
  9. eds图怎么绘制_EDS元素分析eds图像
  10. unturned服务器修改物品,不一样的批处理-用批处理做的Unturned服务器部署工具(开服器)!...