书籍推荐:

3D数学基础:图形与游戏开发——游戏软件开发专家系列(美)邓恩
Unity Shader入门精要 冯乐乐(92年)
数据结构(Python语言描述)
数据结构、算法与应用(C++语言描述)
算法导论 第3版
黑客与画家
程序员生存之道
流体力学:八叉数空间划分
 
四元数的几个概念:
四元数的模长:Mathf.Sqrt(x^2 + y^2 + z^2 + w^2)
标准四元数:模长为1的四元数叫标准四元数:在Unity中所有用来表示旋转的四元数都是标准四元数
单位四元数:[0,0,0,1],单位四元数表示无旋转,Quaternion.identity
共轭四元数:让原四元数虚数部分取负,让原四元数反向旋转,Unity中没有共轭四元数
四元数 * 共轭四元数 = 单位四元数
四元数的逆:类似求导,
四元素的逆 = 共轭四元数 / 四元数的模长,即q-1 = *q / |q|
在Unity中,因为所有表示旋转的四元数都是标准四元数,模长均为1,所以四元素的逆 = 共轭四元数
 
四元数让向量旋转:
四元数不仅可以旋转点,还可以旋转向量
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateVector : MonoBehaviour {
// Use this for initialization
void Start () {
Vector3 dir = new Vector3(,,);
Debug.DrawLine(Vector3.zero,dir,Color.red,);
//单位四元数表示无旋转
Debug.Log(Quaternion.identity);
//四元数的逆
Quaternion q = Quaternion.AngleAxis(, Vector3.up);
Quaternion tempQ = Quaternion.Inverse(q);
Debug.Log(q);
Debug.Log(tempQ);
//旋转四元数
Quaternion rotateQ = Quaternion.AngleAxis(, Vector3.up);
Vector3 newVector = rotateQ * dir;
Debug.DrawLine(Vector3.zero, newVector, Color.green, );
//自己写一个RotationAround
//RotateAround(Vector3 point, Vector3 axis, float angle);
}
// Update is called once per frame
void Update () { }
}
四元数和欧拉角的优缺点:
1、欧拉角的优点:
(1)、可以同时绕着三根轴一起旋转
(2)、欧拉角节省内存,节省33.3333%的内存
(3)、直观
2、欧拉角的缺点:
(1)、万向节死锁
(2)、误差大
1、四元数的优点:
(1)、没有万向节死锁
(2)、误差小
(3)、可以绕任意一根轴旋转
2、四元数的缺点:
(1)、只能一根一根轴旋转
(2)、比欧拉角多了33.3333%的内存
(3)、不直观
锁可以固定游戏物体的检视面板,方便把其他游戏物体拖拽进来

models和prefabs的区别
models模型拖到场景,再拖回资源,可以变成预制体
四方连续,向四周重复地连续和延伸扩展而成的图案形式。
二方连续,向上下或左右两个方向反复连续而形成的纹样。
世界坐标系转屏幕坐标系
Vector2 screenPos = Camera.main.WorldToScreenPoint(target.position);
屏幕坐标系转世界坐标系
Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, -Camera.main.transform.position.z));
 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateAroundScript : MonoBehaviour {
public Transform sphere;
public float rotateSpeed = ;
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
//调用RotateAround
RotateAround(sphere.position, Vector3.up, rotateSpeed);
} public void myRotateAround(Vector3 point, Vector3 axis, float angle)
{
Vector3 A = transform.position - point;
//Vector3 n = Vector3.Project();
//Vector3.Dot(axis, A) = | n | * axis.magnitude;
//| n | = Vector3.Dot(axis, A) / axis.magnitude;
//Vector3 n = axis.normalized * | n |;
Vector3 n = axis.normalized * Vector3.Dot(axis, A) / axis.magnitude;
Vector3 a = A - n;
Quaternion q = Quaternion.AngleAxis(angle, axis);
Vector3 b = q * a;
}
}

复习

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class w06d4 : MonoBehaviour {
public Transform target;
public Vector3 cubeSize;
//欧拉角是如何表示旋转的
//使用x y z来表示旋转 x表示绕x轴旋转多少度 y表示绕y轴旋转多少度 z表示绕z轴旋转多少度
//四元数是如何表示旋转的
//使用x y z w来表示旋转 通过轴角对来表示旋转 n轴转45度 x = n.x * sin<theta/2> , y = n.y * sin<theta/2>, z = n.z * sin<theta/2>, w = cos<theta/2>
//欧拉角和四元数的优缺点
//欧拉角
// 优点: 直观,容易理解
// 缺点: 有万向节锁
// 只能绕固定轴旋转
// 不能实现旋转的平滑差值
//四元数
// 优点: 可以实现任何角度的旋转
// 可以实现旋转叠加
// 没有万向节锁 、
// 可以绕任意轴旋转
// 可以实现旋转的平滑差值
// 缺点: 不直观,不容易理解
//API
//使当前游戏物体的旋转变为 绕x轴旋转90
//1)、使用欧拉角的形式赋值 //transform.eulerAngles = new Vector3(90, 0, 0);
// 使用四元数的形式赋值 //transform.rotation = Quaternion.AngleAxis(90, Vector3.right);
//2)、使当前游戏物体直接看向目标
transform.LookAt(target);
transform.rotation = Quaternion.LookRotation(target.position - transform.position);
//3)、使当前游戏物体缓缓看向目标
transform.rotation = Quaternion.Slerp(transform.rotation,
Quaternion.LookRotation(target.position - transform.position),
/Quaternion.Angle(transform.rotation, Quaternion.LookRotation(target.position - transform.position)));
//4)、把一个欧拉角转换为四元数
transform.rotation = Quaternion.Euler(, , );
//5)、使用鼠标的水平轴值控制当前物体旋转(使用四元数叠加)
float mouseX = Input.GetAxis("Mouse X");
//自身的 绕Y轴转 XX 度
transform.rotation *= Quaternion.Euler(, mouseX, );
//世界的 绕Y轴转 XX 度
transform.rotation = Quaternion.Euler(, mouseX, ) * transform.rotation;
void Start () {
transform.rotation = Quaternion.AngleAxis(, Vector3.right);
transform.eulerAngles = new Vector3(, , );
transform.LookAt(target);
transform.rotation = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Euler(, , );
} void Update () {
transform.rotation = Quaternion.Slerp(
transform.rotation,
Quaternion.LookRotation(target.position - transform.position),
/ Quaternion.Angle(transform.rotation, Quaternion.LookRotation(target.position - transform.position)));
float mouseX = Input.GetAxis("Mouse X");
// 自身的 绕Y轴转 XX 度
transform.rotation *= Quaternion.Euler(, mouseX, );
// 世界的 绕Y轴转 XX 度
transform.rotation = Quaternion.Euler(, mouseX, ) * transform.rotation;
}
private void OnDrawGizmos()
{
Gizmos.color = new Color(, , , 0.2f);
Gizmos.DrawSphere(transform.position, );
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawCube(transform.position, cubeSize);
} }
 

Unity3D学习笔记(八):四元素和书籍推荐的更多相关文章

  1. Unity3D学习笔记(四)Unity的网络基础(C#)

    一 网络下载可以使用WWW类下载资源用法:以下载图片为例WWW date = new WWW("<url>");yield return date;texture = ...

  2. [转]Unity3D学习笔记(四)天空、光晕和迷雾

    原文地址:http://bbs.9ria.com/thread-186942-1-1.html 作者:江湖风云 六年前第一次接触<魔兽世界>的时候,被其绚丽的画面所折服,一个叫做贫瘠之地的 ...

  3. Unity3D学习笔记(四):物理系统碰撞和预制体

    Rigidbody(刚体组件):加了此组件游戏物体就变成刚体了 ----Mass(质量,单位kg):重力G = 质量m * 重力加速度g(g=9.81 m/s^2) --------冲量守恒定理 动量 ...

  4. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  5. X-Cart 学习笔记(四)常见操作

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 五.常见 ...

  6. C++Primer第5版学习笔记(四)

    C++Primer第5版学习笔记(四) 第六章的重难点内容         你可以点击这里回顾第四/五章的内容       第六章是和函数有关的知识,函数就是命名了的代码块,可以处理不同的情况,本章内 ...

  7. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  8. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  9. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

随机推荐

  1. Python3学习之路~2.3 字符串操作

    字符串操作 特性:不可修改 name="my \tname is alex" print(name.capitalize()) #首字母变大写 print('Alex LI'.ca ...

  2. 发现XMind一个超级牛逼的功能

    本来想要自己手动建立下文件夹的结构图,一不小心发现了一个大惊喜. 比如想要看一下360Downloads文件夹下的文件结构,可以先创建一个名叫360Downloads的主节点,然后把其文件夹下的文件直 ...

  3. python中operator.itemgetter函数

    operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. k = [,,] b = ) print(b(k)) #输 ...

  4. [py][mx]django form验证-给db减压

    django form认证-解压db压力 一般系统都需要前后端都验证 前端验证容器逃逸破解,如通过js console口去发 试想如果后端只有db验证,那么前端无论发什么后端都查询一次db,对db压力 ...

  5. spring的bean容器加载

    1.在单独使用的时候可以通过ClassPathXmlApplicationContext(“配置文件.xml”);来启动容器. 2.在MVC下是通过启动servlet容器,初始化DispatcherS ...

  6. 浅谈远程登录时,ssh的加密原理

    SSH:Secure Shell,是一种网络安全协议,主要用于登录远程计算机的加密过程. 登录方式主要有两种: 1.基于用户密码的登录方式:   加密原理:   当服务器知道用户请求登录时,服务器会把 ...

  7. .Net Core 使用依赖注入

    ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection 在asp .net中使用依赖注入很简单,只需要在Startup类的 ...

  8. ajax提交form(文本数据以及文件上传)

    $.ajax({ url: 'xxxx.do', type: 'POST', cache: false, data: new FormData($('.layui-form')[0]), proces ...

  9. 【转】Linux进程绑CPU核

    1. 什么是绑核? 所谓绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity).设定以后,Linux调度器就会让这个进程/线程只在所绑定的核上面去运行.但并不是说该进程/线程就独占 ...

  10. Linux基础命令---mv

    mv 将文件或者目录移动到另一个地方,或者重命名. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法       mv [选项 ...