http://www.360doc.com/content/16/0829/14/12282510_586760119.shtml

unity使用左手坐标系,另外在做旋转的时候必须弄清楚旋转坐标轴旋转顺序

一:edit中Transform组件

脚本重置:

transform.localEulerAngles = new Vector3(60,60,60);

绕父节点坐标轴旋转,旋转顺序z-x-y;

二:在脚本中使用Rotate()函数,参数为Space.Self

transform.Rotate(new Vector3(45,45,45),Space.Self);

绕本地坐标系坐标轴旋转,旋转顺序z-x-y;

注:每次使用Space.self进行rotate时,都是绕着调用时刻的坐标轴进行旋转的

三:在脚本中使用Rotate()函数,参数为Space.World

transform.Rotate(new Vector3(45,45,45),Space.World);

绕世界坐标系坐标轴旋转,旋转顺序z-x-y;

四:关于静态欧拉角和动态欧拉角

静态欧拉角,就是其旋转轴使用的是静止不动的参考系。

动态欧拉角,使用的是模型本身作为参考系,因而会随着模型的旋转而旋转。

因此,再看看前面的三种情况,使用Space.World旋转,以及 Editor 中的旋转,是静态欧拉角;使用Space.self,是动态欧拉角。

五:还原three的旋转

three使用右手坐标系,edit中,根对象绕本地坐标系坐标轴旋转,旋转顺序x-y-z;

子对象绕父对象的坐标轴旋转,旋转顺序x-y-z;(即除根对象外,其他全部绕父对象的坐标轴旋转)

(此处是个坑,当初真是too young too simple,最开始以为旋转坐标轴都是本地坐标轴。。。)

旋转在unity中的还原最直观方法(只适用于root):

gameObject.transform.Rotate(new Vector3(matrixParse.GetAngles.x,0,0),Space.Self);
gameObject.transform.Rotate(new Vector3(0,matrixParse.GetAngles.y,0),Space.Self);
gameObject.transform.Rotate(new Vector3(0,0,matrixParse.GetAngles.z),Space.Self);

非root:

transform.localEulerAngles = matrixParse.GetAngles;//这样写讲道理是有问题的,没考虑旋转顺序.

找到解决办法:

Vector3 ang = matrixParse.GetAngles;
gameObject.transform.localRotation = Quaternion.AngleAxis(ang.x,                                       Vector3.right)
* Quaternion.AngleAxis(ang.y,                                       Vector3.up)
* Quaternion.AngleAxis(ang.z,                                       Vector3.forward);

始终遵循的原则:旋转顺序和旋转方式与three统一。

特殊化,平面和摄像机初始时与three存在差异,采用进一步旋转进行补偿:

transform.Rotate(new Vector3(90,0,0),Space.Self);//平面
transform.Rotate(0,180,0),Space.Self);//摄像机

六:左右反转

由于左右手坐标系的差异,导致unity中看到的场景与three相比左右颠倒。

解决办法:

1.缩放无效的模型,例如摄像机

//反转
Vector3 pos = transform.position;
transform.position = new Vector3(-pos.x,pos.y,pos.z);
Vector3 angs = transform.eulerAngles;
gameObject.transform.Rotate(new Vector3(0,-2 * angs.y,0),Space.World);

2.可以调整缩放的模型

//反转
Vector3 pos = transform.position;
transform.position = new Vector3(-pos.x,pos.y,pos.z); Vector3 scale = transform.localScale;
transform.localScale = new Vector3(-scale.x,-scale.y,-scale.z); transform.Rotate(new Vector3(180,0,0),Space.World);

其中缩放可根据显示需要调整正负。

												

unity还原three之旋转的更多相关文章

  1. unity还原three导出的json——基本模型,位移,旋转,缩放

    GameObject.CreatePrimitive(PrimitiveType.Cube); GameObject.CreatePrimitive(PrimitiveType.Plane); Gam ...

  2. maya和Unity中的坐标系旋转

    maya软件是用的右手坐标系,默认旋转顺序是ZYX,即先绕Z轴旋转,再绕Y轴旋转,最后绕X轴旋转. 比如在maya软件中,右侧的旋转顺序是可选的,默认的选择是“XYZ”,其实物体旋转顺序是倒着念,即上 ...

  3. Unity摄像机围绕物体旋转两种实现方式

    第一种,使用Transform 函数 RotateAround. 代码如下: public Transform target;//获取旋转目标 private void camerarotate() ...

  4. unity鼠标拖动物体旋转

    using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> / ...

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

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

  6. Unity 相机平移、旋转、缩放

    内容不多,一个脚本,直接上代码 using System.Collections; using System.Collections.Generic; using UnityEngine; publi ...

  7. unity之让obj旋转自转等操作

    1.让cube沿着矩形四个点运动 using System.Collections; using System.Collections.Generic; using UnityEngine; publ ...

  8. 实现Unity编辑器模式下的旋转

    最近在做一个模型展示的项目,我的想法是根据滑动屏幕的x方向差值和Y方向的差值,来根据世界坐标下的X轴和Y轴进行旋转,但是实习时候总是有一些卡顿.在观察unity编辑器下的旋转之后,发现编辑器下的旋转非 ...

  9. 【Unity技巧】四元数(Quaternion)和旋转

    四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...

随机推荐

  1. BugPhobia贡献篇章:团队贡献分值与转会确定

    0x01 :无言 0x02 :团队贡献分说明 (1202)冯志睿 54 (1156)李入云 43 (1188)李云涛 56 (1184)马腾跃 26 (1197)钱林琛 60 (1100)王鹿鸣 63 ...

  2. 面向对象程序设计第三次作业-Calculator

    题目: 最终代码: Scan.h: Print.h: Calaulator.cpp: 解题过程 看到题目后,在查询之后明白了这是多文件的题目,然后通过翁凯老师的视频讲解知道了.h和.cpp文件的区别和 ...

  3. 剑指offer:替换空格

    题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路: 一开始没理解,函数中 ...

  4. DPDK flow_filtering 源码阅读

    代码部分 main.c /*- * BSD LICENSE * * Copyright 2017 Mellanox. * * Redistribution and use in source and ...

  5. python learning GUI

    Hello world1 from tkinter import * # 第一步是导入Tkinter包的所有内容 class Application(Frame): # 第二步是从Frame派生一个A ...

  6. java中的互斥锁和信号量的区别

    互斥锁和信号量都是操作系统中为并发编程设计基本概念,互斥锁和信号量的概念上的不同在于,对于同一个资源,互斥锁只有0和1 的概念,而信号量不止于此.也就是说,信号量可以使资源同时被多个线程访问,而互斥锁 ...

  7. Java 单生产者消费者问题

    package com.cwcec.test; class Resource { private int count = 0; private boolean flag = false; public ...

  8. 实验一 命令解释程序cmd的编写

    #include<stdio.h>#include<stdlib.h>#include<string.h>#define N 30main(){ char str[ ...

  9. jmeter body 中文显示为乱码解决

    这种情况在jmeter3.0的版本中才会产生,注意:这不是乱码,而是由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示.这样的情况可以这样调整:进入jmeter. ...

  10. requests爬取知乎话题和子话题

    zhihu.py # *_*coding:utf-8 *_* import pymysql import requests from lxml import etree from requests_t ...