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

为了让角色的自身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. 高通 display 驱动【转】

    高通display驱动 0. 关键字 MDSS : 高通平台lcd multimedia Display sub system DSI: Display Serial Interface qcom,m ...

  2. soapui 调用wsdl 步骤以及出现的问题

    创建soap project 添加wsdl 地址(或者导入wsdl(后缀可以是xml或者wsdl)文件) 添加request 自动生成请求代码 参数放在in0 中 <soapenv:Envelo ...

  3. python虚拟环境 -- virtualenv , virtualenvwrapper

    virtualenv -- python虚拟沙盒 有人说:virtualenv.fabric 和 pip 是 pythoneer 的三大神器. 一.安装 pip install virtualenv ...

  4. 【转】学习Linux守护进程详细笔记

    [原文]https://www.toutiao.com/i6566814959966093837/ Linux守护进程 一. 守护进程概述 守护进程,也就是通常所说的Daemon进程,是Linux中的 ...

  5. kettle 启动spoon一闪而过

    Kettle是Pentaho的一个组件,主要用于数据库间的数据迁移(ETL). Kettle有三个主要组件:Spoon,Kitchen,Pan.其中Spoon是一个图形化的界面. 一.安装kettle ...

  6. 第 15 章 位操作(binbit)

    /*------------------------------------ binbit.c -- 使用位操作显示二进制 ------------------------------------*/ ...

  7. PyQt5--EventHandler

    # -*- coding:utf-8 -*- ''' Created on Sep 14, 2018 @author: SaShuangYiBing ''' import sys from PyQt5 ...

  8. 【Ansible 文档】【译文】模式

    Patterns 模式 Ansible中的模式是指我们如何决定那些机器执行管理操作.这里意味着与那些主机通信,但是对于playbook,它是指哪些主机应用特定的配置或执行特定程序. 我们将重温一下In ...

  9. spring amqp初步了解

    Rabbitmq简介 生产者会把消息发送给RabbitMQ的交换中心(Exchange),Exchange的一侧是生产者,另一侧则是一个或多个队列,由Exchange决定一条消息的生命周期--发送给某 ...

  10. C#中用HttpWebRequest中发送GET/HTTP/HTTPS请求

    C# HttpWebRequest GET HTTP HTTPS 请求  作者:周公(zhoufoxcn)    原文:http://blog.csdn.net/zhoufoxcn 这个需求来自于我最 ...