一.使用向量原理转换到目标方向

为了让角色的自身y转向目标方向,并且以最小角度旋转,要点是获得当前方向与目标方向的叉值,从而判断应该旋转的方向

float rotateSpeed;

//相对目标位置运动
void trackPosition02(Vector3 tarPosition)
{
Vector3 targetDir = tarPosition - transform.position;
Vector3 up = transform.up;
float angle = Vector3.Angle(targetDir, up);
if (angle <= Time.fixedDeltaTime * rotateSpeed) return;//判断角度是否小于临界值,如果小于,那么不需要旋转,此处用于避免旋转抖动
Vector3 cross = Vector3.Cross(up, targetDir);
if (cross.z > 0) transform.Rotate(new Vector3(0, 0, rotateSpeed0* Time.deltaTime)); else transform.Rotate(new Vector3(0, 0, -rotateSpeed0* Time.deltaTime));
}

可能unity提供了更简单的判定方式,知道的老兄留个评论

二.利用角度符号判断转到目标方向

这里原理和一相同,只是判断角度的方式是使用判断两者的角度差,而不是向量的叉值

float angle = Vector3.SignedAngle(transform.up, target.position - transform.position, Vector3.forward);
transform.Rotate(new Vector3(0, 0, Mathf.Sign(angle) * speed * Time.deltaTime));

三.有角度限制的转到目标方向

这里角度限制是指在局部坐标系内的角度限制,比如某个TD坦克,它的炮塔只能在正方向的-30度到正30度之间旋转,

但是除了计算局部旋转,还要加上父物体的旋转角度

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class RotateTest : MonoBehaviour
{
// The target marker.
public Transform target; // Angular speed in radians per sec.
public float speed; //Vector3.up方向为0角度方向
//局部坐标系内的最小角度和最大角度
public float minAngle;
public float maxAngle; //局部坐标系内的最小角度和最大角度转换到直接坐标系的值
public float minAngleInWorld;
public float maxAngleInWorld; void Update()
{
//父亲物体的当前角度
float offsetAngle = Vector3.SignedAngle(Vector3.up, transform.parent.transform.up,Vector3.forward); minAngleInWorld = minAngle + offsetAngle;
maxAngleInWorld = maxAngle + offsetAngle; //当前的目标方向相对世界坐标Up方向的角度,用于判断是否在设定的范围内
float angle = Vector3.SignedAngle(Vector3.up, target.position - transform.position, Vector3.forward);
//当前自身与目标的角度方向差,用于决定旋转方向
float signAngle = Vector3.SignedAngle(transform.up, target.position - transform.position, Vector3.forward);
if (angle > minAngleInWorld && angle < maxAngleInWorld) transform.Rotate(new Vector3(, , Mathf.Sign(signAngle)*speed * Time.deltaTime)); /*
float angle = Vector3.SignedAngle(transform.up, target.position - transform.position, Vector3.forward);
transform.Rotate(new Vector3(0, 0, Mathf.Sign(angle) * speed * Time.deltaTime));
*/
}
}

四.利用unity的接口旋转

//数学意义的转到目标方向
protected void RotateToDir(Vector3 dir)
{
float angle = Vector3.SignedAngle(Vector3.up, dir, Vector3.forward);
Quaternion rotation00 = Quaternion.Euler(, , angle);
transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation00, Time.fixedDeltaTime * computeRotateSpeed);
}

unity2D以最小的角度旋转到目标方向(y方向为角色的主方向)的更多相关文章

  1. JAVA对图片的任意角度旋转,以及镜像操作

    package relevantTest;/* * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果. * 在对图像进行任意 ...

  2. BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1435  Solve ...

  3. js 前端图片压缩+ios图片角度旋转

    step1:读取选择的图片,并转为base64: function ImgToBase64 (e, fn) { // 图片方向角 //fn为传入的方法函数,在图片操作完成之后执行 var Orient ...

  4. [Swift-2019力扣杯春季初赛]3. 最小化舍入误差以满足目标

    给定一系列价格 [p1,p2...,pn] 和一个目标 target,将每个价格 pi 舍入为 Roundi(pi) 以使得舍入数组 [Round1(p1),Round2(p2)...,Roundn( ...

  5. 在word中输入任意角度旋转图片

    Sub 图片旋转任意角度() Dim sha As Shape, isa As InlineShape Static s As Integer Application.ScreenUpdating = ...

  6. bzoj 1185 [HNOI2007]最小矩形覆盖——旋转卡壳

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 矩形一定贴着凸包的一条边.不过只是感觉这样. 枚举一条边,对面的点就是正常的旋转卡壳. ...

  7. BZOJ 1185: [HNOI2007]最小矩形覆盖-旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标-备忘板子

    来源:旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标 BZOJ又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"str ...

  8. bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包

    [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2081  Solved: 920 ...

  9. 【bzoj1185】[HNOI2007]最小矩形覆盖 (旋转卡壳)

    给你一些点,让你用最小的矩形覆盖这些点 首先有一个结论,矩形的一条边一定在凸包上!!! 枚举凸包上的边 用旋转卡壳在凸包上找矩形另外三点... 注意精度问题 #include<cstdio> ...

随机推荐

  1. python urllib库

    python2和python3中的urllib urllib提供了一个高级的 Web 通信库,支持基本的 Web 协议,如 HTTP.FTP 和 Gopher 协议,同时也支持对本地文件的访问. 具体 ...

  2. OpenResty 安装配置

    0. 说明 1. Windows 下安装 下载软件包 openresty-1.13.6.1-win32.zip ,解压即可食用. [开启] 直接运行 nginx.exe 在 Windows 的命令窗口 ...

  3. apache 虚拟主机及phpmyadmin 配置

    NameVirtualHost *:80 <VirtualHost *:80> ServerName www.ly.comDocumentRoot E:/mywww </Virtua ...

  4. Docker 基础 - Docker 与前端(二)

    一.Docker 系统架构 守护进程 负责容器的创建.运行和监控,还负责镜像的构建和存储.docker demon 命令可启动 Docker 守护进程. Docker 客户端 通过http与 dock ...

  5. 没有插件的sublime编辑器是没有灵魂的

    这阵子各种捣鼓,现在趁有空记录一下sublime编辑器的一些实用的插件和安装方法,下午又该继续学习了. 接下来安装的是htmlHint.jsHint.cssLint以及汉化这几种插件,其实插件会使我们 ...

  6. 【转】jquery cookie操作

    Cookie是网站设计者放置在客户端的小文本文件.Cookie能为用户提供很多的使得,例如购物网站存储用户曾经浏览过的产品列表,或者门户网站记住用户喜欢选择浏览哪类新闻. 在用户允许的情况下,还可以存 ...

  7. 【洛谷】【前缀和+st表】P2629 好消息,坏消息

    [题目描述:] uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一 ...

  8. 【转】 Android常用实例—Alert Dialog的使用

    Android常用实例—Alert Dialog的使用 AlertDialog的使用很普遍,在应用中当你想要用户做出“是”或“否”或者其它各式各样的选择时,为了保持在同样的Activity和不改变用户 ...

  9. oracle 查看删除重复数据

    1.查询重复数据select * from 表名 where 重复字段(一般为主键)in (select 重复字段 from 表名 group by 重复字段 having count(WF_OID) ...

  10. 开源http协议库curl和wget的区别和使用

    curl和wget基础功能有诸多重叠,如下载等. 在高级用途上的curl由于可自定义各种请求参数所以长于模拟web请求,用于测试网页交互(浏览器):wget由于支持ftp和Recursive所以长于下 ...