1. 转换c#的例子中,发现对vector.dot直接用了ArcCos,如float angle = (float)Math.Acos(Vector3.Dot(toMoveTarget, tank.Direction))
为什么没用到两个的模?
答:因为内部把两个向量Normal化了。
2. 发现使用
if (tank.rotationDirection == RotationDirection.Unknown) { Vector3 cr = Vector3.Cross(toMoveTarget, direction); if (cr.Y < 0) tank.rotationDirection = RotationDirection.Left; else tank.rotationDirection = RotationDirection.Right; } |
来判断坦克左转或者右转。原理是什么?
答:原来学习时,只知道叉积可以获得同时垂直两个向量的向量。google后才知道。它能帮助判断两个向量的顺逆时针关系。
可是貌似只用于2-D几何解释,上面的代码就是把Y设为0,这样最后结果就是在X与Z组成的平面上2个向量之间,
即坦克位置与目标之间形成的向量toMoveTarget, 与坦克朝向向量direction之间是什么顺逆时针关系。
读了英文WiKi后,才发现中文的转载有个小问题!
而且,什么是伪向量?
参考:
http://blog.csdn.net/lichunguang1542/article/details/4618987
(经过对比英文原版,
发现中文对叉积几何解释错误了:
“则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积”
WiKi: “The magnitude of the cross product can be interpreted as the positive area of theparallelogram havinga andb as sides ”
对比之下大家明白了没?是叉积的模代表平行四边形的带符号面积,而不是叉积本身)
http://blog.csdn.net/csmqq/article/details/654787 (问题同上。而且3维向量情况下,我们判断2个向量的顺逆时针关系怎么判断??难道也是把某个坐标设为0??)
http://en.wikipedia.org/wiki/Cross_product (叉积英文解释,中文的缺了一大堆)
可惜中文的都是针对2维的,3维的要看英文。
http://www.topcoder.com/tc?d1=tutorials&d2=geometry1&module=Static (特别提到叉积判断顺逆时针是2-D情况)