|
|
Line 92: |
Line 92: |
| {{OBDtr|0x1C|int32|FF00C8|00 00 00 00 |0 |elapsed time in frames}} | | {{OBDtr|0x1C|int32|FF00C8|00 00 00 00 |0 |elapsed time in frames}} |
| |} | | |} |
| | |
| | Object animations are used to animate [[OBD:OBOA|objects]] (doors included), [[OBD:TRIG|triggers]] and cameras. Object animations may be referenced from OBOA but they can also be set using env_setanim script command. Camera animations are never referenced from data files, they're started from script using cm_anim/cm_interpolate. Because of this the only way to tell if an animation is intended for camera or for an object is to look at the level scripts. |
|
| |
|
| ;Transform matrices | | ;Transform matrices |
Revision as of 09:17, 22 November 2012
|
|
|
Offset |
Type |
Raw Hex |
Value |
Description
|
0x00 |
res_id |
01 86 00 00 |
134 |
00134-Blackvan_FB.OBAN
|
0x04 |
lev_id |
01 00 00 06 |
3 |
level 3
|
0x08 |
char[12] |
00 00 00 00 |
0 |
padding
|
0x14 |
int32 |
00 00 00 00 |
0 |
flags; used values:
- 0x01 00 00 00 - loop animation normally
- 0x02 00 00 00 - loop animation back to back
- 0x04 00 00 00 - select start frame randomly
- 0x08 00 00 00 - autostart animation (after an animated object is created)
- 0x10 00 00 00 - local animation; this animation does not contain world positioning information, the object position is determined by the origin matrix in OBOA; local animations also use a Z-up coordinate system
|
0x18 |
matrix |
C2 F5 E8 3F |
AB D7 AA B3 |
EC 89 13 35
|
EC 89 13 35 |
ED 89 13 B4 |
C2 F5 E8 BF
|
B1 D7 AA 33 |
C2 F5 E8 3F |
EB 89 13 B4
|
6B 9A 94 44 |
97 FD 5B C2 |
5D 06 DA C2
|
|
1.819999 |
-7.955471e-8 |
5.496247e-7
|
5.496247e-7 |
-1.374061e-7 |
-1.819999
|
7.955475e-8 |
1.819999 |
-1.374061e-7
|
1188.825561 |
-54.997646 |
-109.012428
|
|
initial position transform matrix
|
0x48 |
matrix |
C2 F5 E8 3F |
00 00 00 00 |
00 00 00 00
|
00 00 00 00 |
C2 F5 E8 3F |
00 00 00 00
|
00 00 00 00 |
00 00 00 00 |
C2 F5 E8 3F
|
00 00 00 00 |
00 00 00 00 |
00 00 00 00
|
|
1.819999 |
0.0 |
0.0
|
0.0 |
1.819999 |
0.0
|
0.0 |
0.0 |
1.819999
|
0.0 |
0.0 |
0.0
|
|
fixed transform matrix
|
0x78 |
int16 |
50 00 |
80 |
fubared animation frame length (in 1/60 seconds); does not work
|
0x7A |
int16 |
F5 01 |
501 |
animation length in frames
|
0x7C |
int16 |
00 00 |
0 |
stop frame for the first "half" of the animation; used by door animations to distinguish between open and close sequences
|
0x7E |
int16 |
65 00 |
101 |
101 keyframes in array
|
First keyframe (black outline)
|
0x00 |
quaternion |
F4 04 35 BF |
6A 19 C4 B3 |
CE 3C 03 B4 |
F3 04 35 BF
|
|
-0.7071068 |
-9.131584e-8 |
-1.222244e-7 |
-0.7071067
|
|
object rotation
|
0x10 |
vector |
C2 F5 E8 3F |
AB D7 AA B3 |
EC 89 13 35
|
|
1188.825561 |
-54.997646 |
-109.012428
|
|
object position
|
0x1C |
int32 |
00 00 00 00 |
0 |
elapsed time in frames
|
Object animations are used to animate objects (doors included), triggers and cameras. Object animations may be referenced from OBOA but they can also be set using env_setanim script command. Camera animations are never referenced from data files, they're started from script using cm_anim/cm_interpolate. Because of this the only way to tell if an animation is intended for camera or for an object is to look at the level scripts.
- Transform matrices
- Like all matrices in Oni, they are composed of 3 vectors defining rotation/scaling/shearing and a 4th vector defining a translation.
- In the above table the 4 vectors are presented as rows (Direct 3D convention), although OpenGL and Oni use them as columns.
- Affine transformations use a 4x4 matrix with 4 extra coefficients (in the presentation above, one would add one column on the right):
- three projection transform coefficients (all of them are zero here); one final coefficient (always 1.0 for an affine transform matrix).
- Alternatively, one can think of the 3x4 matrix as a 3x3 rotation/scaling matrix and a position vector
- Let X=(x, y, z) be the position of a vertex in the M3GM
- Let M=(m11, m21, m31; m12, m22, m32; m13, m23, m33) be the 3x3 matrix
- Let R=(m14, m24, m34) be the translation vector
- Then the absolute position of the vertex in the 3D world will be: X M + R
- (left multiplication is used because of the row-major notation above)
- Initial transform matrix
- It is used to position the object in the environment before the animation is played, it coresponds to the first animation frame.
- When the animation is played, they use the fixed transform matrix and a quaternion.
- Fixed transform matrix
- This transformation is applied before the quaternion+position transform at every keyframe.
- The only transform that can't be handled by the quaternion+position is scaling/mirroring.
- Thus, the fixed transform is a scaling matrix most of the time (no rotation or translation).
- In the above example, the fixed transform scales the van up by 1.82 (along all three axes).
- Quaternions
- Those are used in Oni whenever interpolation of 3D rotation is involved (e.g., TRAM rotation)
- In this case, rotation at intermediate frames is interpolated from the keyframe quaternions.