书籍推荐:

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. HTTP上传大文件的注意点

    使用HttpWebRequest上传大文件时,服务端配置中需要进行以下节点配置: <system.web> <compilation debug="true" t ...

  2. 【JMeter】JMeter进行简单的数据库(mysql)压力测试

    JMeter进行简单的数据库(mysql)压力测试 1.点击测试计划,再点击“浏览”,把JDBC驱动添加进来: 注:JDBC驱动一般的位置在java的安装地址下,路径类似于:    \java\jre ...

  3. 【Pyton】【小甲鱼】类和对象:一些相关的BIF(内置函数)

    1.issubclass(class,classinfo) 1)一个类被认为是其自身的子类 2)classinfo可以使类对象组成的元祖,只要class与其中任何一个候选类的子类,则返回True. & ...

  4. Windows操作系统上各种服务使用的端口号, 以及它们使用的协议的列表

    Windows操作系统上各种服务使用的端口号, 以及它们使用的协议的列表 列表如下 Port Protocol Network Service System Service System Servic ...

  5. Spark2.x学习笔记:Spark SQL的SQL

    Spark SQL所支持的SQL语法 select [distinct] [column names]|[wildcard] from tableName [join clause tableName ...

  6. POJ3009:Curling 2.0(dfs)

    http://poj.org/problem?id=3009 Description On Planet MM-21, after their Olympic games this year, cur ...

  7. PAT 1015 Reversible Primes[求d进制下的逆][简单]

    1015 Reversible Primes (20)(20 分)提问 A reversible prime in any number system is a prime whose "r ...

  8. 计划任务cmd 清理文件

    forfiles.exe /p D:\mysql-back /s /m * /d -30 /c "cmd /c del /q @path" #清理目录下创建大于30天所有类型的文件

  9. [LeetCode] 237. Delete Node in a Linked List_Easy tag: Linked List

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  10. iis服务器配置

    对应的步骤在文件中上传了rar文件 1 .net framework 4.0 和 framework 4.5 直接安装程序  先安装4.0 再安装4.5 顺序不能颠倒!下载完直接安装 如果有会提示本机 ...