http://specialwolf.blog.163.com/blog/static/124466832201301332432766/

***********************************

极简单却又极坑的问题

以下代码用来实现: 已知某gameObject的方向, 由此得到此方向偏转某角度后的方向.

附: Transform.forward 和 Vector3.forward 不同.

Transform.forward是世界坐标系下物体的正方向,即编辑器中物体的蓝色轴。

Vector3.forward只不过是vector(0, 0, 1)的缩写

鄙视一下此类蛋疼的写法.

  1. Vector3 dVector = playerObj.transform.forward;
  2.  
  3. Vector3 newVector;
  4.  
  5. if(i > maxCount/2)
  6. {
  7. newVector = Quaternion.AngleAxis(-20*(maxCount -i), Vector3.up) * dVector;
  8. }
  9. else
  10. {
  11. newVector = Quaternion.AngleAxis(20*i, Vector3.up) * dVector;
  12. }

  

附打印出来的几个 :

  1. 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

Email : specialwolf.neo(at)gmail.com

[转]Unity 3D旋转矢量方向及二维平面基于一点选择另一点(Rotate a Vector3 direction & Rotate a point about another point in 2D )的更多相关文章

  1. C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型

    遇到一个想做的功能,但是实现不了,核心原因是因为对U3D的3D数学概念没有灵活吃透.故再次系统学习之—第三次学习3D数学. 本次,希望实现的功能很简单: 如在小地图中,希望可以动态画出Player当前 ...

  2. Unity手游之路<四>3d旋转-四元数,欧拉角和变幻矩阵

    http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转.主要有三种方式.变换矩阵,四元数和欧拉角. 定义 变换矩 ...

  3. Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制

    今天分享一些基础控制的脚本 1.位置(Position): 控制位置很简单,首先要知道要在xyz哪几个轴上移动,确定好后定义代表着那些轴的移动变量,速度(m_speed在函数外定义为全局变量)然后通过 ...

  4. 再议Unity 3D

    一年前,偶发冲动,翻译了<[译] Unity3D游戏和facebook绑定(1:简介)>系列文章. 现在看有2个明显的好处, 一:给这个不温不火的博客带了top 3的人气: 二:我个人由此 ...

  5. Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果

    Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果 梗概: 一. 摄像机围绕目标物体旋转, 即摄像机离目标物体有一定的距离且旋转轴心为该物体的位置. 二. 当目标物体被障碍物挡住后, 需要将摄像机 ...

  6. 关于Unity中的transform组件(二)

    在Scene视图中的蓝色网格,每一格默认是1米 一.沿着Z轴每秒移动10米 Transform cube_trans; void start(){ this.cube_trans=this.trans ...

  7. Unity 3d导入3dMax模型 产生若干问题

    Unity 3d导入3dMax模型 会产生若干问题,按照官方 的说明,将max 模型导成fbx文件 导入untiy似乎也不能解决 1.x轴向偏转3dmax模型导入后自动有一个x轴270度的偏转,巧合的 ...

  8. 【CSS3进阶】酷炫的3D旋转透视

    之前学习 react+webpack ,偶然路过 webpack 官网 ,看到顶部的 LOGO ,就很感兴趣. 最近觉得自己 CSS3 过于薄弱,想着深入学习一番,遂以这个 LOGO 为切入口,好好研 ...

  9. 3D旋转菜单

    今天来个3D旋转菜单,是纯css3实现的,主要用到transform,transition,backface-visibility. 主要是transform这个变换,它是今天猪脚. transfor ...

随机推荐

  1. hadoop_集群安装_2

    由于上一篇文章http://www.cnblogs.com/inuyasha1027/p/hadoop_cluster_install_1.html 截图太多,占用了太多的地方,所以将VMTools ...

  2. UIView的常见属性

    UIView的常见属性: @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDyn ...

  3. Codevs 1507 酒厂选址

    1507 酒厂选址 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description Abstinence(戒酒)岛的居民们酷爱一种无酒精啤酒 ...

  4. C++ 智能指针auto_ptr详解

    1. auto_ptr 的设计动机: 函数操作经常依照下列模式进行: 获取一些资源 执行一些动作 释放所获取的资源 那么面对这些资源的释放问题就会出现下面的两种情况: 一开始获得的资源被绑定于局部对象 ...

  5. java实现qq邮箱每天定时发送邮件

    本周四的时候去学校的某机构值班,主要工作是帮老师送文件,干一些杂活.那天没有什么活儿,于是想起用Java实现发送邮件和接收邮件的功能.前几天接触过一点quartz框架,用来实现定时开始任务的功能.于是 ...

  6. notepad++使用技巧

    1.将tab设置为插入4个空格而不是tab字符 1)点击设置-->首选项 2)选中转换为空格.点击蓝色数字,可以设置制表符宽度 2.对已有文档,进行tab和空格的相互转换 选中编辑-->空 ...

  7. 更加直观地了解hasLayout和BFC

    网络上有很多关于hasLayout和BFC相关的文章,但是大部分都显得有些晦涩难懂.所以想用一些比较直观的例子来说明hasLayout和BFC给平时的布局带来的影响. 基础知识 在讲hasLayout ...

  8. php文件上传大小限制设置

    配置选项说明: upload_max_filesize 所上传的文件的最大大小. post_max_size 设定 POST 数据所允许的最大大小. memory_limit 设定了一个脚本所能够申请 ...

  9. 《工作型PPT设计之道》培训心得

    参加包翔老师的“工作型PPT设计之道>培训,颇多心得,后来为部门新员工和同组同事做了转化培训,将心得整理成一份PPT讲义,效果颇佳.现将主要心得整理于此.因时间仓促,24条心得有拼凑之嫌,有待今 ...

  10. php发送http请求

    http请求有get,post. php发送http请求有三种方式[我所知道的有三种,有其他的告诉我]. file_get_contents();详情见:http://www.cnblogs.com/ ...