Unity3D学习笔记(七):叉乘和四元素
public static Quaternion Euler(Vector3 euler);
public static Quaternion Euler(float x, float y, float z);
public static Quaternion LookRotation(Vector3 forward);
public static Quaternion LookRotation(Vector3 forward, [DefaultValue("Vector3.up")] Vector3 upwards);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LerpTest : MonoBehaviour
{
public Transform sphere;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
//API:Vector3.Lerp,线性插值,起始位置from,目标位置to,每次插剩余距离(from-to)的百分之多少t
transform.position = Vector3.Lerp(transform.position, sphere.position, 0.05f);
//Lerp的匀速移动
transform.position = Vector3.Lerp(transform.position, sphere.position, /Vector3.Distance(transform.position,sphere.position) * 0.05F);
//Lerp的匀速旋转
//API:Mathf.Lerp();
}
}
判断方位
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyLookPlayer : MonoBehaviour {
public Transform player;
public float result1;
public float result2;
// Use this for initialization
void Start () {
Vector3 forwardVector = transform.forward;
Vector3 enemy2Player = player.position - transform.position;
//result1 = enemy2Player.x * forwardVector.x + enemy2Player.y * forwardVector.y + enemy2Player.z + forwardVector.z;
result1 = Vector3.Dot(forwardVector, enemy2Player);
Vector3 result = Vector3.Cross(forwardVector, enemy2Player);
result2 = result.y;
} // Update is called once per frame
void Update () { }
public void OnGUI()
{
if (result1 > )
{
if (result2 > )
{
GUILayout.Label("玩家在我的方位:右前方");
}
else
{
GUILayout.Label("玩家在我的方位:左前方");
}
}
else
{
if (result2 > )
{
GUILayout.Label("玩家在我的方位:右后方");
}
else
{
GUILayout.Label("玩家在我的方位:左后方");
}
} }
}
路点移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FindPath : MonoBehaviour {
public Transform[] paths;
public Vector3 dir;
public float moveSpeed;
public float rotSpeed;
int index = ;
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
if (Vector3.Distance(paths[index].position, transform.position) <= 0.5f)
{
index++;
index %= paths.Length;
}
dir = paths[index].position - transform.position;
transform.Translate(dir *Time.deltaTime* moveSpeed,Space.World);
Quaternion targetRotation = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation,/ Quaternion.Angle(transform.rotation, targetRotation)* rotSpeed);
}
}
用单例类来管理路点
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PathManager : MonoBehaviour {
//用单例类来管理路点
public static PathManager instanse = null;
public static PathManager Instanse
{
get
{
return instanse;
}
}
int index = ;
void Awake()
{
instanse = this;
}
// Use this for initialization
void Start () {
//transform.GetChild(1);
}
// Update is called once per frame
void Update () { }
public Vector3 GetCurrentPos()
{
return transform.GetChild(index).position;
}
public bool IsReached(Vector3 targetPos)
{
Vector3 currPos = GetCurrentPos();
//忽略路点的高度
currPos.y = targetPos.y;
//根据步径调整0.5f的值
return Vector3.Distance(currPos, targetPos) < 0.5f;
}
public void MoveNext()
{
index++;
//index = index % transform.childCount;
index %= transform.childCount;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class QuaternionTest : MonoBehaviour
{
public Transform girl;
// Use this for initialization
void Start()
{
//把旋转量赋值给transform.rotation
transform.rotation = new Quaternion(, Mathf.Sin( * Mathf.Deg2Rad), , Mathf.Cos( * Mathf.Deg2Rad));
//用乘法表示旋转量叠加
transform.rotation *= new Quaternion(, Mathf.Sin( * Mathf.Deg2Rad), , Mathf.Cos( * Mathf.Deg2Rad)); //API:Quaternion.AngleAxis,输入轴角对儿,返回四元数,如绕着y轴旋转90度
transform.rotation = Quaternion.AngleAxis(, Vector3.up);
//用乘法表示旋转量叠加,先绕着y轴旋转45度,再绕着y轴旋转90度,结果是-225(135)
transform.rotation = Quaternion.AngleAxis(, Vector3.up) * Quaternion.AngleAxis(, Vector3.up); //四元数不满足乘法交换律
//先绕着y轴旋转45度,再绕着x轴旋转45度,结果是(45,45,0)
transform.rotation = Quaternion.AngleAxis(, Vector3.up) * Quaternion.AngleAxis(, Vector3.right);
//先绕着x轴旋转45度,再绕着y轴旋转45度
transform.rotation = Quaternion.AngleAxis(, Vector3.right) * Quaternion.AngleAxis(, Vector3.up);
}
// Update is called once per frame
void Update()
{
//API:Quaternion LookRotation(Vector3 forward);
Vector3 dir = girl.position - transform.position;
//transform.rotation = Quaternion.LookRotation(dir);
//目标位置
Quaternion targetRotation = Quaternion.LookRotation(dir);
//Slerp球形插值,每次0.01f慢慢插
//transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, 0.01f);
//
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, / Quaternion.Angle(transform.rotation, targetRotation));
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
public float moveSpeed = ;
public float rotSpeed = ;
public float radius = ;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
Vector3 targetPos = PathManager.Instanse.GetCurrentPos();
Vector3 moveDir = targetPos - transform.position;
moveDir.y = ;
//目标与主角y值一致
targetPos.y = transform.position.y;
//移动
transform.position = Vector3.Lerp(transform.position, targetPos, / Vector3.Distance(transform.position, targetPos) * moveSpeed);
//旋转
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(moveDir), / Quaternion.Angle(transform.rotation, Quaternion.LookRotation(moveDir)) * rotSpeed);
//画线
Debug.DrawLine(transform.position, targetPos, Color.green);
//判断是否达到
if (PathManager.Instanse.IsReached(transform.position))
{
PathManager.Instanse.MoveNext();
}
}
private void OnDrawGizmos()
{
Gizmos.color = new Color(, , , 0.3f);
Gizmos.DrawSphere(transform.position, radius);
}
}
补充内容
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class w06d3 : MonoBehaviour {
public Transform target;
public Transform cam;
public Vector3 camerPosOffset;
public float hOffset;
public float moveSpeed = ;
// 1、向量加法的几何意义
// 2、向量减法的几何意义
// 3、向量的点乘的几何意义
// a.b = a.x * b.x + a.y * b.y + a.z * b.z
// a.b = |a| * |b| * cos<a, b>
// a.b = (|b| * cos<a, b>) * |a|
// a.b = (|a| * cos<a, b>) * |b| a向量在b向量上的投影长度 * b向量的模长
// b是单位向量的话, a向量在b向量上的投影长度
// a、b 都是单位向量的话,两个向量的夹角的余弦值
void Start () { if( Vector3.Angle(transform.forward, target.position - transform.position) < )
{
}
} void Update () {
cam.position = transform.position + camerPosOffset;
cam.LookAt(transform.position + Vector3.up * hOffset);
transform.Translate((target.position - transform.position).normalized * moveSpeed * Time.deltaTime, Space.World); }
private void OnTriggerEnter(Collider other)
{ }
private void OnCollisionEnter(Collision collision)
{ }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pool<T> where T : UnityEngine.Object
{
public readonly int Capacity = ;
List<T> items = new List<T>();
public Pool(int capacity = )
{
this.Capacity = capacity;
}
public bool Push(T item)
{
if (items.Count >= Capacity - ) return false;
items.Add(item); return true;
}
public T Pop()
{
if (items.Count == ) return default(T);
T item = items[items.Count - ];
items.RemoveAt(items.Count - );
return item;
}
}
Unity3D学习笔记(七):叉乘和四元素的更多相关文章
- Unity3D学习笔记(八):四元素和书籍推荐
书籍推荐: 3D数学基础:图形与游戏开发——游戏软件开发专家系列(美)邓恩 Unity Shader入门精要 冯乐乐(92年) 数据结构(Python语言描述) 数据结构.算法与应用(C++语言描述) ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】
iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...
- Linux学习笔记(七) 查询系统
1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...
- go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)
目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...
- Java IO学习笔记七:多路复用从单线程到多线程
作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...
- Unity3D学习笔记2——绘制一个带纹理的面
目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...
- Unity3D学习笔记8——GPU实例化(3)
目录 1. 概述 2. 详论 2.1. 自动实例化 2.2. MaterialPropertyBlock 3. 参考 1. 概述 在前两篇文章<Unity3D学习笔记6--GPU实例化(1)&g ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
随机推荐
- 查看修改MySQL字符集
查看修改MySQL字符集 http://blog.sina.com.cn/s/blog_70ac6bec01016fts.html 查看修改MySQL字符集 (2012-08-22 09:53:21) ...
- java项目连接jdbc报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server
java项目连接jdbc报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not creat ...
- phpmyadmin-配合nginx与php安装
1. 概况 phpMyAdmin是用来在网页端图形化操作MySQL数据库的工具,使用起来非常直观,目前最新版本是4.8.3.在搭建web集群架构时可能有这样的需求,数据库安装在专门的一台机器上,但是希 ...
- 源代码下载 作者:王先荣(Xianrong Wang)
作者:王先荣(Xianrong Wang) 下面是我的一些源代码: 1. 图像处理学习系列源代码——包括该系列文章的几乎所有代码: 1.5. 图像处理学习系列中用到的dll文件包——将这个解压缩之后放 ...
- Linux CentOS6.5下编译安装MySQL 5.6
检查:卸载掉原有MySql 因为mysql数据库在Linux上实在是太流行了,所以目前下载的主流Linux系统版本基本上都集成了mysql数据库在里面,我们可以通过如下命令来查看我们的操作系统上是否已 ...
- C:\WINDOWS\system32\drivers\etc\hosts 文件的作用
先来看一看C:\WINDOWS\system32\drivers\etc\hosts 系统原来的hosts文件(未经过改动) 打开原来的hosts文件,查看原来的内容 host是一个没有扩展名的系统文 ...
- 使用JDBC+POI把Excel中的数据导出到MySQL
POI是Apache的一套读MS文档的API,用它还是可以比较方便的读取Office文档的.目前支持Word,Excel,PowerPoint生成的文档,还有Visio和Publisher的. htt ...
- OO第三次阶段性总结
一.规格化设计的历史以及人们重视的原因 发展历史 从20世纪60年代开始,就存在着许多不同的形式规格说明语言和软件开发方法.在形式规格说明领域一些最主要的发展过程列举如下: 1969-1972 C.A ...
- mysql主从数据库不同步的2种解决方法 (转载)
今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. show master status; ...
- c# 获取某个进程的CPU使用百分百(类似任务管理器中显示CPU)
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...