增加求2向量夹角的方法.

pull/2/head
ChenX 7 years ago
parent a2cc75b709
commit 6f437635dd

@ -0,0 +1,32 @@
import { angleTo } from '../../src/Geometry/GeUtils';
test('俯视图', () =>
{
//-0.5pi 逆时针
let v = angleTo(new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1)) //?
expect(v).toEqual(Math.PI * -0.5)
//-0.5pi 顺时针
let v2 = angleTo(new Vector3(0, 1, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1)) //?
expect(v2).toEqual(Math.PI * 0.5)
});
test('仰视', () =>
{
//-0.5pi 顺时针
let v = angleTo(new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, -1)) //?
expect(v).toEqual(Math.PI * 0.5)
});
test('右视图', () =>
{
let v = angleTo(new Vector3(0, 0, 1), new Vector3(0, 1, 0), new Vector3(1, 0, 0)) //?
expect(v).toEqual(Math.PI * 0.5)
v = angleTo(new Vector3(0, 1, 0), new Vector3(0, 0, 1), new Vector3(1, 0, 0)) //?
expect(v).toEqual(Math.PI * -0.5)
});
test('0向量', () =>
{
let v = angleTo(new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(1, 0, 0)) //?
expect(v).toEqual(0)
});

@ -37,6 +37,35 @@ export function angle(v: THREE.Vector3, an: number, dis: number)
v.y += Math.sin(an) * dis;
}
/**
* ,,
*
* @param {THREE.Vector3} v1
* @param {THREE.Vector3} v2
* @param {THREE.Vector3} [ref] ,0,0,1
* @returns
*/
export function angleTo(v1: THREE.Vector3, v2: THREE.Vector3, ref: THREE.Vector3)
{
if (!ref.equals(new Vector3(0, 0, 1)))
{
//任意轴坐标系. 使用相机的构造矩阵.
ref.multiplyScalar(-1);
let up = getLoocAtUpVec(ref);
let refOcs = new THREE.Matrix4();
refOcs.lookAt(cZeroVec, ref, up);
let refOcsInv = new THREE.Matrix4().getInverse(refOcs);
v1.applyMatrix4(refOcsInv);
v2.applyMatrix4(refOcsInv);
v1.z = 0;
v2.z = 0;
}
if (v1.equals(cZeroVec) || v2.equals(cZeroVec))
return 0;
let cv = new Vector3().crossVectors(v1, v2).normalize();
return -cv.z * v1.angleTo(v2);
}
export function getLoocAtUpVec(dir: THREE.Vector3): THREE.Vector3
{
if (dir.equals(cZeroVec))

Loading…
Cancel
Save