User:QQuix/Distances and Angles

From the Oblivion ConstructionSet Wiki
Jump to navigation Jump to search


Three angle systems[edit | edit source]

The game uses three angle ‘systems’:

World Angle[edit | edit source]

Range – 0-360 - 0 degrees is up, increasing clockwise up to 360. (e.g: 90 = Right, 180 = Down, 270 = Left).

This is the most common. It is the angle you find in the CS for Reference Rotation.

This type of angle is returned by: GetAngle Z, GetStartingAngle

This type of angle must be provided for: SetAngle Z

Heading Angle[edit | edit source]

Range – -180 to +180 - 0 degrees is up, increasing clockwise up to 180 and decreasing counterclockwise down to -180. (e.g: 90 = Right, 180 = Down, -90 = Left, -180 = Down).

This is used to tell how a second object is positioned in relation to a first object heading

This type of angle is returned by: GetHeadingAngle

Trigonometric Angle[edit | edit source]

Range – 0 to 360 - 0 degrees is right, increasing counterclockwise up to 360. (e.g: 90 = Up, 180 = Left, 270 = Down). This is the standard trigonometric angle system.

This type of angle must be provided for OBSE trigonometric functions: Sin, Cos, Tan, etc

Sample code (2D)[edit | edit source]

DeltaX & DeltaY from Angle and distance[edit | edit source]

Useful when positioning an object at a given distance and angle from another object

;=================================
; Get:  DeltaX and DeltaY
; From:	Angle and distance
;=================================
set xAngle to xxx
set xDistance to xxx
if  xAngle <= 90
  set xxTrigAngle  to 90 - xAngle
else
  set xxTrigAngle to 450 - xAngle
endif 
set xDeltaX to xDistance * cos xxTrigAngle 
set xDeltaY to xDistance * sin xxTrigAngle 

Angle and distance from DeltaX & DeltaY[edit | edit source]

Useful to calculate the horizontal (2D) distance between two objects or in situations where GetDistance is not reliable.

Useful to calculate the heading angle in situations where GetHeadingAngle is not reliable (non-actors).

;=================================
; Get:  Angle and distance
; From: DeltaX and DeltaY
;=================================
set xAngle to atan2 xDeltaX xDeltaY   	;	returns -180 to +180
if xAngle  < 0
  set xAngle to xAngle + 360   		;	convert to 0-360
endif

set xDistance to ( xDeltaX * xDeltaX ) + ( xDeltaY * xDeltaY )
set xDistance to sqrt xDistance

Adding two angles[edit | edit source]

Self explanatory

;=================================
; Get:  Angle 
; From: Adding two angles
;=================================
set xAngle to xAngleA + xAngleB
if xAngle > 360
  set xAngle to xAngle - 360
endif
if xAngle < 0
  set xAngle to xAngle + 360
endif

Sample code (3D)[edit | edit source]

WIP


TO DO:

  • 3D
  • Turn into User Functions