forked from pmndrs/cannon-es
/
Transform.ts
103 lines (90 loc) 路 2.32 KB
/
Transform.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import { Vec3 } from '../math/Vec3'
import { Quaternion } from '../math/Quaternion'
export type TransformOptions = ConstructorParameters<typeof Transform>[0]
/**
* Transformation utilities.
*/
export class Transform {
/**
* position
*/
position: Vec3
/**
* quaternion
*/
quaternion: Quaternion
constructor(
options: {
/**
* position
*/
position?: Vec3
/**
* quaternion
*/
quaternion?: Quaternion
} = {}
) {
this.position = new Vec3()
this.quaternion = new Quaternion()
if (options.position) {
this.position.copy(options.position)
}
if (options.quaternion) {
this.quaternion.copy(options.quaternion)
}
}
/**
* Get a global point in local transform coordinates.
*/
pointToLocal(worldPoint: Vec3, result?: Vec3): Vec3 {
return Transform.pointToLocalFrame(this.position, this.quaternion, worldPoint, result)
}
/**
* Get a local point in global transform coordinates.
*/
pointToWorld(localPoint: Vec3, result?: Vec3): Vec3 {
return Transform.pointToWorldFrame(this.position, this.quaternion, localPoint, result)
}
/**
* vectorToWorldFrame
*/
vectorToWorldFrame(localVector: Vec3, result = new Vec3()): Vec3 {
this.quaternion.vmult(localVector, result)
return result
}
/**
* pointToLocalFrame
*/
static pointToLocalFrame(position: Vec3, quaternion: Quaternion, worldPoint: Vec3, result = new Vec3()): Vec3 {
worldPoint.vsub(position, result)
quaternion.conjugate(tmpQuat)
tmpQuat.vmult(result, result)
return result
}
/**
* pointToWorldFrame
*/
static pointToWorldFrame(position: Vec3, quaternion: Quaternion, localPoint: Vec3, result = new Vec3()): Vec3 {
quaternion.vmult(localPoint, result)
result.vadd(position, result)
return result
}
/**
* vectorToWorldFrame
*/
static vectorToWorldFrame(quaternion: Quaternion, localVector: Vec3, result = new Vec3()): Vec3 {
quaternion.vmult(localVector, result)
return result
}
/**
* vectorToLocalFrame
*/
static vectorToLocalFrame(position: Vec3, quaternion: Quaternion, worldVector: Vec3, result = new Vec3()): Vec3 {
quaternion.w *= -1
quaternion.vmult(worldVector, result)
quaternion.w *= -1
return result
}
}
const tmpQuat = new Quaternion()