math engine

23
06/16/22 1 Math Engine CIS 488/588 Bruce R. Maxim UM-Dearborn

Upload: gabriel-cardenas

Post on 31-Dec-2015

22 views

Category:

Documents


0 download

DESCRIPTION

Math Engine. CIS 488/588 Bruce R. Maxim UM-Dearborn. Overview. T3DLIB1.CPP/ T3DLIB1. H globals T3DLIB2.CPP/ T3DLIB2. H I/O, joystick, music, keyboard T3DLIB3.CPP/ T3DLIB3. H sound, music T3DLIB4.CPP/ T3DLIB4. H math engine (depends on T3DLIB1) External Libraries - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Math Engine

04/19/23 1

Math Engine

CIS 488/588

Bruce R. Maxim

UM-Dearborn

Page 2: Math Engine

04/19/23 2

Overview

• T3DLIB1.CPP/ T3DLIB1. H– globals

• T3DLIB2.CPP/ T3DLIB2. H– I/O, joystick, music, keyboard

• T3DLIB3.CPP/ T3DLIB3. H– sound, music

• T3DLIB4.CPP/ T3DLIB4. H– math engine (depends on T3DLIB1)

• External Libraries– DDRAW.LIB, DSOUND.LIB, DINPUT.LIB, DINPUT8.LIB

Page 3: Math Engine

04/19/23 3

Conventions Used

• When functions are updated without changing the interface number added to name (e.g. Multiply2( ) )

• Class/structure name will be used as part of the descriptive function name

• Class/structure names and defines will be all uppercase

• There is no exception handling in the library functions (its up to you to add it)

Page 4: Math Engine

04/19/23 4

From LaMothe

Page 5: Math Engine

04/19/23 5

Some Types and Constants// defines for small numbers#define EPSILON_E3 (float)(1E-3) #define EPSILON_E4 (float)(1E-4) #define EPSILON_E5 (float)(1E-5)#define EPSILON_E6 (float)(1E-6)// defines for parametric line intersections#define PARM_LINE_NO_INTERSECT 0#define PARM_LINE_INTERSECT_IN_SEGMENT 1#define PARM_LINE_INTERSECT_OUT_SEGMENT 2#define PARM_LINE_INTERSECT_EVERYWHERE 3// fixed point typestypedef int FIXP16;typedef int *FIXP16_PTR;

Page 6: Math Engine

04/19/23 6

Data Types - 1

// 3D vector, point without the w typedef struct VECTOR3D_TYP{ union { float M[3]; // array indexed storage // explicit names struct { float x,y,z; }; // end struct }; // end union} VECTOR3D, POINT3D, *VECTOR3D_PTR, *POINT3D_PTR;

Page 7: Math Engine

04/19/23 7

Data Types - 2

// 4D homogenous vector, point with wtypedef struct VECTOR4D_TYP{ union { float M[4]; // array indexed storage // explicit names struct { float x,y,z,w; }; // end struct }; // end union} VECTOR4D, POINT4D, *VECTOR4D_PTR, *POINT4D_PTR;

Page 8: Math Engine

04/19/23 8

Data Types - 3

// 3D parametric line

typedef struct PARMLINE3D_TYP

{

POINT3D p0; // start point

POINT3D p1; // end point

VECTOR3D v; // direction vector of line segment

// |v|=|p0->p1|

} PARMLINE3D, *PARMLINE3D_PTR;

Page 9: Math Engine

04/19/23 9

Data Types - 4

// 3D plane

typedef struct PLANE3D_TYP

{

POINT3D p0; // point on the plane

VECTOR3D n; // normal to the plane

// (not necessarily a unit vector)

} PLANE3D, *PLANE3D_PTR;

Page 10: Math Engine

04/19/23 10

Data Types - 5

// 2x2 matrix (also need 1x2,1x3,3x2,3x3,1x4,4x4,4x3)typedef struct MATRIX2X2_TYP{ union { float M[2][2]; // array indexed data storage struct // explicit names – row major storage { float M00, M01; float M10, M11; }; // end explicit names }; // end union} MATRIX2X2, *MATRIX2X2_PTR;

Page 11: Math Engine

04/19/23 11

Data Types - 6typedef struct QUAT_TYP // 4d quaternion{ union { // array indexed storage w,x,y,z order float M[4]; // vector part, real part format struct { float q0; // the real part VECTOR3D qv; // the imaginary part xi+yj+zk }; struct { float w,x,y,z;}; }; // end union} QUAT, *QUAT_PTR;

Page 12: Math Engine

04/19/23 12

Quaternion Access

QUAT q = {1, 1, 2, 3};

q.w = 5; // access with explicit name

q.q0 = 5; // access with real/float vector name

q.M[0] = 5; // access with array name

Page 13: Math Engine

04/19/23 13

Data Types - 6

// 3D cylindrical coordinates

typedef struct CYLINDRICAL3D_TYP

{

float r; // radi of the point

float theta; // angle in degrees about z axis

float z; // the z-height of the point

} CYLINDRICAL3D, *CYLINDRICAL3D_PTR;

Page 14: Math Engine

04/19/23 14

Data Types - 7

// 3D spherical coordinates

typedef struct SPHERICAL3D_TYP

{

float p; // rho, distance to point from origin

float theta; // angle from z-axis and line

// segment o->p

float phi; // angle from projection of o->p

// onto x-y plane and x-axis

} SPHERICAL3D, *SPHERICAL3D_PTR;

Page 15: Math Engine

04/19/23 15

Macros and In-line Functions - 1

• Pages 384-395 list several macros and in-line functions

• The reason for going in this direction is to improve performance by eliminating the overhead associated with function calls

• They improve the readability and write ability of the source code

• The actual source code must be available at compile time to any function using them

Page 16: Math Engine

04/19/23 16

Macros and In-line Functions - 2

// convert integer and float to fixed point 16.16

#define INT_TO_FIXP16(i) ((i) << FIXP16_SHIFT)

#define FLOAT_TO_FIXP16(f)

(((float)(f) * (float)FIXP16_MAG+0.5))

// convert fixed point to float

#define FIXP16_TO_FLOAT(fp)

(((float)fp)/FIXP16_MAG)

// extract whole part and decimal part from a

// fixed point 16.16

#define FIXP16_WP(fp) ((fp) >> FIXP16_SHIFT)

#define FIXP16_DP(fp) ((fp) && FIXP16_DP_MASK)

Page 17: Math Engine

04/19/23 17

Macros and In-line Functions - 3

// some quaternion macros

inline void QUAT_ZERO(QUAT_PTR q)

{(q)->x = (q)->y = (q)->z = (q)->w = 0.0;}

  

inline void QUAT_INIT(QUAT_PTR qdst, QUAT_PTR qsrc)

{(qdst)->w = (qsrc)->w; (qdst)->x = (qsrc)->x;

(qdst)->y = (qsrc)->y; (qdst)->z = (qsrc)->z; }

 

inline void QUAT_COPY(QUAT_PTR qdst, QUAT_PTR qsrc)

{(qdst)->x = (qsrc)->x; (qdst)->y = (qsrc)->y;

(qdst)->z = (qsrc)->z; (qdst)->w = (qsrc)->w; }

Page 18: Math Engine

04/19/23 18

Function Prototypes

• Pages 395-468 contains the function prototypes and Math engine API listing

• There a dozens of prototypes and functions described in this section

• Obviously this where functions for initializion, operations, and type conversions are defined for each data type

Page 19: Math Engine

04/19/23 19

Only Globals Used

// from T3DLIB1.CPP and T3DLIB1.H

// trig value look up tables populated by a

// single call to Build_Sin_Cos_Tables( )

extern float cos_look[361]; // 0 to 360 inclusive

extern float cos_look[361]; // 0 to 360 inclusive

Page 20: Math Engine

04/19/23 20

Fast_Sin

// from T3DLIB.CPP and T3DLIB.H

// trig value look up tables populated by a

// single call to Build_Sin_Cos_Tables( )

extern float cos_look[361]; // 0 to 360 inclusive

extern float cos_look[361]; // 0 to 360 inclusive

// Fast_Sin and Fast_Cos are also defined in

// T3DLIB.CPP and T3DLIB.H using degree values

// for theta

float Fast_Sin(float theta);

float Fast_Cos(float theta);

Page 21: Math Engine

04/19/23 21

Other Routine

• Fixed-point mathematics support comes from T3DLIB1.CPP and T3DLIB1.H and is reviewed on pages 458-464

• The equation solving routines are new and appear on pages 464-468

• FPU programming needs to be done using the in-line assembly language programming to hand-optimize code produced by VC++ (described on pages 468-488)

Page 22: Math Engine

04/19/23 22

Using the Math Engine

• The new Game Console is TD3DCONSOLE3.CPP

• The only change from TD3DCONSOLE2.CPP is the addition of the include#include “T3DLIB4.h”

• There are lots of includes in the older version of the Game Console

Page 23: Math Engine

04/19/23 23

Demo Program

• Use text interfaces to exercise the following processes– 2D parametric line intersection tester– 3D half-space tester– 3D parametric line intersection tester– Quaternion operations– Fixed-point number operations– 2D Linear System Solver