unity2D以最小的角度旋转到目标方向(y方向为角色的主方向)
一.使用向量原理转换到目标方向
为了让角色的自身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方向为角色的主方向)的更多相关文章
- JAVA对图片的任意角度旋转,以及镜像操作
package relevantTest;/* * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果. * 在对图像进行任意 ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1435 Solve ...
- js 前端图片压缩+ios图片角度旋转
step1:读取选择的图片,并转为base64: function ImgToBase64 (e, fn) { // 图片方向角 //fn为传入的方法函数,在图片操作完成之后执行 var Orient ...
- [Swift-2019力扣杯春季初赛]3. 最小化舍入误差以满足目标
给定一系列价格 [p1,p2...,pn] 和一个目标 target,将每个价格 pi 舍入为 Roundi(pi) 以使得舍入数组 [Round1(p1),Round2(p2)...,Roundn( ...
- 在word中输入任意角度旋转图片
Sub 图片旋转任意角度() Dim sha As Shape, isa As InlineShape Static s As Integer Application.ScreenUpdating = ...
- bzoj 1185 [HNOI2007]最小矩形覆盖——旋转卡壳
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 矩形一定贴着凸包的一条边.不过只是感觉这样. 枚举一条边,对面的点就是正常的旋转卡壳. ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖-旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标-备忘板子
来源:旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标 BZOJ又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"str ...
- bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包
[HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 2081 Solved: 920 ...
- 【bzoj1185】[HNOI2007]最小矩形覆盖 (旋转卡壳)
给你一些点,让你用最小的矩形覆盖这些点 首先有一个结论,矩形的一条边一定在凸包上!!! 枚举凸包上的边 用旋转卡壳在凸包上找矩形另外三点... 注意精度问题 #include<cstdio> ...
随机推荐
- VS2017C++单元测试
0.欢迎食用 希望对点进来的你有所帮助. 全文记流水账,内心想法如示例项目名称. 1.建立需测试的项目 新建项目 正常书写.h 和.cpp文件 2.新建单元测试 右击解决方案 -> 添加 -&g ...
- sql !=与null
在写SQL 条件语句是经常用到 不等于‘<>’的筛选条件,此时要注意此条件会将字段为null的数据也当做满足不等于的条件而将数据筛选掉. 例:表A A1 B1 1 0 2 1 3 NUL ...
- 四、 git关联远程仓库及推送
接之前笔记,在 github上建立与本地同名的仓库 demo 关联远程仓库 1. https 模式 远程库的名字就是origin,这是Git默认的叫法 git remote add origi ...
- HTML5音/视频标签详解
一.发展历: 早期:<embed>+<object>+文件 问题:不是所有浏览器都支持,而且embed不是标准. 现状:Realplay.window media.Qu ...
- 1.HBase In Action 第一章-HBase简介(后续翻译中)
This chapter covers ■ The origins of Hadoop, HBase, and NoSQL ■ Common use cases for HBase ■ A basic ...
- oneinstack远程管理数据库
本篇文章主要内容是本地工具连接数据非网页(网站)连接 如果你想使用网页(网站)连接远程数据库,请看下面的官网教程 OneinStack如何配置MySQL远程连接? 为了安全考虑,OneinStack仅 ...
- MP实战系列(十一)之封装方法详解(续一)
之前写的封装方法详解,比较简要. 今天我主要讲增加和删除及其修改.查的话得单独再详讲. 增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个. 一.增加方法讲解 MyBatis Pl ...
- [转]VS2013+简单稀疏光束调整库SSBA配置(64位编译)
有关SSBA库的资源比较少,我是在Github上搜索下载的,具体的GitHub官方下载地址为:SSBA 下载后在SSBA解压文件夹下新建文件夹build. 打开cmake gui,在source co ...
- jmeter数据库查询与接口返回进行对比
今天在群里又看到了一个小伙伴问类似的问题,[jmeter如何实现数据库查询出来的结果与接口返回的结果进行对比判断,或者数据库两字段的相加减与接口返回进行对比].其实都一样,因为你把运算放在查询那里就行 ...
- SVN 错误收集
一.the working copy is locked due to a previous error 解决办法:在 Cornerstone 右键本地工程 --> clean.