电费为什么乘以30要乘以unity

用unity开发vr的你 需要一点建议:乘以十——6a.com丨VR专区丨资讯丨游戏
用unity开发vr的你 需要一点建议:乘以十--6A数据平台|6A资讯
6A资讯站 >网游>正文
用unity开发vr的你 需要一点建议:乘以十
有人在 reddit 上发问:第一次为 vive 开发,有什么建议吗?是unity。cratesmith 给出了一点容易被忽略,但对 vr 来说很重要的建议:最重要的:把世界的规模变成十倍大。具体就是要把 player、playspace、camera 都调成十倍大。对于 1 — 10 米规模的物体,unity的物理设定是“最准确的”,然而对于 vr,这个范围就会变成 10 厘米— 1 米。补充:还需要把物体的质量乘以 10(比如 -9.8 克应该变为 -98 克),否则所有东西会变得非常漂,并且看起来像是慢动作。但如果这样更好,为什么unity没有将其设定为默认设置?cratesmith 进一步解释:unity确实没有这样设计。他们在尽可能保持工具的简单性,让其上手简单,但是这样有时候(通常是做新东西)会让你找不到一些设置。举个例子:physics、occlusion culling、lighting 这些设置unity只是给出底层中间件提供的那些的一小部分。这就是说如果 vr 继续前进发展的话,开发者可能会得到更多优待。【87870原创文章,转载须注明来源及链接】
您看完后的心情是
粤网文[-284号程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五)
Unity3D研究院之主角面朝方向一定区域内对象角度计算(四十五)
围观43266次
编辑日期: 字体:
写在前面的话,前两天有个朋友在QQ上问我 如何获取主角面朝方向一定区域中的敌人对象。这个命题看似简单,其实里面蕴含了很多数学方面的东西。今天刚好有时间我就彻底的把这个疑问写在博客中。希望可以帮助到他。
在上代码之前请大家跟我先做几个简单的练习题,角度向量的计算一定要学会,不然后面的东西会很难懂。
1.已知3D坐标,和一个旋转角度,以及一段距离,求目标点的3D坐标。
已知当前点为Target,目标点沿着Target的Y轴旋转30度,沿着Target的X轴延伸10米求目标点的3D坐标?
1234567891011121314151617
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour{& public Transform Target;& void LateUpdate () {
Quaternion rotation = Quaternion.Euler(0f,30f,0f) * Target.rotation;
Vector3&&newPos = rotation * new Vector3(10f,0f,0f);
Debug.DrawLine(newPos,Vector3.zero,Color.red);
Debug.Log("newpos " + newPos +" nowpos " + Target.position + " distance " + Vector3.Distance(newPos,Target.position)); }&}
输出结果 :新坐标 (8.7, 0.0, -5.0) 当前坐标 (0.0, 0.0, 0.0)两点之间的距离 10。
2.已知3D模型的角度求它的向量。
已知3D模型Target,Y轴旋转30度后向前平移。
1234567891011121314151617181920
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour{& public Transform Target;& void LateUpdate () {&
if(Input.GetMouseButton(0))
Quaternion rotation = Quaternion.Euler(0f,30f,0f) * Target.rotation;
Vector3&&newPos = rotation * Vector3.forward;
Target.Translate(newPos.x,newPos.y,newPos.z);
3.已知一个目标点,让模型朝着这个目标点移动。
这是一个比较简单的例子,大家应该都能看明白。
Target.transform.LookAt(new Vector3 (100f,200f,300f));
Target.Translate(Vector3.forward);
这里我要说的就是Vector3.forward ,它等价与 new Vector3(0,0,1);它并不是一个坐标,它是一个标准向量,方向是沿着Z轴向前。这样平移一次的距离就是1米, 如果Vector3.forward * 100那么一次平移的距离就是100米。
在看看下面这段代码
Vector3 vecn = (TargetCube.position - Target.position).normalized;&
Target.Translate(vecn *0.1f);
用向量减去一个向量求出它们的差值,normalized 是格式化向量,意思是把它们之间向量格式化到1米内。这样就可以更加精确的计算一次平移的距离了 vecn *0.1f 就标示一次平移1分米,蛤蛤。
向量不仅可以进行X Y Z轴的移动,同样可以进行旋转 ,下面这段代码就是让向量沿着Y轴旋转30度。
Vector3 vecn = (TargetCube.position - Target.position).normalized;&
vecn = Quaternion.Euler(0f,30f,0f) * vecn;&
Target.Translate(vecn *0.1f);
如果上述三道简单的练习题 你都能了然于心的话,那么本文最大的难题我相信也不会是什么难事,继续阅读吧。
假设我们需要计算主角面前5米内所有的对象时。以主角为圆心计算面前5米外的一个点,为了让大家看清楚我现将这条线绘制出来。
private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 f0 =&&(transform.position&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(transform.position,f0,Color.red); }
如下图所,我们已经将这两个点计算出来了。此时你可以动态的编辑主角Y轴的坐标,这个点永远都是沿着主角当前角度面前5米以外的点。
接下来,我们需要计算主角面前的一个发散性的角度。假设主角看到的是向左30度,向右30度在这个区域。
12345678910111213141516171819
private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 f0 =&&(transform.position&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(transform.position,f0,Color.red);&
Quaternion r0= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y - 30f,transform.rotation.eulerAngles.z);
Quaternion r1= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y + 30f,transform.rotation.eulerAngles.z);&
Vector3 f1 =&&(transform.position&&+ (r0 *Vector3.forward) * distance);
Vector3 f2 =&&(transform.position&&+ (r1 *Vector3.forward) * distance);&
Debug.DrawLine(transform.position,f1,Color.red);
Debug.DrawLine(transform.position,f2,Color.red);&
Debug.DrawLine(f0,f1,Color.red);
Debug.DrawLine(f0,f2,Color.red); }
如下图所示,这时主角面前的区域就计算出来了。看起来就是两个三角形之间的区域。
最后就是简单的套用公式,计算一个点是否在三角形内,在本文中就是计算敌人的点是否在面前的这两个三角形内。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
using UnityEngine;using System.Collections;&public class MyTest : MonoBehaviour {& public Transform cube;& private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 f0 =&&(transform.position&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(transform.position,f0,Color.red);&
Quaternion r0= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y - 30f,transform.rotation.eulerAngles.z);
Quaternion r1= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y + 30f,transform.rotation.eulerAngles.z);&
Vector3 f1 =&&(transform.position&&+ (r0 *Vector3.forward) * distance);
Vector3 f2 =&&(transform.position&&+ (r1 *Vector3.forward) * distance);&
Debug.DrawLine(transform.position,f1,Color.red);
Debug.DrawLine(transform.position,f2,Color.red);&
Debug.DrawLine(f0,f1,Color.red);
Debug.DrawLine(f0,f2,Color.red);&
Vector3 point = cube.position;&
if(isINTriangle(point,transform.position,f1,f0) || isINTriangle(point,transform.position,f2,f0) )
Debug.Log("cube in this !!!");
Debug.Log("cube not in this !!!");
}& }& private&&float triangleArea(float v0x,float v0y,float v1x,float v1y,float v2x,float v2y)
{&&&&&&&&return Mathf.Abs((v0x * v1y + v1x * v2y + v2x * v0y&&&&&&&&&&&&- v1x * v0y - v2x * v1y - v0x * v2y) / 2f);&&&&}& bool isINTriangle(Vector3 point,Vector3 v0,Vector3 v1,Vector3 v2) {
float x = point.x;
float y = point.z;&
float v0x = v0.x;
float v0y = v0.z;&
float v1x = v1.x;
float v1y = v1.z;&
float v2x = v2.x;
float v2y = v2.z;&
float t = triangleArea(v0x,v0y,v1x,v1y,v2x,v2y);
float a = triangleArea(v0x,v0y,v1x,v1y,x,y) + triangleArea(v0x,v0y,x,y,v2x,v2y) + triangleArea(x,y,v1x,v1y,v2x,v2y);&
if (Mathf.Abs(t - a) &= 0.01f)
return true;
return false;
如下图所示,如果箱子对象是主角的视野中就会检测到。
注意,上图中我的视野选择了两个三角形,如果你需要视野目标点是椭圆形的话,那么可以多设置一些三角形。但是这样就会非常消耗效率,我觉得这里完全可以使用1个三角形,,只是正对的目标点会出现一些偏差,影响其实并不会很大。如下图所示
代码简单的修改一下即可。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
using UnityEngine;using System.Collections;&public class MyTest : MonoBehaviour {& public Transform cube;& private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 f0 =&&(transform.position&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(transform.position,f0,Color.red);&
Quaternion r0= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y - 30f,transform.rotation.eulerAngles.z);
Quaternion r1= Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y + 30f,transform.rotation.eulerAngles.z);&
Vector3 f1 =&&(transform.position&&+ (r0 *Vector3.forward) * distance);
Vector3 f2 =&&(transform.position&&+ (r1 *Vector3.forward) * distance);&
Debug.DrawLine(transform.position,f1,Color.red);
Debug.DrawLine(transform.position,f2,Color.red);
Debug.DrawLine(f1,f2,Color.red);&
Vector3 point = cube.position;&
if(isINTriangle(point,transform.position,f1,f2))
Debug.Log("cube in this !!!");
Debug.Log("cube not in this !!!");
}& }& private&&float triangleArea(float v0x,float v0y,float v1x,float v1y,float v2x,float v2y)
{&&&&&&&&return Mathf.Abs((v0x * v1y + v1x * v2y + v2x * v0y&&&&&&&&&&&&- v1x * v0y - v2x * v1y - v0x * v2y) / 2f);&&&&}& bool isINTriangle(Vector3 point,Vector3 v0,Vector3 v1,Vector3 v2) {
float x = point.x;
float y = point.z;&
float v0x = v0.x;
float v0y = v0.z;&
float v1x = v1.x;
float v1y = v1.z;&
float v2x = v2.x;
float v2y = v2.z;&
float t = triangleArea(v0x,v0y,v1x,v1y,v2x,v2y);
float a = triangleArea(v0x,v0y,v1x,v1y,x,y) + triangleArea(v0x,v0y,x,y,v2x,v2y) + triangleArea(x,y,v1x,v1y,v2x,v2y);&
if (Mathf.Abs(t - a) &= 0.01f)
return true;
return false;
上面我们介绍了三角形判断,当然也可以通过矩形来判断是否相交。。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
using UnityEngine;using System.Collections;&public class MyTest : MonoBehaviour {& public Transform cube;& private float distance = 5f; void Update ()
Quaternion r= transform.rotation;
Vector3 left =&&(transform.position&&+ (r *Vector3.left) * distance);
Debug.DrawLine(transform.position,left,Color.red);&
Vector3 right =&&(transform.position&&+ (r *Vector3.right) * distance);
Debug.DrawLine(transform.position,right,Color.red);&
Vector3 leftEnd = (left&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(left,leftEnd,Color.red);&
Vector3 rightEnd = (right&&+ (r *Vector3.forward) * distance);
Debug.DrawLine(right,rightEnd,Color.red);&
Debug.DrawLine(leftEnd,rightEnd,Color.red);&
Vector3 point = cube.position;&
if(isINRect(point,leftEnd,rightEnd,right,left))
Debug.Log("cube in this !!!");
Debug.Log("cube not in this !!!");
}& }&&&&& private float Multiply(float p1x , float p1y, float p2x,float p2y, float p0x,float p0y)&&&& {&&&&&&&&return ((p1x - p0x) * (p2y - p0y) - (p2x - p0x) * (p1y - p0y));&&&& }& bool isINRect(Vector3 point,Vector3 v0,Vector3 v1,Vector3 v2,Vector3 v3) {
float x = point.x;
float y = point.z;&
float v0x = v0.x;
float v0y = v0.z;&
float v1x = v1.x;
float v1y = v1.z;&
float v2x = v2.x;
float v2y = v2.z;&
float v3x = v3.x;
float v3y = v3.z;&
if (Multiply(x,y, v0x,v0y, v1x,v1y) * Multiply(x,y, v3x,v3y, v2x,v2y) &= 0 && Multiply(x,y, v3x,v3y, v0x,v0y) * Multiply(x,y, v2x,v2y, v1x,v1y) &= 0)&&&&&&&&&&&& return true;
else&&&&&&&&&&&&return false;& }&}
如果大家看了这篇文章后发现在你的项目中还有一些比较麻烦的角度与向量的算法,欢迎在下面留言给我,如果我有时间我会第一时间把方法贴在博客中。互相学习互相进步,加油!哇咔咔。。
马上过年了,雨松MOMO在这里祝福大家2013年幸幸福福的过日子,嘿嘿。
2013年4月补充
感谢楼下朋友给我的留言。, 我在补充一下这篇博客。
12345678910111213141516171819202122232425
using UnityEngine;using System.Collections;&public class NewBehaviourScript : MonoBehaviour {& public Transform target;& void Update() {&
float distance = Vector3.Distance(target.position,transform.position);&
Quaternion right
= transform.rotation * Quaternion.AngleAxis(30,Vector3.up);
Quaternion left
= transform.rotation * Quaternion.AngleAxis(30,Vector3.down);&
Vector3 n =
transform.position + (Vector3.forward * distance);
Vector3 leftPoint = left *
Vector3 rightPoint =&&right *n ;&
Debug.DrawLine(transform.position,leftPoint,Color.red);
Debug.DrawLine(transform.position,rightPoint,Color.red);
Debug.DrawLine(rightPoint,leftPoint,Color.red);& }}
这里我以角色左右个30度。 这样就可以根据两个模型的距离以及角度来判断了。。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!Unity(99)
Unity当中经常会用到向量的运算来计算目标的方位,朝向,角度等相关数据,下面咱们来通过实例学习下Unity当中最常用的点乘和叉乘的使用。
(又称&点积&,&数量积”,&内积&)(Dot Product, 用*)
定义:a·b=|a|·|b|cos&a,b& 【注:粗体小写字母表示向量,&a,b&表示向量a,b的夹角,取值范围为[0,180]】
几何意义:是一条边向另一条边的投影乘以另一条边的长度.
v1和v2向量的点乘运算:相应元素的乘积的和:v1( x1, y1,z1) * v2(x2, y2,z2) = x1*x2 + y1*y2+z1*z2;
注意 :&结果不是一个向量,而是一个标量。
性质1: a*b = |a||b|Cos(θ)&,θ是向量a 和向量 b之间的夹角。
性质2: a*b = b*a &满足乘法交换律
Unity项目应用:
1.根据点乘计算两个向量的夹角,&a,b&= arccos(a·b / (|a|·|b|))
2.根据点乘的正负值,得到夹角大小范围,&0,则夹角(0,90)&0,则夹角(90,180)
3.根据点乘的大小,得到向量的投影长度,反应了向量的长度关系。
(又称&叉积&,&向量积&,&外积&)(cross product,用x)
定义:c = a x b,其中a b c均为向量
几何意义是:得到一个与这两个向量都垂直的向量,这个向量的模是以两个向量为边的平行四边形的面积
性质1:c⊥a,c⊥b,即向量c与向量a,b所在平面垂直
性质2:模长|c| = |a||b| sin&a,b&
性质3:(数学上)满足右手法则,&a x b = -b x a,所以我们可以使用叉乘的正负值来判断a,b的相对位置,即b是处于a的顺时针还是逆时针方向。
叉乘的右手定则是用来确定叉乘积的方向的。
右手法则:右手的四指方向指向第一个矢量,屈向叉乘矢量的夹角方向(两个矢量夹角方向取小于180°的方向),那么此时大拇指方向就是叉乘所得的叉乘矢量的方向.(大拇指应与食指成九十度)(注意:Unity当中使用左手,因为Unity使用的是左手坐标系)
数学上叉乘的右手法则
Unity当中叉乘的左手法则
Unity项目应用:
1.根据叉乘得到a,b向量的相对位置,和顺时针或逆时针方位,
2.得到a,b夹角的正弦值,计算向量的夹角(0,90),可以配合点乘和Angle方法计算出含正负的方向。
3.根据叉乘大小,得到a,b向量所形成的平行四边形的面积大小,根据面积大小得到向量的相对大小。
下面是代码
using UnityE
public class VectorExample : MonoBehaviour {
private void TestDot(Vector3 a, Vector3 b)
// 计算 a、b 点积结果
float result = Vector3.Dot(a, b);
// 通过向量直接获取两个向量的夹角(默认为 角度), 此方法范围 [0 - 180]
float angle = Vector3.Angle(a, b);
// 计算 a、b 单位向量的点积,得到夹角余弦值,|a.normalized|*|b.normalized|=1;
result = Vector3.Dot(a.normalized, b.normalized);
// 通过反余弦函数获取 向量 a、b 夹角(默认为 弧度)
float radians = Mathf.Acos(result);
// 将弧度转换为 角度
angle = radians * Mathf.Rad2D
private void TestCross(Vector3 a, Vector3 b)
//计算向量 a、b 的叉积,结果为 向量
Vector3 c = Vector3.Cross(a, b);
// 通过反正弦函数获取向量 a、b 夹角(默认为弧度)
float radians = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
float angle = radians * Mathf.Rad2D
// 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面,
//下面以X、Z轴组成的平面为例 , (Y 轴为纵轴),
// 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向,
if (c.y & 0)
// b 在 a 的顺时针方向
else if (c.y == 0)
// b 和 a 方向相同(平行)
// b 在 a 的逆时针方向
// 获取两个向量的夹角
Vector3.Angle 只能返回 [0, 180] 的值
// 如真实情况下向量 a 到 b 的夹角(80 度)则 b 到 a 的夹角是(-80)
// 通过 Dot、Cross 结合获取到 a 到 b, b 到 a 的不同夹角
private void GetAngle(Vector3 a, Vector3 b)
Vector3 c = Vector3.Cross(a, b);
float angle = Vector3.Angle(a, b);
// b 到 a 的夹角
float sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(a.normalized, b.normalized)));
float signed_angle = angle *
Debug.Log(&b -& a :& + signed_angle);
// a 到 b 的夹角
sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(b.normalized, a.normalized)));
signed_angle = angle *
Debug.Log(&a -& b :& + signed_angle);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:108572次
积分:1935
积分:1935
排名:第16501名
原创:64篇
转载:106篇
评论:46条
(6)(22)(15)(11)(1)(4)(4)(4)(2)(1)(8)(9)(10)(1)(4)(9)(1)(2)(2)(6)(9)(3)(2)(1)(2)(5)(6)(1)(2)(7)(6)(1)(1)(7)

我要回帖

更多关于 电表为什么乘以60 的文章

 

随机推荐