[转]Unity 3D旋转矢量方向及二维平面基于一点选择另一点(Rotate a Vector3 direction & Rotate a point about another point in 2D )
http://specialwolf.blog.163.com/blog/static/124466832201301332432766/
***********************************
极简单却又极坑的问题
以下代码用来实现: 已知某gameObject的方向, 由此得到此方向偏转某角度后的方向.
附: Transform.forward 和 Vector3.forward 不同.
Transform.forward是世界坐标系下物体的正方向,即编辑器中物体的蓝色轴。
Vector3.forward只不过是vector(0, 0, 1)的缩写
鄙视一下此类蛋疼的写法.
Vector3 dVector = playerObj.transform.forward; Vector3 newVector; if(i > maxCount/2)
{
newVector = Quaternion.AngleAxis(-20*(maxCount -i), Vector3.up) * dVector;
}
else
{
newVector = Quaternion.AngleAxis(20*i, Vector3.up) * dVector;
}
附打印出来的几个 :
playerObj.transform.forward;
/*
正前 0 0 1
左30 -0.6 0 0.8
左 -1 0 0
左下 -0.6 0 -0.8
下 0 0 -1
*/
************************************
在使用Unity引擎时很多朋友都会遇到这样的问题,即关于方向(专业点说是矢量)的旋转问题。

如左图中,很多朋友都会使用Vector3.forward来表示“前方”,具体到角色身上时就是transform.forward了,有时我们需要将该方向基于角色所在的位置旋转N度,对于新手、没有经过正规的游戏编程培训或数学不怎么好的朋友(这里其实说我自己),这里是有些恼人的,但在Unity官方论坛上有人给出了答案,我这里只是整理了一哈:
参考:http://answers.unity3d.com/questions/46770/rotate-a-vector3-direction.html
// 将角色或车轮向右旋转30度
Vector3 newVector = Quaternion.AngleAxis(30, Vector3.up) * Vector3.forward;
// 或者
Vector3 newVector = Quaternion.Euler(0,30,0) * Vector3.forward;
要注意的就是该运算是有顺序的,必须将四元数放在前面。
附带说明一下如何实现一个点围绕另外一个点旋转指定角度的问题(注意这里只是说明基于二维情况下的旋转),其实这纯粹是一个数学问题,只不过是如何在Unity中实现罢了。
可以先看一下解决思路:
http://www.siggraph.org/education/materials/HyperGraph/modeling/mod_tran/2drota.htm
这是高中的教材内容,可惜……
怎么用编程表示该内容呢?通用编程可以考虑这里:
http://stackoverflow.com/questions/2259476/rotating-a-point-about-another-point-2d
如果你也是使用Unity做为开发引擎,可以参考如下代码:如下代码是考虑基于Y轴旋转的,所以你可以将点(x,z)看做平面内的一个支点,angle表示要基于(x,z)点旋转的角度,point是要旋转的点,具体代码如下:
Vector3 RotatePoint(float x, float z, float angle, Vector3 point)
{
// Translate point back to origin;
Vector3 temp = new Vector3(point.x -= x, point.y, point.z -= z);
// Roate the point
float xNew = Mathf.Cos(angle * Mathf.Deg2Rad) * (point.x) - Mathf.Sin(angle * Mathf.Deg2Rad) * (point.z);
float zNew = Mathf.Sin(angle * Mathf.Deg2Rad) * (point.x) + Mathf.Cos(angle * Mathf.Deg2Rad) * (point.z);
temp.x = xNew + x;
temp.z = zNew + z;
return temp;
}
在三维空间中基于某点旋转特定角度可以参考:
http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/ArbitraryAxisRotation.html
http://blog.client9.com/2007/09/rotating-point-around-vector.html
Author : Neo
Date : 2013-01-13
[转]Unity 3D旋转矢量方向及二维平面基于一点选择另一点(Rotate a Vector3 direction & Rotate a point about another point in 2D )的更多相关文章
- C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型
遇到一个想做的功能,但是实现不了,核心原因是因为对U3D的3D数学概念没有灵活吃透.故再次系统学习之—第三次学习3D数学. 本次,希望实现的功能很简单: 如在小地图中,希望可以动态画出Player当前 ...
- Unity手游之路<四>3d旋转-四元数,欧拉角和变幻矩阵
http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转.主要有三种方式.变换矩阵,四元数和欧拉角. 定义 变换矩 ...
- Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制
今天分享一些基础控制的脚本 1.位置(Position): 控制位置很简单,首先要知道要在xyz哪几个轴上移动,确定好后定义代表着那些轴的移动变量,速度(m_speed在函数外定义为全局变量)然后通过 ...
- 再议Unity 3D
一年前,偶发冲动,翻译了<[译] Unity3D游戏和facebook绑定(1:简介)>系列文章. 现在看有2个明显的好处, 一:给这个不温不火的博客带了top 3的人气: 二:我个人由此 ...
- Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果
Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果 梗概: 一. 摄像机围绕目标物体旋转, 即摄像机离目标物体有一定的距离且旋转轴心为该物体的位置. 二. 当目标物体被障碍物挡住后, 需要将摄像机 ...
- 关于Unity中的transform组件(二)
在Scene视图中的蓝色网格,每一格默认是1米 一.沿着Z轴每秒移动10米 Transform cube_trans; void start(){ this.cube_trans=this.trans ...
- Unity 3d导入3dMax模型 产生若干问题
Unity 3d导入3dMax模型 会产生若干问题,按照官方 的说明,将max 模型导成fbx文件 导入untiy似乎也不能解决 1.x轴向偏转3dmax模型导入后自动有一个x轴270度的偏转,巧合的 ...
- 【CSS3进阶】酷炫的3D旋转透视
之前学习 react+webpack ,偶然路过 webpack 官网 ,看到顶部的 LOGO ,就很感兴趣. 最近觉得自己 CSS3 过于薄弱,想着深入学习一番,遂以这个 LOGO 为切入口,好好研 ...
- 3D旋转菜单
今天来个3D旋转菜单,是纯css3实现的,主要用到transform,transition,backface-visibility. 主要是transform这个变换,它是今天猪脚. transfor ...
随机推荐
- 页面嵌套 Iframe 产生缓存导致页面数据不刷新问题
最近遇到个比较古怪的问题:当页面嵌套多个 Iframe 时会出现 Iframe 里包含的页面无法看到最新的页面信息. 初步解决方案,在 Iframe 指向的页面地址后缀添加一个随机数或者时间戳.这样能 ...
- CustomEditor的文件要放在Assets/Editor目录下
using UnityEditor; using UnityEngine; [CustomEditor(typeof(test))] public class testEditor : Editor ...
- Activiti安装
1.Activiti下载与简介 1.1 简介 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG), ...
- STL中map与hash_map的比较
1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O ...
- 代码方式删除SVN
public static void delect(File s) { File b[] = null; if (s.exists()) {// 判读是否存在 if (s.isDirectory()) ...
- Shell数组
#!/bin/bash#数组的使用#数组赋值方式:#1. user[index]=value index为0,1,2,3,4....数组下标值#2. user=(value0 value1 value ...
- 解决修改SQL SERVER 默认1433端口 访问出错的问题;
1. 如何修改 数据库默认的 1433端口: SQL SERVER 配置管理器中 SQLSERVER 网络配置 xxx数据实例的协议中的 TCP/IP 中 默认端口 都修改为 自己定义的端口 例如 ...
- REST接口规范
参考文章 这篇文章使用不同的method代表不同操作 http://www.cnblogs.com/tommyli/p/3913018.html 实际应用中(我们过去的应用) 则是直接使用url来代表 ...
- sea.js,spm学习
安装spm 下载sea.js 运行spm npm install spm@2.x -g npm install spm-build -g 下载sea.js git clone https://gith ...
- Couldn't get lock for %t/vertx.log
今天在启动vertx框架的项目时,报“Couldn't get lock for %t/vertx.log”的错误. 解决方案: 1,找出vertx.log的目录.一般在(C:\Users\Admin ...