|
|
@ -97,7 +97,7 @@ export function polar<T extends Vector2 | Vector3>(v: T, an: number, dis: number
|
|
|
|
return v;
|
|
|
|
return v;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function angle(v: Vector3 | Vector2)
|
|
|
|
export function angle(v: Vector3 | Vector2): number
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let angle = Math.atan2(v.y, v.x);
|
|
|
|
let angle = Math.atan2(v.y, v.x);
|
|
|
|
if (equaln(angle, 0, 1e-8)) return 0;
|
|
|
|
if (equaln(angle, 0, 1e-8)) return 0;
|
|
|
@ -113,13 +113,17 @@ export function angle(v: Vector3 | Vector2)
|
|
|
|
* @param {Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1
|
|
|
|
* @param {Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1
|
|
|
|
* @returns
|
|
|
|
* @returns
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function angleTo(v1: Vector3, v2: Vector3, ref: Vector3 = new Vector3(0, 0, 1))
|
|
|
|
export function angleTo(v1: Vector3, v2: Vector3, ref: Vector3 = ZAxis): number
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!ref.equals(new Vector3(0, 0, 1)))
|
|
|
|
if (v1.equals(ZeroVec) || v2.equals(ZeroVec))
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
ref = ref.clone();
|
|
|
|
|
|
|
|
v1 = v1.clone();
|
|
|
|
v1 = v1.clone();
|
|
|
|
v2 = v2.clone();
|
|
|
|
v2 = v2.clone();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ref !== ZAxis && !ref.equals(ZAxis))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ref = ref.clone();
|
|
|
|
//任意轴坐标系. 使用相机的构造矩阵.
|
|
|
|
//任意轴坐标系. 使用相机的构造矩阵.
|
|
|
|
ref.multiplyScalar(-1);
|
|
|
|
ref.multiplyScalar(-1);
|
|
|
|
let up = getLoocAtUpVec(ref);
|
|
|
|
let up = getLoocAtUpVec(ref);
|
|
|
@ -131,10 +135,10 @@ export function angleTo(v1: Vector3, v2: Vector3, ref: Vector3 = new Vector3(0,
|
|
|
|
v1.z = 0;
|
|
|
|
v1.z = 0;
|
|
|
|
v2.z = 0;
|
|
|
|
v2.z = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (v1.equals(ZeroVec) || v2.equals(ZeroVec))
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
//法向量不能转成单位向量在判断,可能会导致原先z===0被转成大于0
|
|
|
|
let cv = new Vector3().crossVectors(v1, v2).normalize();
|
|
|
|
let cv = new Vector3().crossVectors(v1.normalize(), v2.normalize());
|
|
|
|
return cv.z === 0 ? v1.angleTo(v2) : v1.angleTo(v2) * cv.z;
|
|
|
|
return equaln(cv.z, 0) ? v1.angleTo(v2) : v1.angleTo(v2) * cv.z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function getLoocAtUpVec(dir: Vector3): Vector3
|
|
|
|
export function getLoocAtUpVec(dir: Vector3): Vector3
|
|
|
|